操作系统学习(四)

信号量机制


1:信号量机制:对于临界资源的访问。

Wait(s),sgnal(s),是两个原子操作,在执行过程中不可中断,就是用来判断临界资源。S表示临界资源的数目,初始化为1.

Wait(s)

{

   While(s<=0);//当没有系统可以使用的临界资源的时候一直判断,循环里面是空语句表示不断测试资源是否被占用,占用则一直等待并且不断的测试。

s--;表示 //申请到了一个临界资源,资源的数量--;

 

}

Signal(s)

{

S++; 进程使用资源完了,资源的数目S++,使用的资源被释放,可以提供给下一个进程使用。

}

2:记录型信号量//s->value初始化默认为1;//解决信号量不断申请,等待测试资源的情况

Wait(semaphore *s)

{

  s->value--;(表示申请一个资源)

 if(s->value<0)

block(s->list)

//当资源已经被其他进程占用的时候,为了防止进程不断地申请测试,我们把进程给阻塞。

 

}

Signal((semaphore*s)

{

   s->value++; //资源释放。

   If(s->value>) wakeup(s->list)

//当临界资源可以被申请的时候,将刚才阻塞的进程给唤醒,继续执行,申请资源的操作。

 

}

3进程互斥的问题:多个进程可以并发执行,但是共享一个临界资源。(互斥共享)

AND同步机制:进程在运行中,需要多个资源,进程的并发执行他们所需要的共享资源(临界资源)需要互斥共享,所以为了解决这个问题,我们将进程在整个运行过程中需要的所有资源,一次性的分配给进程,待进程使用完在一起释放

(运行所需要的所有临界资源)。

4:信号量集 wait(s),signal(s),只是简单对临界资源+1 或者-1 代表去临界资源的申请和释放,但是反复申请会增加死锁的概率,所以我们在分配资源的时候将进程所有的资源一次性分配,但是我们需要测试资源的数量是否满足分配的下限值。

  死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

5:信号量机制实现前驱关系

//画的可能不是很好看见谅。

操作系统学习(四)

P1表示 s1->s2 s2执行前s1必须先执行。

P1{s1,signal(a),signal(b)   } s1执行后,把,s1执行完的消息传给他后面执行程序。

P2{wait(a), s2, signal(c)  };

P3{ wait(b), s3, signal(d)  };

P4{ wait(c),wait(d),s4    };