操作系统之我见-互斥

来源:互联网 发布:海西教育网络培训平台 编辑:程序博客网 时间:2024/05/15 12:44

临界区:进程中访问共享变量的代码段

同步:异步事件能按照要求的时序进行,使得合作的进程间协调一致的工作。

互斥的解决办法

多个相互合作的进程之间使用简单的信号来同步,一个进程被强迫的停止在一个特定的地方直到收到专门的信号。



信号量

一个信号量被定义为一个整型变量,其上定义三个操作

(1)可被初始化一个非负数

(2)wait操作,将信号量值减1,若该值为负,则执行wait操作的进程等待

(3)signal操作,将信号量值增1,将信号量值增加1,若该值非正,则执行signal操作的进程唤醒等待进程。


信号量

(1)二元信号量,允许取值0和1,主要用作互斥变量

(2)一般信号量,允许取值非负数,主要用于进程间的一般同步


信号量的数据结构

把等待进程放入与此信号量S有关的阻塞队列,它不仅包含一个整型数,还有一个进程队列


typedef structure

{

int value;

      struct process *L;


}semaphore;



一般信号量上的同步原语


wait(S)

{

S.value=S.value -1;

        if(S.value<0)

           {

               将执行wait(S)操作的进程P放入S.L;

                block( );


   }



}



signal(S)

{

S.value=S.value+1;

if(S.value <=0)

        {

      从S.L中删除一个进程P;

      wakeup(P);


}




}


用信号量实现进程间的互斥

wait(mutex)

//进程Pi的临界区代码

signal(mutex)

//进程Pi的其他部分代码


互斥的实现是由于只有一个进程能用wait操作把mutex减为0,当有第二个进程对mutex执行wait操作,这时mutex变为-1

该进程进入等待队列,直到第一个进程退出临界区,执行signal操作唤醒它,使mutex由-1变为0,唤醒在mutex信号量上

等待的阻塞进程,从而被唤醒的进程可以进入临界区。


管程:管程是管理进程间的同步机制,它保证进程互斥的访问共享变量,并且提供了一个方便的阻塞和唤醒进程的机构

管程相当于围墙一样把共享变量和对他进行的若干操作过程围了起来,进程要访问共享资源就必须经过管程。



进程间通信

进程间通信不但存在于一个作业的诸进程间,也存在于共享的有关资源进程之间,以及客户与服务器进程之间。

消息通信

直接通信,参与进程的通信分为两类,发送者和接手者,它们利用系统提供的原语发送和接收消息。

消息:至少包含以下信息,目标进程ID,发送者进程ID,消息大小,消息正文,消息是发送者形成的。

消息缓冲区:发送者进程ID,消息大小,消息正文和用于形成消息队列的链指针。

消息队列:由于消息队列要被多个进程访问,所以消息队列是由在共有存储区中的消息缓冲区链接而成的

通信原语 

send(目标进程ID,消息)

receive(源进程ID,消息)


间接通信

发送进程把消息发送到一个共享的数据结构中-信箱,所谓信箱也就是包含多个消息的队列。

其他通信方式

发送

(1)阻塞发送,等接收者的回答信息后才继续向前执行

(2)不阻塞发送,不等待回答就继续向前执行‘

接收

(1)阻塞接收,已经有消息在等待接收者进程接收,于是在接收这个消息后继续前进

(2)还没有任何消息到来,于是它或者阻塞自己等待的消息到来,或者干脆放弃接收意图,继续前进。

它们之间的组合,例如非阻塞发送,阻塞接收,这是最常用的模式。








0 0
原创粉丝点击