3 - 任务调度算法 & 同步与互斥 &队列

之前的都是按照优先级不同允许抢占(不讲道理),不管你在做什么,轮到优先级最高的任务,直接抢占执行
怎样才能讲道理呢?稍微等等嘛,等我做完活你再做
1 支持抢占,0不支持抢占
同优先级任务是否交替执行,1交替0不交
空闲任务是否礼让其他任务
礼让的话,自己的函数逻辑在时间片内只执行一遍,然后调度
不支持抢占就行,最好是做完事情后,自觉放弃占用CPU,例:

同步
方案1: 任务A执行完毕后置标志位,任务B时刻检查这个标志位变化,这样实现互斥的话浪费CPU资源,因为两个任务优先级一样,时间片轮转,每次都要进入任务B判断下逻辑;
方案2:使用队列,新创建一个队列,任务A和B各自充当生产者和消费者,生产者运行完毕后生产一个数据放入队列,消费者监控队列,从队列获取到值的时候才执行自己的逻辑. 问:监控队列需要消耗CPU资源么
互斥:两个任务都要使用窗口打印,不等对方打印完,到了自己的时间片就直接抢占打印;
解决办法1:通过判断标志位,后面的延迟是为了让另外一个任务有机会能抢到时间片,不然的话标志位置0后又立马置1,另外的任务永远无法抢到

隐患:当任务多而且执行次数多的时候,就有几率>1个任务同时通过标志位(一个刚好过了if判断,就被切换出去【还没来得及置1】),然后两个任务轮转执行,打破互斥
解决办法2:使用队列, 队列中放一个锁(随便某个数值就行),互斥任务执行的时候需要获取这个锁,就是读取到数值,当队列中没有数值的话就进入阻塞状态,直到抢到这个锁,抢到锁之后可以执行自己的逻辑,执行完毕后再把锁放回到队列中 (距离:互斥使用串口,各自打印各自的数据,完整输出完自己的数据)
可能遇到的问题,只有后面创建的任务使用串口,原因:后面的任务释放了锁(写数据到队列),使阻塞的任务进入就绪态,但是后面的任务仍处于执行态,所以又会获得锁,循环
解决办法: 1.进入等待放弃时间片 2.主动切换任务? 问题: 怎么能保证多个互斥任务都能够有机会执行呢
小技巧: 可以把指针(4字节?)放入到队列中,然后传递指针,这样就可以利用队列传输大量数据(指针指向的地址)
队列的本质是环形buf缓冲区

创建队列,指定队列长度和每个item的大小,开始的时候头尾指针都指向第一个

写一个任务(默认写到尾部),到指针位置,然后PcwriteTo指向下一个item,等待下次写入。 若是写满的话就可以指定其等待时间(阻塞),然后将这个等待任务放到List_t xTasksWaitingToSend队列中; 有位置可以写的话再将其唤醒,【等待时间为0的话,就直接返回报错】
写指针指到最后一位,然后会回到开头(环)
可以使用指定函数写到头部
实际上是写到PcReadFrom指向的位置,然后将其指针-1,下次读的话就先读它,就相当于写数据到头部

若很多任务都在等待,那么有机会的话先唤醒谁呢? 按照优先级和等待时间来判断
常规读
需要指定:读哪个队列?读出的数据放在哪?读不到东西是否等待(等待的话就进等待的队列)
队列初始化的时候PcReadFrom指向最后一个,当开始读的时候,PcReadFrom指针+1(就指向头部)

邮箱:
长度为1的队列,新数据覆盖旧数据,读数据不会移除(橱窗),第一次调用会因为无数据而阻,一旦写入数据,以后读邮箱总能成功
队列集(列集也是队列,之前的队列里面放的是数据,队列集里面放的是队列)
、

准备条件:创建好各自的队列, 然后将各个队列与队列集产生联系,
当按下鼠标的时候,数据会到鼠标的队列中,同时,还会把鼠标的handle放入到队列集中
PS:往队列A中写N个数据,会导致写队列集N次
读队列集,先读出队列,然后从队列中读出数据 (读一次队列,读一次数据)
实际上就是队列的嵌套


