任务管理与调度(2)(第6讲)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务管理与调度(2)
讲师:张伟峰 Bill.Zhang 08~09学年第一学期第6讲
任务状态与变迁
• 任务拥有的资源情况是不断变化的,导致 任务状态也表现出不断变化的特性。 • 不同的实时内核实现方式对任务状态的定 义不尽相同,但是都可以概括为三种基本 的状态:
– 等待(waiting):任务在等待某个事件的发 生; – 就绪(ready): 任务等待获得处理器资源; – 执行(running):任务获得处理器资源,所 包含的代码内容正在被执行。
任务切换
– 高优先级任务处于就绪时 如果采用基于优先级的抢占式调度算法, 将导致当前任务停止运行,使更高优 先级的任务处于运行状态
任务上下文切换时间
保存当前运行任务上下文的时间 选择下一个任务的调度时间 将要运行任务的上下文的恢复时间
保 存
调 度
恢 复
•取决于任务上下文的定义和处理器的速 度。 •不同种类的处理器,任务上下文的定义 不同,其内容有多有少。 任务上下文切换的时间与调度(即选择下一个
INT16U OSTCBDly; /* Nbr ticks to delay task or, timeout waiting for event*/ INT8U OSTCBStat;/* Task status */
INT8U OSTCBPrio;/* Task priority (0 == highest, 63 == lowest) */
• 在任务创建时,实时内核从空闲任务控制 块链中为任务分配一个任务控制块。
– 随后对任务的操作,都是基于对应的任务控制块来进 行的。 – 当任务被删除后,对应的任务控制块又会被实时内核 回收到空闲任务控制块链。
TCB of uCOS
typedef struct os_tcb { OS_STK *OSTCBStkPtr; /* Pointer to current top of stack*/ #if OS_TASK_CREATE_EXT_EN > void *OSTCBExtPtr; for TCB extension */ OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; stack elements) */ INT16U OSTCBOpt; /* Task OSTaskCreateExt() */ INT16U OSTCBId; #endif 0 /* Pointer to user definable data /* Pointer to bottom of stack */ /* Size of task stack (in number of options as passed by /* Task ID (0..65535) */
OSTaskCreate() OSTaskCreateExt()
DORMANT (睡眠状态)
OSTaskDel()
READY
OSStart() OSIntExit() OS_TASK_SW()
Interrupt
RUNNING
OSIntExit() Task is Preempted
ISR
OSTaskDel()
struct os_tcb *OSTCBNext;/* Pointer to next TCB in the TCB list */ struct os_tcb *OSTCBPrev;/* Pointer to previous TCB in the TCB list*/
TCB of uCOS
#if ((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS _SEM_EN>0)||(OS_MUTEX_EN>0) OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */ #endif #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost()*/ #endif
任务切换
• 任务切换将导致任务状态发生变化: – – 当前正在运行的任务将由运行状态变为就绪 或是等待状态; 需要投入运行的任务则由就绪状态变为运行 状态。
任务切换
1 保存任务上下文环境
任 务 切 换 基 本 步 骤
2 更新当前运行任务的控制块内容,将其 状态改为就绪或等待状态
3 将任务控制块移到相应队列(就绪队列 或等待队列) 4 选择另一个任务进行执行(调度) 5 改变需投入运行任务的控制块内容,将 其状态变为运行状态
任务状态与变迁
• 任务会在不同的状态之间进行转换,即 任务状态的变迁
运行态
需要 资源
获得CPU 就绪态
被高优先级 任务抢占或 超时
获得资源
等待态
任务状态变迁
任务1 任务2 任务3
调度 程序
0 5 10 运行 15 20 25 等待 30 35 40 就绪 50
45
三个任务进行状态转换的过程 包含三个任务和一个调度程序。调度程序用来确定下一个 需要投入运行的任务,因此调度程序本身也需要占用一定 的处理时间。
任务状态与变迁
• 在单处理器系统中:
– 任何时候都只有一个任务在CPU中执行 • 如果没有任何事情可做,就运行空闲任务执行空 操作 – 任何一个可以执行的任务都必须处于就绪状态 • 调度程序从任务的就绪队列中选择下一个需要执 行的任务。 • 处于就绪状态的任务拥有除CPU以外的其他所有 需要的资源。 – 任务还可能处于等待状态 • 如果任务在需要等待I/O设备或其他任务提供的数 据,而数据又还没有到达该任务的情况下,就处 于等待状态
TCB of uCOS
INT8U OSTCBX;/* Bit position in group corresponding to task priority (0..7)*/ INT8U OSTCBY;/* Index into ready table corresponding to task priority */ INT8U OSTCBBitX; /* Bit mask to access bit position in ready table */ INT8U OSTCBBitY; /* Bit mask to access bit position in ready group */ #if OS_TASK_DEL_EN > 0 BOOLEAN OSTCBDelReq; delete itself */ #endif } OS_TCB;
任务1
实时内核调度程序 保存任务1的上下文到TCB1 …… 从TCB2恢复任务2的上下文
任务2
时间
保存任务2的上下文到TCB2 …… 从TCB1恢复任务1的上下文
任务1执行一段时间后,由于某种原因,需要进行任务切换,进入实时 内核的调度程序。调度程序首先把当前的上下文内容保存到任务1的任 务控制块TCB1中,然后又把任务2的上下文从TCB2中恢复到CPU寄存器, 随后任务2得到执行。任务2执行一段时间后,由于某种原因,需要进行 任务切换,进入实时内核的调度程序。调度程序首先把当前的上下文内 容保存到任务2的任务控制块TCB2中,然后又把任务1的上下文从TCB1中 恢复到CPU寄存器,随后任务1得到执行。
6 恢复需投入运行任务的上下文环境
任务切换
中断、自陷
运行任务因缺乏资源而被 阻塞 时间片轮转调度时 高优先级任务处于就绪时
任务切换 时机
任务切换
• 中断、自陷
• 如当I/O中断发生的时候 – 如果I/O活动是一个或多个任务正在等待的事 件,内核将把相应的处于等待状态的任务转换 为就绪状态 – 同时,内核还将确定是否继续执行当前处于运 行状态的任务,或是用高优先级的就绪任务抢 占该任务 • 自陷 – 由于执行任务中当前指令所引起,将导致实时 内核处理相应的错误或异常事件,并根据事件 类型,确定是否进行任务的切换
/* Indicates whether a task needs to
任务切换
• 任务切换(context switching)
– 保存当前任务的上下文,并恢复需要执行的任 务的上下文的过程。
• 当发生任务切换时:
– 当前正在运行的任务的上下文就需要通过该任 务的任务控制块保存起来; – 把需要投入运行的任务的上下文从对应的任务 控制块中恢复出来。
Task states and transition of uCOS
任务控制块
• 任务管理是通过对任务控制块(Task Control Block,TCB)的操作来实现的。 • 任务控制块是包含任务相关信息的数据结构
– 包含了任务执行过程中所需要的所有信息。
• 任务控制块大都包括以下信息:
– – – – – – 任务的名字 任务执行的起始地址 任务的优先级 任务的状态 任务的硬件上下文(堆栈指针、PC和寄存器等) 任务的队列指针等内容
WAITING
OSTaskDel()
OSMBoxPOST() OSQPost() OSQPostFront() OSSemPost() OSTASKResume() OSTimeDlyResume() OSTimeTick()
OSMBoxPend() OSQPend() OSSemPend() OSTaskSuspend() OSTimeDly() OSTimeDlyHMSM()
运行任务)的过程有关。
– 强实时内核要求调度过程所花费的时间是确定的, 即不能随系统中就绪任务的数目而变化。 – 与具体实现调度算法时所采用的数据结构有关。
任务队列
• 任务队列通过任务控制块实现对系统中所 有任务的管理。
就绪队列 新任务 调度 CPU 释放CPU
超时
等待队列 等待资源 获得资源
单就绪队列和单等待队列
任务队列
• 队列由任务控制块构成
队列 Head task name task ID task status task priority task context … task name task ID task status task priority task context … task name task ID task status task priority task context … TCB1 TCB2 TCBn
任务1
任务2
任务3 调度 程序 0 5 10 运行 15 20 25 等待 30 35 40 就绪 50
45
在时刻8即发生了任务切换,任务1的上下文需要保存到任务1的任务 控制块中去。 经过调度程序的处理,在时刻10任务2投入运行,需要把任务2的任务 控制块中关于上下文的内容恢复到CPU的寄存器中。
task name task ID task status task priority task context(registers and flags of CPU) …… 任务控制块示意图
任务控制块
• 为节约内存,任务数量通常需要进行预先 配置
– 按照配置的任务数量初始化任பைடு நூலகம்控制块,一个任务对 应一个初始的任务控制块,形成一个空闲任务控制块 链。
TCB of uCOS
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) #if OS_TASK_DEL_EN > 0 OS_FLAG_NODE *OSTCBFlagNode; /* Pointer to event flag node*/ #endif OS_FLAGS OSTCBFlagsRdy; /* Event flags that made task ready to run*/ #endif
任务切换
– 运行任务因缺乏资源而被阻塞 • 如,任务执行过程中进行I/O操作时 (如打开文件),如果此前该文件已 被其他任务打开,将导致当前任务处 于等待状态,而不能继续执行
任务切换
– 时间片轮转调度时 • 内核将在时钟中断处理程序中确定当 前正在运行的任务的执行时间是否已 经超过了设定的时间片; • 如果超过了时间片,实时内核将停止 当前任务的运行,把当前任务的状态 变为就绪状态,并把另一个任务投入 运行
讲师:张伟峰 Bill.Zhang 08~09学年第一学期第6讲
任务状态与变迁
• 任务拥有的资源情况是不断变化的,导致 任务状态也表现出不断变化的特性。 • 不同的实时内核实现方式对任务状态的定 义不尽相同,但是都可以概括为三种基本 的状态:
– 等待(waiting):任务在等待某个事件的发 生; – 就绪(ready): 任务等待获得处理器资源; – 执行(running):任务获得处理器资源,所 包含的代码内容正在被执行。
任务切换
– 高优先级任务处于就绪时 如果采用基于优先级的抢占式调度算法, 将导致当前任务停止运行,使更高优 先级的任务处于运行状态
任务上下文切换时间
保存当前运行任务上下文的时间 选择下一个任务的调度时间 将要运行任务的上下文的恢复时间
保 存
调 度
恢 复
•取决于任务上下文的定义和处理器的速 度。 •不同种类的处理器,任务上下文的定义 不同,其内容有多有少。 任务上下文切换的时间与调度(即选择下一个
INT16U OSTCBDly; /* Nbr ticks to delay task or, timeout waiting for event*/ INT8U OSTCBStat;/* Task status */
INT8U OSTCBPrio;/* Task priority (0 == highest, 63 == lowest) */
• 在任务创建时,实时内核从空闲任务控制 块链中为任务分配一个任务控制块。
– 随后对任务的操作,都是基于对应的任务控制块来进 行的。 – 当任务被删除后,对应的任务控制块又会被实时内核 回收到空闲任务控制块链。
TCB of uCOS
typedef struct os_tcb { OS_STK *OSTCBStkPtr; /* Pointer to current top of stack*/ #if OS_TASK_CREATE_EXT_EN > void *OSTCBExtPtr; for TCB extension */ OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; stack elements) */ INT16U OSTCBOpt; /* Task OSTaskCreateExt() */ INT16U OSTCBId; #endif 0 /* Pointer to user definable data /* Pointer to bottom of stack */ /* Size of task stack (in number of options as passed by /* Task ID (0..65535) */
OSTaskCreate() OSTaskCreateExt()
DORMANT (睡眠状态)
OSTaskDel()
READY
OSStart() OSIntExit() OS_TASK_SW()
Interrupt
RUNNING
OSIntExit() Task is Preempted
ISR
OSTaskDel()
struct os_tcb *OSTCBNext;/* Pointer to next TCB in the TCB list */ struct os_tcb *OSTCBPrev;/* Pointer to previous TCB in the TCB list*/
TCB of uCOS
#if ((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS _SEM_EN>0)||(OS_MUTEX_EN>0) OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */ #endif #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost()*/ #endif
任务切换
• 任务切换将导致任务状态发生变化: – – 当前正在运行的任务将由运行状态变为就绪 或是等待状态; 需要投入运行的任务则由就绪状态变为运行 状态。
任务切换
1 保存任务上下文环境
任 务 切 换 基 本 步 骤
2 更新当前运行任务的控制块内容,将其 状态改为就绪或等待状态
3 将任务控制块移到相应队列(就绪队列 或等待队列) 4 选择另一个任务进行执行(调度) 5 改变需投入运行任务的控制块内容,将 其状态变为运行状态
任务状态与变迁
• 任务会在不同的状态之间进行转换,即 任务状态的变迁
运行态
需要 资源
获得CPU 就绪态
被高优先级 任务抢占或 超时
获得资源
等待态
任务状态变迁
任务1 任务2 任务3
调度 程序
0 5 10 运行 15 20 25 等待 30 35 40 就绪 50
45
三个任务进行状态转换的过程 包含三个任务和一个调度程序。调度程序用来确定下一个 需要投入运行的任务,因此调度程序本身也需要占用一定 的处理时间。
任务状态与变迁
• 在单处理器系统中:
– 任何时候都只有一个任务在CPU中执行 • 如果没有任何事情可做,就运行空闲任务执行空 操作 – 任何一个可以执行的任务都必须处于就绪状态 • 调度程序从任务的就绪队列中选择下一个需要执 行的任务。 • 处于就绪状态的任务拥有除CPU以外的其他所有 需要的资源。 – 任务还可能处于等待状态 • 如果任务在需要等待I/O设备或其他任务提供的数 据,而数据又还没有到达该任务的情况下,就处 于等待状态
TCB of uCOS
INT8U OSTCBX;/* Bit position in group corresponding to task priority (0..7)*/ INT8U OSTCBY;/* Index into ready table corresponding to task priority */ INT8U OSTCBBitX; /* Bit mask to access bit position in ready table */ INT8U OSTCBBitY; /* Bit mask to access bit position in ready group */ #if OS_TASK_DEL_EN > 0 BOOLEAN OSTCBDelReq; delete itself */ #endif } OS_TCB;
任务1
实时内核调度程序 保存任务1的上下文到TCB1 …… 从TCB2恢复任务2的上下文
任务2
时间
保存任务2的上下文到TCB2 …… 从TCB1恢复任务1的上下文
任务1执行一段时间后,由于某种原因,需要进行任务切换,进入实时 内核的调度程序。调度程序首先把当前的上下文内容保存到任务1的任 务控制块TCB1中,然后又把任务2的上下文从TCB2中恢复到CPU寄存器, 随后任务2得到执行。任务2执行一段时间后,由于某种原因,需要进行 任务切换,进入实时内核的调度程序。调度程序首先把当前的上下文内 容保存到任务2的任务控制块TCB2中,然后又把任务1的上下文从TCB1中 恢复到CPU寄存器,随后任务1得到执行。
6 恢复需投入运行任务的上下文环境
任务切换
中断、自陷
运行任务因缺乏资源而被 阻塞 时间片轮转调度时 高优先级任务处于就绪时
任务切换 时机
任务切换
• 中断、自陷
• 如当I/O中断发生的时候 – 如果I/O活动是一个或多个任务正在等待的事 件,内核将把相应的处于等待状态的任务转换 为就绪状态 – 同时,内核还将确定是否继续执行当前处于运 行状态的任务,或是用高优先级的就绪任务抢 占该任务 • 自陷 – 由于执行任务中当前指令所引起,将导致实时 内核处理相应的错误或异常事件,并根据事件 类型,确定是否进行任务的切换
/* Indicates whether a task needs to
任务切换
• 任务切换(context switching)
– 保存当前任务的上下文,并恢复需要执行的任 务的上下文的过程。
• 当发生任务切换时:
– 当前正在运行的任务的上下文就需要通过该任 务的任务控制块保存起来; – 把需要投入运行的任务的上下文从对应的任务 控制块中恢复出来。
Task states and transition of uCOS
任务控制块
• 任务管理是通过对任务控制块(Task Control Block,TCB)的操作来实现的。 • 任务控制块是包含任务相关信息的数据结构
– 包含了任务执行过程中所需要的所有信息。
• 任务控制块大都包括以下信息:
– – – – – – 任务的名字 任务执行的起始地址 任务的优先级 任务的状态 任务的硬件上下文(堆栈指针、PC和寄存器等) 任务的队列指针等内容
WAITING
OSTaskDel()
OSMBoxPOST() OSQPost() OSQPostFront() OSSemPost() OSTASKResume() OSTimeDlyResume() OSTimeTick()
OSMBoxPend() OSQPend() OSSemPend() OSTaskSuspend() OSTimeDly() OSTimeDlyHMSM()
运行任务)的过程有关。
– 强实时内核要求调度过程所花费的时间是确定的, 即不能随系统中就绪任务的数目而变化。 – 与具体实现调度算法时所采用的数据结构有关。
任务队列
• 任务队列通过任务控制块实现对系统中所 有任务的管理。
就绪队列 新任务 调度 CPU 释放CPU
超时
等待队列 等待资源 获得资源
单就绪队列和单等待队列
任务队列
• 队列由任务控制块构成
队列 Head task name task ID task status task priority task context … task name task ID task status task priority task context … task name task ID task status task priority task context … TCB1 TCB2 TCBn
任务1
任务2
任务3 调度 程序 0 5 10 运行 15 20 25 等待 30 35 40 就绪 50
45
在时刻8即发生了任务切换,任务1的上下文需要保存到任务1的任务 控制块中去。 经过调度程序的处理,在时刻10任务2投入运行,需要把任务2的任务 控制块中关于上下文的内容恢复到CPU的寄存器中。
task name task ID task status task priority task context(registers and flags of CPU) …… 任务控制块示意图
任务控制块
• 为节约内存,任务数量通常需要进行预先 配置
– 按照配置的任务数量初始化任பைடு நூலகம்控制块,一个任务对 应一个初始的任务控制块,形成一个空闲任务控制块 链。
TCB of uCOS
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) #if OS_TASK_DEL_EN > 0 OS_FLAG_NODE *OSTCBFlagNode; /* Pointer to event flag node*/ #endif OS_FLAGS OSTCBFlagsRdy; /* Event flags that made task ready to run*/ #endif
任务切换
– 运行任务因缺乏资源而被阻塞 • 如,任务执行过程中进行I/O操作时 (如打开文件),如果此前该文件已 被其他任务打开,将导致当前任务处 于等待状态,而不能继续执行
任务切换
– 时间片轮转调度时 • 内核将在时钟中断处理程序中确定当 前正在运行的任务的执行时间是否已 经超过了设定的时间片; • 如果超过了时间片,实时内核将停止 当前任务的运行,把当前任务的状态 变为就绪状态,并把另一个任务投入 运行