口第五章 任务管理与调度 主要内容 口任务 口任务管理 口任务调度 口优先级反转
1 第五章 任务管理与调度 主要内容 任务 任务管理 任务调度 优先级反转
High Priority Task Task Each Task Importance Event Event Task Low Priority Task Task nfinite Loop Splitting an application into Tasks Task demo based on ucos / Initialize uCOs- //Create eate(TestTaskl, (void *)11, &TestTaskstk1 [TASK STK SIZE], 11)i // start multitasking return void TestTaskl(void *pdata) printf("84u:*★* Test Task1 First ca11★★n", OSTime) OSTaskCreate(T (void *)22, &TestTaskstk2 [TASK STK SIZE], 22) *) 10, &TestTaskstk3[TASK STK SIZE], 10) while (1) printf("84u:*★ Test Task11**★n”, OSTime); OSTimeDly (1)
2 High Priority Task Low Priority Task Task Task Task Task Task Task Event Event Each Task Infinite Loop Importance Splitting an application into Tasks Splitting an application into Tasks int main(void) { // Initialize uCOS-II. OSInit(); // Create the first task OSTaskCreate(TestTask1, (void *) 11, &TestTaskStk1[TASK_STK_SIZE], 11); // Start multitasking. OSStart(); return 0; } void TestTask1(void *pdata) { printf("%4u: ***** Test Task 1 First call *****\n", OSTime); //Create 3 other tasks OSTaskCreate(TestTask2, (void *) 22, &TestTaskStk2[TASK_STK_SIZE], 22); OSTaskCreate(TestTask3, (void *) 33, &TestTaskStk3[TASK_STK_SIZE], 33); OSTaskCreate(TestTask4, (void *) 10, &TestTaskStk3[TASK_STK_SIZE], 10); while (1) { printf("%4u: ***** Test Task 11 *****\n", OSTime); OSTimeDly(1); } } Task demo based on Task demo based on ucOS
void TestTask2(void *pdata while (1) printf("84u:★★★★ Test Task22*★n",Oime); OSTimeDly(1) void TestTask3(void *pdata) while (1) printf("84u:*★★★ Test Task33★★\n", OSTime) void TestTask4(void *pdata) while printf("s4u: ++++ Test Task 10 askSuspend (10)://suspend yourself 程序运行结是 采用多任务的好处 令任务的规模较小 每个任务更容易编码和调试,其质量也更容易得到 保证 不少应用本身就是由多个任务构成的 如一个应用可能需要进行以下任务的处理:计算 从网络获取数据和刷新显示屏幕 采用多任务的处理方式是应用问题的一个非常自然 的解决方式 任务之间具有较高的独立性,耦合性小 通过增加新的任务就能方便的扩充系统功能 今实时性强 保证紧急事件得到优先处理成为可能
3 void TestTask2(void *pdata) { while (1) { printf("%4u: ***** Test Task 22 *****\n", OSTime); OSTimeDly(1); } } void TestTask3(void *pdata) { while (1) { printf("%4u: ***** Test Task 33 *****\n", OSTime); OSTimeDly(1); } } void TestTask4(void *pdata) { while (1) { printf("%4u: +++++ Test Task 10 +++++\n", OSTime); OSTaskSuspend(10); //Suspend yourself } } 程序运行结果 采用多任务的好处: 任务的规模较小 • 每个任务更容易编码和调试,其质量也更容易得到 保证 不少应用本身就是由多个任务构成的 • 如一个应用可能需要进行以下任务的处理:计算、 从网络获取数据和刷新显示屏幕 • 采用多任务的处理方式是应用问题的一个非常自然 的解决方式 任务之间具有较高的独立性,耦合性小 • 通过增加新的任务就能方便的扩充系统功能 实时性强 • 保证紧急事件得到优先处理成为可能
口在嵌入式实时系统中 任务(task)通常为进程( process)和线程 )的统称 ◆任务是调度的基本单位 口进程最初由 Multics的设计者在60年代提出来 的,主要包括以下内容 今一个正在执行的程序; 令计算机中正在运行的程序的一个实例 心可以分配给处理器,并由处理器执行的一个实体; ◆由一个顺序的执行线程、一个当前状态和一组相关 的系统资源所刻画的活动单元。 口进程由代码、数据、堆栈和进程控制块构成 令进程控制块包含了操作系统用来控制进程所需要的 信息 进程状态、CPL寄存器、调度信息、内存管理信息、IO 状态信息等 口早期的进程,包含了以下两个方面的内容: 令资源。进程是资源分配的基本单位 进程包 括一个保存进程映像的虚 址空间、主存、IO 设备和文件等资源。 调度执行。进程作为操作系统的调度实体,是调 度的基本单位 口随着操作系统的发展,进程所包含的两个方 面的内容逐淅被分开: 今轻量级进程或线程:调度执行的单位 进程:资源分配的单位 今线程是进程内部一个相对独立的控制流,由线程 上下文和需要执行的一段程序指令构成 令在进程中,所有线程共享该进程的状态和资源, 可以访问相同的数据
4 在嵌入式实时系统中 任务(task)通常为进程(process)和线程 (thread)的统称 任务是调度的基本单位 进程最初由Multics的设计者在60年代提出来 的,主要包括以下内容: 一个正在执行的程序; 计算机中正在运行的程序的一个实例; 可以分配给处理器,并由处理器执行的一个实体; 由一个顺序的执行线程、一个当前状态和一组相关 的系统资源所刻画的活动单元。 进程由代码、数据、堆栈和进程控制块构成。 进程控制块包含了操作系统用来控制进程所需要的 信息: • 进程状态、CPU寄存器、调度信息、内存管理信息、I/O 状态信息等 早期的进程,包含了以下两个方面的内容: 资源。进程是资源分配的基本单位,一个进程包 括一个保存进程映像的虚拟地址空间、主存、I/O 设备和文件等资源。 调度执行。进程作为操作系统的调度实体,是调 度的基本单位。 随着操作系统的发展,进程所包含的两个方 面的内容逐渐被分开: 轻量级进程或线程:调度执行的单位 进程:资源分配的单位 线程是进程内部一个相对独立的控制流,由线程 上下文和需要执行的一段程序指令构成 在进程中,所有线程共享该进程的状态和资源, 可以访问相同的数据
口使用线程的优势: 令创建:在一个已有进程中创建一个新线程比 创建一个全新的进程所需的时间开销少; 令终止:终止一个线程比终止一个进程所花费 的时间少 令切换:线程切换比进程切换所花费的时间 少 令通信:使同一进程内部不同线程之间的通信 效率得到显著提高。 在大多数操作系统中,不同进程之间的通信需要 内核的干预,而同一进程内部不同线程之间则可 直接通信 口引入线程的概念后,可把进程和线程的 使用分为以下几种模型: 今单进程/单线程模型(如MS-DOS):整个 系统只有一个进程、一个线程 冷单进程/多线程模型(如Java虚拟机):在 单进程/多线程模型中,整个系统有一个进 程、多个线程 今多进程/单线程模型(如传统的UNIX):在 多进程单线程模型中,整个系统有多个进 程,每个进程只有一个线程 今多进程/多线程模型(如 Windows nt Solaris、Mach等):在多进程/多线程模型 系统有多个进程,每个进程又可包含多 线程
5 使用线程的优势: 创建:在一个已有进程中创建一个新线程比 创建一个全新的进程所需的时间开销少; 终止:终止一个线程比终止一个进程所花费 的时间少; 切换:线程切换比进程切换所花费的时间 少; 通信:使同一进程内部不同线程之间的通信 效率得到显著提高。 • 在大多数操作系统中,不同进程之间的通信需要 内核的干预,而同一进程内部不同线程之间则可 直接通信。 引入线程的概念后,可把进程和线程的 使用分为以下几种模型: 单进程/单线程模型(如MS-DOS):整个 系统只有一个进程、一个线程 单进程/多线程模型(如Java虚拟机):在 单进程/多线程模型中,整个系统有一个进 程、多个线程 多进程/单线程模型(如传统的UNIX):在 多进程/单线程模型中,整个系统有多个进 程,每个进程只有一个线程 多进程/多线程模型(如Windows NT、 Solaris、Mach等):在多进程/多线程模型 中,系统有多个进程,每个进程又可包含多 个线程
单遗程/单缄程樸型 单进程/多程模型 多进程/单戴程模型 多进程多线程模型 口大多数实时内核:单进程/多线程模型, 或筒单地称为任务模型 ◆把整个应用当作一个没有定义的进程来对 待; ◆应用则被划分为多个任务的形式来进行处 理 口也有一些嵌入式实时操作系统采用了多 进程/多线程模型 令系统中包含多个进程,每个进程对应又包含 多个线程 今多进程/多线程模型适合于处理复杂的应用 任务模型则适用于实时性要求较高的、相对 简单的应用
6 单进程/单线程模型 单进程/多线程模型 多进程/单线程模型 多进程/多线程模型 大多数实时内核:单进程/多线程模型, 或简单地称为任务模型 把整个应用当作一个没有定义的进程来对 待; 应用则被划分为多个任务的形式来进行处 理。 也有一些嵌入式实时操作系统采用了多 进程/多线程模型: 系统中包含多个进程,每个进程对应又包含 多个线程 多进程/多线程模型适合于处理复杂的应用 任务模型则适用于实时性要求较高的、相对 简单的应用
第一节 任务 务的定义及其玉特 任务的内容 任务的分粪 任务参 任务的定义及其主要特性 口任务 具有独立功能的无限循环的程序段 活动,是实时内核调度的单位,其 有以 心动态性:任务状态是不断变化的 般分为就绪态、运行态和等待态 在多任务系统中,任务的状态将随着系统的需要不断进行 今并行性 系统中同时存在多个任务,这些任务在宏观上是同时运行 今异步独立性 每个任务各自按相互独立的不可预知的速度运行,走走停 多任务运行情况
7 第一节 任 务 任务的定义及其主要特性 任务的内容 任务的分类 任务参数 任务的定义及其主要特性 任务是一个具有独立功能的无限循环的程序段 的一次运行活动,是实时内核调度的单位,具 有以下特性: 动态性:任务状态是不断变化的。 • 一般分为就绪态、运行态和等待态。 • 在多任务系统中,任务的状态将随着系统的需要不断进行 变化。 并行性: • 系统中同时存在多个任务,这些任务在宏观上是同时运行 的。 异步独立性: • 每个任务各自按相互独立的不可预知的速度运行,走走停 停。 多任务运行情况
任务的内容 口任务主要包含以下内容: 今代码:一段可执行的程序 数据:程序所需要的相关数据(变量、工作 空间、缓冲区等 令堆栈 令程序执行的上下文环境 任务的内容 口任务所包含的程序通常为一个具有无限 循环的程序 /ioTask implements data obtaining and handling continuously*/ void io Task( void) int data initial; .The following sentences get data and handle data continuously */ while(TRUe)
8 任务的内容 任务主要包含以下内容: 代码:一段可执行的程序 数据:程序所需要的相关数据(变量、工作 空间、缓冲区等) 堆栈 程序执行的上下文环境 任务的内容 任务所包含的程序通常为一个具有无限 循环的程序 /*ioTask implements data obtaining and handling continuously*/ void ioTask(void) { int data; initial(); /*The following sentences get data and handle data continuously*/ while(TRUE) { data = getData(); handleData(data); } } /*ioTask implements data obtaining and handling continuously*/ void ioTask(void) { int data; initial(); /*The following sentences get data and handle data continuously*/ while(TRUE) { data = getData(); handleData(data); } }
void Your Task (void *pdata) for (:i)4 Call one of uC/Os-II's services STaskDel (OS PRIO SELE) d(OS PRIO SELF) void Your Task (void *pdata) /* USER C。DE* STaskDel (OS PRIO SELF) void TestTask2(void *pdata) while (1) printf(”84u:*★★★ Test Task22****\n", OSTime) OSTimeDly(1)i void TestTask3(void *pdata) printf("4u:*★** Test Task33★★n", OSTime) STimeDly(1)i void TestTask4(void *pdata) rinf(84 est Task 10 +++++\n", OSTime) STaskSuspend (10); //Suspend yourself
9 void YourTask (void *pdata) { for (;;){ /* USER CODE */ Call one of uC/OS-II’s services: OSFlagPend(); OSMboxPend(); OSMutexPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* USER CODE */ } } void YourTask (void *pdata) { /* USER CODE */ OSTaskDel(OS_PRIO_SELF); } void TestTask2(void *pdata) { while (1) { printf("%4u: ***** Test Task 22 *****\n", OSTime); OSTimeDly(1); } } void TestTask3(void *pdata) { while (1) { printf("%4u: ***** Test Task 33 *****\n", OSTime); OSTimeDly(1); } } void TestTask4(void *pdata) { while (1) { printf("%4u: +++++ Test Task 10 +++++\n", OSTime); OSTaskSuspend(10); //Suspend yourself } }
任务的内容 口任务与程序的区别: 令任务能真实地描述工作内容的并发性,而程 序不能; 今程序是任务的组成部分 除程序外,任务还包括数据、堆栈及其上下文环 境等内容; ◆程序是静态的,任务是动态的; 任务有生命周期,有诞生、有消亡,是短暂 的;而程序是相对长久的 今一个程序可对应多个任务,反之亦然; ◆任务具有创建其他任务的功能,而程序没 有 任务的内容 口任务上下文环境( context) 包括了实时内核管理任务、以及处理器执行 任务所需要的所有信息。 任务优先级、任务的状态等实时内核所需要的信 息,以及处理器的各种寄存器的内容 ( hardware context):程序计数器、堆栈指 针、通用寄存器等的内容 任务的上下文环境通过任务控制块(task control block,TCB)来体现
10 任务的内容 任务与程序的区别: 任务能真实地描述工作内容的并发性,而程 序不能; 程序是任务的组成部分 • 除程序外,任务还包括数据、堆栈及其上下文环 境等内容; 程序是静态的,任务是动态的; 任务有生命周期,有诞生、有消亡,是短暂 的;而程序是相对长久的; 一个程序可对应多个任务,反之亦然; 任务具有创建其他任务的功能,而程序没 有。 任务的内容 任务上下文环境(context) 包括了实时内核管理任务、以及处理器执行 任务所需要的所有信息。 • 任务优先级、任务的状态等实时内核所需要的信 息,以及处理器的各种寄存器的内容 (hardware context):程序计数器、堆栈指 针、通用寄存器等的内容 任务的上下文环境通过任务控制块(task control block,TCB)来体现