操作系统 [信号量] [并发控制]

时间:2022-06-01 16:54:51

0. 基础概念

进程同步: 有逻辑的进程之间需要有一定的先后顺序;

进程互斥: 进程之间对临界资源的使用;

1. 产生背景:

由于多个进程要使用临界资源,必须对临界资源进行管理;

临界资源是一次仅允许一个进程使用的共享资源

每个进程中访问临界资源的那段程序称为临界区,或者叫临界代码。


2. 关于PV操作

P,V原语的理论不得不提到的一个人便是赫赫有名的荷兰科学家E.W.Dijkstra
在计算机操作系统中,PV操作是进程管理中的难点。
首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
    P(S):①将信号量S的值减1,即S=S-1;
           ②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
    V(S):①将信号量S的值加1,即S=S+1;
           ②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。


3.  信号量的机制:

信号量分为整型信号量有忙等情况,记录型信号量没有,只能有原子操作函数更改;

信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
一般来说,信号量S>0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S£0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。


4. 相关系统接口

semget() 

     可以使用系统调用semget()创建一个新的信号量集,或者存取一个已经存在的信号量集: 系统调用semctl用来执行在信号量集上的控制操作。因为信号量一般是作为一个信号量集使用的,而不是一个单独的信号量。所以在信号量集的操作中,不但要知道IPC关键字值,也要知道信号量集中的具体的信号量。


5. 相关说明 

虽说信号量机制毕加锁方法要好得多,但是也不是说它没有任何的缺陷。由此我们也可以清晰地看到,这种信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。 

1.信号量对进程而言是共享的的,也就是说对系统来说,必须要有共享内存;

2.如果不删除信号量,它将继续在系统中存在,即使无程序在使用她也是粗次。

3.信号量也是一种有限资源,大家需要节约使用。


6. 推荐文章:

消费者生产者问题:http://blog.chinaunix.net/uid-21411227-id-1826740.html

读者写者问题:http://blog.sina.com.cn/s/blog_a3eacdb20101ct0c.html


其他博客:http://cooliron.blog.163.com/blog/static/124703138201322213632340/