PV操作与信号灯及例子+三大操作系统共同点的线程通信

2023-05-16

 

 看待技术问题要瞄准其本质,不管是Linux、VxWorks还是WIN32,其涉及到多线程的部分都是那些内容,无非就是线程控制和线程通信,它们的许多函数只是名称不同,其实质含义是等价的,下面是三大操作系统共同点



详细表单:
事项WIN32VxWorksLinux
线程创建CreateThreadtaskSpawnpthread_create
线程终止执行完成后退出;线程自身调用ExitThread函数即终止自己;被其他线程调用函数TerminateThread函数执行完成后退出;由线程本身调用exit退出;被其他线程调用函数taskDelete终止执行完成后退出;由线程本身调用pthread_exit 退出;被其他线程调用函数pthread_cance终止
获取线程IDGetCurrentThreadIdtaskIdSelfpthread_self
创建互斥CreateMutexsemMCreatepthread_mutex_init
获取互斥WaitForSingleObject、WaitForMultipleObjectssemTakepthread_mutex_lock
释放互斥ReleaseMutexsemGivephtread_mutex_unlock
创建信号量CreateSemaphoresemBCreate、semCCreatesem_init
等待信号量WaitForSingleObjectsemTakesem_wait
释放信号量ReleaseSemaphoresemGivesem_post

 

PV操作与信号灯及例子

http://blog.sina.com.cn/s/blog_5f430c7e0100d1qj.html