8-3 OVER
3 - 任务调度算法 & 同步与互斥 &队列的更多相关文章
- 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)
上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html 现在有这篇文章: http://blog.cs ...
- 线程同步 - POSIX互斥锁
线程同步 - POSIX互斥锁 概括 本文讲解POSIX中互斥量的基本用法,从而能达到简单的线程同步.互斥量是一种特殊的变量,它有两种状态:锁定以及解锁.如果互斥量是锁定的,就有一个特定的线程持有或者 ...
- 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
- exec函数族,守护进程,线程同步和互斥
2015.3.2 进程和程序有三点不同:1,存在位置不同,程序:硬盘,磁盘.进程:内存2. 程序是静态的,进程是动态的 执行./a.out -->bash->bash程序调用fork()- ...
- Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间, ...
- C++ 11 线程的同步与互斥
这次写的线程的同步与互斥,不依赖于任何系统,完全使用了C++11标准的新特性来写的,就连线程函数都用了C++11标准的lambda表达式. /* * thread_test.cpp * * Copyr ...
- Windows下C++多线程同步与互斥简单运用
1. 互斥量,Mutex #include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI ...
- UNIX环境高级编程——线程同步之互斥量
互斥量(也称为互斥锁)出自POSIX线程标准,可以用来同步同一进程中的各个线程.当然如果一个互斥量存放在多个进程共享的某个内存区中,那么还可以通过互斥量来进行进程间的同步. 互斥量,从字面上就可以知道 ...
- java同步和互斥【用具体程序说明】
java同步和互斥[用具体程序说明] 所有对象都自动含有单一的锁,也就是所有对象都有且只有唯一的锁,所以当某个任务(线程)访问一个类A中含有sycnhronized的方法是,那么 ...
- Linux驱动之同步、互斥、阻塞的应用
同步.互斥.阻塞的概念: 同步:在并发程序设计中,各进程对公共变量的访问必须加以制约,这种制约称为同步. 互斥机制:访问共享资源的代码区叫做临界区,这里的共享资源可能被多个线程需要,但这些共享资源又不 ...
随机推荐
- C/C++ 常用开发代码片段
由于内容较少,所以,不想把它放在我的本地博客中了,暂时保存在这里,代码有一部分来源于网络,比较经典的案例,同样收藏起来. Stack 栈容器 Stack容器适配器中的数据是以LIFO的方式组织的,它是 ...
- CE修改器入门:浮点数的扫描
在前面的教程中我们使用4字节的方式进行扫描,但有些游戏使用了"浮点数"来存储数值,浮点数是带有小数点的数值(如 5.12 或 11321.1),正如本关中的健康和弹药,两者都以浮点 ...
- 在K8S中,PV和PVC是如何关联?
在Kubernetes(简称K8s)中,PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 是实现存储持久化的关键组件.它们之间的关联是用来动态或静 ...
- Android Graphics 显示系统 - 如何模拟多(物理)显示屏?
" 本着花小钱办大事,不花钱也办事的原则,为了避免花钱买设备,那如何更便捷地学习/测试Android多屏显示的内容呢?本文就给大家介绍一种模拟Android多个物理屏幕显示的方法." ...
- CF1842
A 比两边和的大小即可. B 显然如果一个数拥有的所有二进制位的 \(1\) 被包含在 \(x\) 中,选了一定不会导致不能变成 \(x\):如果有一个 \(1\),\(x\) 对应的位上是 \(0\ ...
- Power BI 2 DAY
目录 Power BI零散知识点 M函数 Power BI零散知识点 纵向合并 = 主页-组合-追加查询-追加查询(修改数据源)-将查询追加为信查询(创建新数据源) 横向合并 = 主页-组合-合并查询 ...
- NEMU PA 3-2 实验报告
一.实验目的 在上一章节我们完成了Cache的实现,但是这只是在速度上提高了取指和存取操作数的效率,而在访问的安全性上没有得到有效提升. 在PA3-2中我们要完成的,就是在NEMU中实现分段机制. 二 ...
- NC14402 求最大值
题目链接 题目 题目描述 给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)[1<=i<j<=n]的最大值. 操作次数有Q次,每次操作需要将位子p处的数 ...
- NC16498 [NOIP2014]寻找道路
题目链接 题目 题目描述 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的点都直接或间接与终点连通. 2. ...
- BasicSample项目说明
整个示例项目,两个Fragment,ProductListFragment和ProductFragment,一个MainActivity.在MainActivity里面展示的是ProductListF ...