之前的都是按照优先级不同允许抢占(不讲道理),不管你在做什么,轮到优先级最高的任务,直接抢占执行

怎样才能讲道理呢?稍微等等嘛,等我做完活你再做

  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 - 任务调度算法 & 同步与互斥 &队列的更多相关文章

  1. 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

    上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html   现在有这篇文章: http://blog.cs ...

  2. 线程同步 - POSIX互斥锁

    线程同步 - POSIX互斥锁 概括 本文讲解POSIX中互斥量的基本用法,从而能达到简单的线程同步.互斥量是一种特殊的变量,它有两种状态:锁定以及解锁.如果互斥量是锁定的,就有一个特定的线程持有或者 ...

  3. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

  4. exec函数族,守护进程,线程同步和互斥

    2015.3.2 进程和程序有三点不同:1,存在位置不同,程序:硬盘,磁盘.进程:内存2. 程序是静态的,进程是动态的 执行./a.out -->bash->bash程序调用fork()- ...

  5. Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间, ...

  6. C++ 11 线程的同步与互斥

    这次写的线程的同步与互斥,不依赖于任何系统,完全使用了C++11标准的新特性来写的,就连线程函数都用了C++11标准的lambda表达式. /* * thread_test.cpp * * Copyr ...

  7. Windows下C++多线程同步与互斥简单运用

    1.  互斥量,Mutex #include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI ...

  8. UNIX环境高级编程——线程同步之互斥量

    互斥量(也称为互斥锁)出自POSIX线程标准,可以用来同步同一进程中的各个线程.当然如果一个互斥量存放在多个进程共享的某个内存区中,那么还可以通过互斥量来进行进程间的同步. 互斥量,从字面上就可以知道 ...

  9. java同步和互斥【用具体程序说明】

    java同步和互斥[用具体程序说明]            所有对象都自动含有单一的锁,也就是所有对象都有且只有唯一的锁,所以当某个任务(线程)访问一个类A中含有sycnhronized的方法是,那么 ...

  10. Linux驱动之同步、互斥、阻塞的应用

    同步.互斥.阻塞的概念: 同步:在并发程序设计中,各进程对公共变量的访问必须加以制约,这种制约称为同步. 互斥机制:访问共享资源的代码区叫做临界区,这里的共享资源可能被多个线程需要,但这些共享资源又不 ...

随机推荐

  1. 【二】最新多智能体强化学习文章如何查阅{顶会:AAAI、 ICML }

    相关文章: [一]最新多智能体强化学习方法[总结] [二]最新多智能体强化学习文章如何查阅{顶会:AAAI. ICML } [三]多智能体强化学习(MARL)近年研究概览 {Analysis of e ...

  2. Jupyter Notebook 下 import 第三方库,显示 no module xxx 【本质是环境没有切换过来】

    1.最简单情况下 切换环境即可 首先激活环境: ​ activate env  # 激活你的环境名称 jupyter notebook ​ 之后去运行代码即可,如果还不行请看下面: 2.遇到Jupyt ...

  3. 【部署教程】基于GPT2训练了一个傻狗机器人 - By ChatGPT 技术学习

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 首先我想告诉你,从事编程开发这一行,要学会的是学习的方式方法.方向对了,才能事半功倍.而我认为 ...

  4. 取代传统BIOS的EFI和UEFI究竟是什么?

    传统的蓝白BIOS界面可以说是陪伴着很多玩家共同成长,不过在英特尔发布Sandy Bridge架构处理器的时候,传统BIOS也到了和我们说再见的时间,采用图形化界面的EFI以及UEFI很快就取代了传统 ...

  5. HarmonyOS 实战小项目开发(二)

    HarmonyOS 实战小项目开发(二) 日常逼逼叨 在上期实战项目一中,已经对于练手项目的背景,后端搭建等做了一定的简述,那么本期将结合HarmonyOS 页面搭建个人性格测试的移动端.如有一些错误 ...

  6. [Java]Map接口有关总结

    Map接口 1.HashMap和Hashtable的区别 线程安全方面.HashMap是非线程安全的,Hashtable是线程安全的.因为Hashtable内部方法基本都经过synchronized修 ...

  7. JS 数组中找到与目标值最接近的数字,记一次工作中关于二分查找的算法优化

    壹 ❀ 引 在最近的工作中,有一个任务是需要修复富文本编辑器字号显示的BUG.大概情况就是,从WPS中复制不同样式的标题.正文到到项目编辑器中,发现没办法设置选中的文本为正文:而且字体字号都显示为默认 ...

  8. webgl 系列

    webgl 背景 工作所需... 目录 初识 WebGL 绘制一个点 三角形 变换矩阵和动画 渐变三角形 绘制猫 着色器语言

  9. 基于 junit5 实现 junitperf 源码分析

    前言 上一节介绍了基于 junit4 实现 junitperf,但是可以发现定义变量的方式依然不够优雅. 那可以让用户使用起来更加自然一些吗? 有的,junit5 为我们带来了更加强大的功能. 拓展阅 ...

  10. 【Unity3D】表面着色器

    1 前言 ​ 固定管线着色器一.固定管线着色器二 中介绍了 ShaderLib 的基本用法,本文将接着讲解表面着色器(Surface Shader)的用法.固定管线着色器基于 ShaderLib 命令 ...