一个例子
前提:有三个任务,优先级为4、5、6,并且优先级最低的最先运行,同时三个任务都会使用同一个信号量,信号量初始值为1.
第1步:信号量被创建,cnt=1,这时候任务就绪列表为空,信号量等待列表为空。
第2步:任务6开始执行,试图获得信号量由于cnt为1,所以会得到信号量得到后cnt减一变为0,这时候任务就绪列表为6,信号量等待列表为空。
第3步:任务5中断6开始执行,任务5也试图获得信号量由于cnt=0任务5必须等待,信号量等待列表加入5,这时候任务就绪列表为6,信号量等待列表为5。
第4步:更高优先级的任务4中断6开始执行也在等待同一信号量,信号量等待列表加入4,这时候任务就绪列表为6,信号量等待列表为4、5。
第5步:任务6释放信号量,由于存在等待任务,所以让等待列表中优先级最高的任务进入就绪列表,重新调度,任务4运行,这时候任务就绪列表为4,信号量等待列表为5。
第6步:任务4得到了信号量开始执行,执行过程中会释放信号量,这样任务5也进入了就绪列表,重新调度仍然优先级高的任务4运行,这时候任务就绪列表为4、5,信号量等待列表为空。
第7步:任务4运行后任务5有机会运行,任务5释放信号量,由于已经没有任务在等待该信号量所以直接让cnt加一,cnt=1,信号量回到了初始状态,这时候任务就绪列表为空,信号量等待列表为空。
相关文章
- ucos实时操作系统学习笔记——任务间通信(信号量)
- 嵌入式学习37-TCP并发模型-有限 2.IO模型: 1.阻塞IO: 没有数据到来时,可以让任务挂起 节省CPU资源开销,提高系统效率 2.非阻塞IO: 程序未接收到数据时一直执行 效率很低 3.异步IO 只能绑定一个文件描述符用来 读取数据 4.多路复用IO select 1.select监听的集合中的文件描述符有 上限限制 2.select有 内核层 向 用户层数据空间 拷贝 的过程,占用系统资源开销 3.select必须 轮询检测 产生 事件 的文件描述符 4.select 只能工作 在 水平触发 模式(低速模式) 无法工作 在 边沿触发 模式(高速模式) poll (监听的集合中的文件描述符有 没有上限限制) 1.poll有 内核层 向 用户层 数据空间 拷贝 的过程,占用系统资源开销 2.poll必须 轮询检测 产生 事件 的文件描述符 3.poll 只能工作在水平触发模式(低速模式) 与select相同 无法工作在边沿触发(高速模式) 3.函数接口: 1.select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能: select 监听 文件描述符集合 中 是否 有文件描述编程 ready状态 select 监听 文件描述符集合 中 ,若有状态 , 将没有ready状态的T除 若无状态,将阻塞继续等待 参数: nfds: 最大文件描述符的值 +1 readfds: 读 文件描述符集合 writefds: 写 文件描述符集合 exceptfds: 其余 文件描述符集合 timeout: 等待的时长 NULL 一直等待(超时处理) 返回值: 成功 返回 文件描述符集合中 的 文件描述符个数 失败 返回 -1 void FD_CLR (int fd, fd_set *set); 功能: 将文件描述符 fd 从集合中清除
- 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”) - Ansersion
- ucos实时操作系统学习笔记——任务间通信(信号量)
- 我需要一个30秒倒计时的定时器,最好能触发多个任务,求大虾帮忙!
- 程序中有多个任务,每个任务都采用一个线程来处理,每隔一定时间重复执行。求帮忙。
- 在linux下利用信号量实现一个写者线程多个读者线程
- 多线程下一个线程等待其他多个线程处理完成的问题
- Celery从同一个功能创建多个任务
- 如果有多个任务可用,SSIS如何决定下一个要执行的任务