PV操作与信号灯的处理相关,P表示通过的意思V表示释放的意思
  1962年,狄克斯特拉离开数学中心进入位于荷兰南部的艾恩德霍芬技术大学(Eindhoven Technical University)任数学教授。在这里,他参加了X8计算机的开发,设计与实现了具有多道程序运行能力的操作系统——THE Multiprogramming System。THE是艾恩德霍芬技术大学的荷兰文Tchnische Hoogeschool Eindhov –en的词头缩写。狄克斯特拉在THE这个系统中所提出的一系统方法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构,顺序进程之间的同步和互斥机制这样一些重要的思想和概念都是狄克斯特拉在THE中首先提出并为以后的操作系统如UNIX等所采用的。
  为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为“就绪”(ready)、“运行”(running)和“阻塞”(blocking)三个工作状态。 由于在任一时刻最多只有一个进程可以使用处理机, 正占用着处理机的进程称为“运行”进程。 当某进程已具备了使用处理机的条件,而当前又没有处理机供其使用,则使该进程处于“就绪”状态。 当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机,使之进入“阻塞”状态, 待造成其退出运行的条件解除,再进入“就绪”状态。而对系统中所有同时运行的进程,在一个进程访问共享数据时,另一个进程不访问该数据和互斥(mutually- exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源,诸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中的“信号灯”(semaphore,或叫”信号量”)概念加以解决。
   所谓信号灯,实际上就是用来控制进程状态的一个代表某一资源的存储单元。例如,P1和P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程,为了防止这两个进程并发时产生错误,狄克斯特拉设计了一种同步机制叫“PV操作”,P操作和V操作是执行时不被打断的两个操作系统原语。 执行P操作P(S)时信号量S的值减1,若结果不为负则P(S)执行完毕,否则执行P操作的进程暂停以等待释放执行V操作V(S)时,S的值加1,若结果不大于0则释放一个因执行P(S)而等待的进程。对P1和P2可定义两个信号量S1和S2,初值分别为1和0。进程P1在向缓冲B送入数据前执行P操作P(S1),在送入数据后执行V操作V(S2)。进程P2在从缓冲B读取数据前先执行P操作P(S2),在读出数据后执行V操作V(S1)。当P1往缓冲B送入一数据后信号量S1之值变为0,在该数据读出后S1之值才又变为1,因此在前一数未读出前后一数不会送入,从而保证了P1和P2之间的同步。我国读者常常不明白这一同步机制为什么叫PV操作,原来这是狄克斯特拉用荷兰文定义的,因为在 荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。这是在计算机术语中不是用英语表达的极少数的例子之一。
大学操作系统 中的经典例子:
   P就是请求资源,V就是释放资源
  例如一个司机与售票员的例子
  在公共汽车上,为保证乘客的安全,司机和售票员应协调工作:
  停车后才能开门,关车门后才能行车。用PV操作来实现他们之间的协调。
  S1:是否允许司机启动汽车的变量
  S2:是否允许售票员开门的变量
   driver()//司机进程
  {
  while (1)//不停地循环
  {
  P(S1);//请求启动汽车
  启动汽车;
  正常行车;
  到站停车;
  V(S2); //释放开门变量,相当于通知售票员可以开门
  }
  }
   busman()//售票员进程
  {
   while(1)
  {
  关车门;
  V(S1);//释放开车变量,相当于通知司机可以开车
  售票
  P(S2);//请求开门
  开车门;
  上下乘客;
  }
  }
  注意:busman() driver() 两个不停循环的函数
关于PV操作理解的例子02

【例2】桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
分析 在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
    解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:
int S=1;
int Sa=0;
int So=0;
      main()
      {
        cobegin
            father();      /*父亲进程*/
            son();        /*儿子进程*/
            daughter();    /*女儿进程*/
        coend
    }
    father()
    {
        while(1)
          {
            P(S);
            将水果放入盘中;
            if(放入的是桔子)V(So);
            else V(Sa);
           }
     }
    son()
    {
        while(1)
          {
             P(So);
             从盘中取出桔子;
             V(S);
             吃桔子;
            }
    }
    daughter()
    {
         while(1)
            {
              P(Sa);
              从盘中取出苹果;
              V(S);
              吃苹果;
            }

【例2】桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
分析 在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
    解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:
int S=1;
int Sa=0;
int So=0;
      main()
      {
        cobegin
            father();      /*父亲进程*/
            son();        /*儿子进程*/
            daughter();    /*女儿进程*/
        coend
    }
    father()
    {
        while(1)
          {
            P(S);
            将水果放入盘中;
            if(放入的是桔子)V(So);
            else V(Sa);
           }
     }
    son()
    {
        while(1)
          {
             P(So);
             从盘中取出桔子;
             V(S);
             吃桔子;
            }
    }
    daughter()
    {
         while(1)
            {
              P(Sa);
              从盘中取出苹果;
              V(S);
              吃苹果;
            }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PV操作与信号灯及例子+三大操作系统共同点的线程通信 的相关文章

随机推荐

  • 一种简单有效的锂电池充电均衡电路

    这个均衡电路用的是三个一模一样的并联稳压电路组成的 xff0c 每个电池上并一个 电路原理图如下 xff1a 每个稳压电源都调节到4 2V 均衡的原理是 xff0c 当电池电压都小于4 2V时 xff0c 并联稳压电路不起作用 xff0c
  • 基于opencv对图片的二进制流进行编解码

    span class token keyword import span cv2 span class token keyword import span numpy span class token keyword as span np
  • STM32与传感器串口通讯问题

    前言 STM32F407ZGT6使用串口通信发送指令给传感器 xff0c 让传感器返回测得的数据 1 过程 大家看我这个程序 xff0c 在main函数前面我定义了一个read instruction数组 xff0c 存放读取传感器的指令
  • 检测到"_ITERATOR_DEBUG_LEVEL"的不匹配项

    最近在项目中遇到了问题 xff0c 编译器提示 检测到 34 ITERATOR DEBUG LEVEL 34 的不匹配项 xff0c 上网查找后发现是编译Release版本用到了DEBUG库的原因 xff0c 其中也提供了在预编译中加入 3
  • C语言实现单链表的逆置

    单链表的逆置是一个非常经典的问题 xff0c 这里利用两个思想进行解决 首先 xff0c 我们需要看下原理图 xff0c 其实两个思想都是一样的 xff0c 都是使后一个的节点的 next 指针指向前一个节点 xff0c 依次递推 xff0
  • UNIX下C语言的图形编程-curses.h函数库

    相信您在网路上一定用过如 tin elm 等工具 这些软体有项共同的特色 即他们能利用上下左右等方向键来控制游标的位置 除此之外 这些程式 的画面也较为美观 对 Programming 有兴趣的朋友一定对此感到好奇 也 许他能在 PC 上用
  • 如何同时启动多个Tomcat服务器

    这篇文章转载自 如何同时启动多个Tomcat服务器 conf子目录中打开server xml文件 xff0c 查找以下三处 xff1a 1 修改http访问端口 xff08 默认为8080端口 xff09 span class hljs t
  • 找到合适的方案记录服务端日志

    做过服务端开发的同学都清楚日志是多么的重要 你要分析应用当天的 PV UV 你需要对日志进行统计分析 你需要排查程序 BUG 你需要寻找日志中的异常信息等等 所以 建立一套合适的日志体系是非常有必要的 日志体系一般都会遵循这么几个原则 根据
  • doPDF——word转为PDF软件的使用方法

    doPDF软件下载链接 xff0c 版本doPDF 7 3 379 点击打开链接 1 下载好doPDF软件我们就可以动手安装了 安装到选择打印机的界面 软件使用方法如图所示 xff08 备注我用的是word2007 xff0c 可能与200
  • 过去的 2017 年

    过去的 2017 年分为两个部分 xff0c 前半部分偏忙碌 xff0c 个人时间较少 xff0c 但是收获甚微 xff1b 后半部分进入了一个学习的环境 xff0c 最主要的就是个人可自由支配的时间多了 xff0c 留给了我很多思考的时间
  • Android四大组件详解

    注 xff1a 本文主要来自网易的一个博主的文章 xff0c 经过阅读 xff0c 总结 xff0c 故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity xff0c Service服务
  • Socket通信原理和实践

    我们深谙信息交流的价值 xff0c 那网络中进程之间如何通信 xff0c 如我们每天打开浏览器浏览网页时 xff0c 浏览器的进程怎么与web服务器通信的 xff1f 当你用QQ聊天时 xff0c QQ进程怎么与服务器或你好友所在的QQ进程
  • linux下查看和添加PATH环境变量

    linux下查看和添加PATH环境变量 PATH xff1a 决定了shell将到哪些目录中寻找命令或程序 xff0c PATH的值是一系列目录 xff0c 当您运行一个程序时 xff0c Linux在这些目录下进行搜寻编译链接 编辑你的
  • Linux 内存映射函数 mmap()函数详解

    一 概述 内存映射 xff0c 简而言之就是将用户空间的一段内存区域映射到内核空间 xff0c 映射成功后 xff0c 用户对这段内存区域的修改可以直接反映到内核空间 xff0c 同样 xff0c 内核空间对这段区域的修改也直接反映用户空间
  • Cygwin获取root权限

    1 找到cygwin 的etc目录中有一个名为passwd的文件 2 用写字板打开passwd 这个文件 xff0c 找到以下部分 xff0c 把其中的windows用户名换成root xff08 共3处都改过来 xff09 Adminis
  • Linux Shell 只列出目录的方法

    在实际应用中 xff0c 我们有时需要仅列出目录 xff0c 下面是 4 种不同的方法 1 利用 ls 命令的 d 选项 xff1a ls d Desktop pic shell src 2 利用 ls 命令的 F 选项 xff1a ls
  • 读《Linux内核设计与实现》我想到了这些书

    从题目中可以看到 xff0c 这篇文章是以我读 Linux内核设计与实现 而想到的其他我读过的书 xff0c 所以 xff0c 这篇文章的主要支撑点是 Linux内核 开始读这本书已经是很久以前的事了 xff0c 不过 xff0c 由于时间
  • 计算机保研复习

    操作系统 1 进程间的通信方式 无名管道pipe xff1a 管道是一种半双工的通信方式 xff0c 数据只能单向流动 xff0c 而且只能在具有亲缘关系的进程间使用 进程的亲缘关系通常是指父子进程关系 命名管道FIFO xff1a 有名管
  • Gyro陀螺仪 > MPU 6000 vs ICM 20689

    目录 参考 MPU 6000和ICM 20689对比 陀螺仪的选择 xff1a 采样率与噪声 参考 Gyro MPU 6000 vs ICM 20689 IntoFPV Forum FPV Drone Flight Controller E
  • PV操作与信号灯及例子+三大操作系统共同点的线程通信

    看待技术问题要瞄准其本质 xff0c 不管是Linux VxWorks还是WIN32 xff0c 其涉及到多线程的部分都是那些内容 xff0c 无非就是线程控制和线程通信 xff0c 它们的许多函数只是名称不同 xff0c 其实质含义是等价