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

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

  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. 小样本学习在文心ERNIE3.0多分类任务应用--提示学习

    小样本学习在文心ERNIE3.0多分类任务应用(提示学习) 项目链接: https://aistudio.baidu.com/aistudio/projectdetail/4438610?contri ...

  2. 14.7 Socket 循环结构体传输

    在上述内容中笔者通过一个简单的案例给大家介绍了在套接字编程中如何传递结构体数据,本章将继续延申结构体传输,在某些时候例如我们需要传输一些当前系统的进程列表信息,或者是当前主机中的目录文件,此时就需要使 ...

  3. C/C++ 反汇编:函数与结构体

    反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高级语言代码都有相当大的帮助, ...

  4. PHP中文件锁

    PHP中文件锁 文件锁的用途: 若一个人在写入一个文件,另外一个人同时也打个了这个文件进行写入文件. 这情况下,如果遇到一定的碰撞概率的话,不知道到底谁的操作为准. 因此,这个时候我们引入锁机制. 若 ...

  5. 如何减少Exadata计算节点CPU的Core数量

    最近为某客户做一个Exadata的PoC测试,要求是X8 1/8 rack配置,目前机器是1/4 rack的硬件. OEDA配置时只选择了1/8 rack选项,其他都没有配置.但是在一键刷机时会发现跳 ...

  6. delphi的bpl、dcp 、dcu

    BPL  英文全称 Borland Package library ,是一种特殊的DLL文件,用于代码重用和减少可执行文件.编译bpl时,仅需要添加相应功能的pas文件,如果有窗体,则需要添加dfm文 ...

  7. 【Unity3D】GUI控件

    1 前言 ​ Unity 3D 提供了 GUI.NGUI.UGUI 等图形系统,以增强玩家与游戏的交互性.GUI 在编译时不能可视化,在运行时才能可视化.GUI 代码需要在 OnGUI 函数中调用才能 ...

  8. java generic 介绍

    一 介绍: 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换, ...

  9. java利用hdfs api进行上传下载操作

    1.说明 最近项目中一部分大文件需要存储到hadoop的hdfs组件中,自己本地用3台centos7虚拟机搭建了一套集群.本地写点java代码测试一下. 代码部分改编自网络. 环境说明 一主二仆结构. ...

  10. win32- copyfile的使用

    #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <tchar.h&g ...