文章目录
一、过程同步的基本结构二、信号1 .生产者——消费者问题2 .将信号扩展为信号量3 .生产者——消费者问题信号量实现总结前言
提示:在这里可以添加要在本文中记录的大致内容。
例如,随着人工智能的发展,机器学习这一技术也越来越重要,很多人开始学习机器学习,本文介绍了机器学习的基础内容。
一、用过程同步的基本结构总线的例子说明什么是过程同步:
如上图所示,司机过程和售票员过程必须分别完成一些工作。 但是,这些工作并不是相互独立的,两个进程之间的工作是否执行可能取决于是否执行另一个进程的工作。
例如,司机在启动车辆之前,必须确保售票员完成售票并关门,而售票员开门的前提也是司机完成了车辆停车。 因此,两个过程之间需要同步是在司机启动车辆之前和乘务员关门之前。
那么,需要在特定的时候让过程“睡眠”,等待另一个过程的执行; 当另一个过程运行到合适的位置后,必须“唤醒”“睡眠”过程。
引入“睡眠”和“清醒”后,司机和乘务员的过程如上图所示。
这是进程同步的基本结构。
二、信号如上例所示,解决过程异步的方法是引入“睡眠”和“清醒”机制。
那么,什么时候睡觉,什么时候清醒,这需要信号来提供判断的依据。
1.“生产者”——“消费者”问题生产者——以消费者问题为例,生产者过程和消费者过程共享一个数据缓冲器,生产者将数据写入缓冲器,消费者从缓冲器中提取数据; 当缓冲区充满时,生产者必须睡觉,等待生产者提取数据后醒来,当缓冲区耗尽时,消费者需要等待生产者将数据写入缓冲区。
定义两个信号: empty和full。 empty表示“空闲缓冲区数”,当消费者进程使用一个内容单元时,即出现空闲缓冲区时,它向生产者进程发送empty信号。 生产者在空闲的单元中填写内容后,也向消费者发送full信号。
如上图所示,当counter==BUFFER_SIZE时,即当缓冲器充满时,生产者进入休眠状态,等待信号empty的消费者使用一个存储器单元,counter==buffer _ ssize
但是,如果存在两个消费者流程P1和P2,会怎么样呢?
当缓冲器充满时,P1和P2过程分别进入阻塞状态,等待empty信号; 消费者进程使用存储器单元后,如果判断counter==BUFFER_SIZE-1,则向P1发送empty信号,P1将被唤醒。 消费者流程再循环一次,即counter==BUFFER_SIZE-2,但此时wake_up不启动,P2不能启动。
为了解决这个问题,需要把信号变成信号量。
2 .信号量扩展counter控制进程的进度和停止,信号记录进程的停止和进行位置,不能适应变化的调度情况。 这在counter应该表达的意义上是不够的。 如果P1和P2都被阻止,则counter始终等于BUFFER_SIZE,不能指示当前被阻止的进程数。
为了记录当前被阻止的进程的数量,需要引入信号。 它还可以用于控制进程的进度和停止。 因此,信号量是基于信号的整数,用于控制进程的阻止和唤醒。
信号量empty与一个表达量的整数相关。 如果P1被empty信号量阻止,则empty=1表示此时存在进程块。 如果P2被阻止,则empty为2。 如果使用者进程c循环一次,并唤醒一个进程,则empty=1,另一个调用,empty=0。
那么,如果c循环一次,empty=-1,这意味着什么?
-1表示当前在缓存区域有可用单元,对生产者来说有资源。 但是,用-1表示有一个资源没什么意义。 如果将-1更改为1,则1表示有可用设备,-1表示此时缺少一个资源,一个进程处于阻塞状态。
通过引入信号量,增加了可以表达的意义。
)对于empty,整数表示还有empty个资源,负数表示资源不足,进程被阻止。
)2)对于生产者过程,如果发现empty为0或负数,则表示没有空闲单元,进入阻塞状态。
)3)对于消费者流程而言,如果empty为负,则表示生产者流程被屏蔽,需要觉醒。
3 .信号量的意义和实现
在以上示例中,信号量的含义更加明确:
(1)信号量是记录与过程同步相关的重要信息的整数变量;
)2)该信号量可以阻滞进程使其睡眠
(3)需要同步的过程,操作信号(正负1 )实现过程的阻塞和唤醒。
因此,信号量是一个数据对象和对该数据对象的两个操作。 数据对象是信号量数值和对应的阻塞进程队列; 两个操作,即信号量数值
进行+1或-1操作。 struct semaphore{ int value;//信号量的数值,用来记录资源个数或等待进程个数 PCB *queue;//等待在这个信号量上的队列}P(semaphore s)//进行-1操作{ s.value--; if(s.value < 0) { sleep_on(s.queue); }}V(semaphore s)//进行+1操作{ s.value++; if(s.value <= 0) { wake_up(s.queue); }} 4.生产者——消费者问题的信号量解法empty信号量表达的是缓存区中空闲单元的个数,初值为BUFFER_SIZE,生产者对它进行P操作,消费者对它进行V操作。
同样的道理,我们发现消费者进程再缓存区中没有有内容的单元时,会进入阻塞状态,我们用full这个信号量来表示有内容单元的数量,初值为0,生产者对它进行V操作,消费者对它进行P操作。
此外,由于是共享缓存区,同时只能有一个进程能够对缓存区内容进行修改,因此引入信号量mutex = 1,只有当数值为1的时候,才能进入缓存区进行修改。
总结
(1)说明了进程同步的概念,为什么要进行进程同步;
(2)使用信号实现进程同步,并发现信号表达的含义不够;
(3)引入信号量,对信号量进行定义,用信号量实现进程同步的过程。