操作系统之信号量机制总结

  1965年,荷兰学者Djikstra提出信号量(Semaphores)机制是一种卓有成效的进程同步工具。在长期的应用中,信号量机制又获得了很大的发展,从整型信号量记录型信号量,进而发展成“信号量集”机制,下面我们来讨论一下各种信号量机制的内容。

1、整形信号量(经典的PV操作:P(wait):申请资源 V(signal):释放资源)

1 wait(S):while S<=0 do no-op;
2     S:=S-1;
3 signal(S):  S:=S+1

2、记录型信号量

在整形信号量机制中的wait操作,只要是信号量S≤0,就会不断测试。该机制并未遵守“让权等待”的准则,而是使进程处于“忙等”的状态。

在记录型信号量是一种不存在“忙等”现象的进程同步机制。但是采取了“让权等待”的策略后又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中出了一个需要用于表示资源数目的整形变量value外,还应增加一个进程链表指针L,用于链接上述所有等待进程。

 1 type semapthere = record // 信号量类型 记录型
 2     value:integer;       // 资源数目
 3     L:list of process    // 进程链表指针
 4     end
 5 P、V操作如下:
 6 procedure wait(S)
 7     var S:semapthere;    // 声明一个记录型信号量 包含value和L
 8     begin
 9         S.value:=S.value-1              // 申请一个资源,资源数目少一个
10         if S.value<0 then block(S.L);   // 如果资源数目小于0,说明该类资源分配完毕,调用block原语,进行自我阻塞,放弃处理机。然后将当前进程插入到信号量链表中,此时S.value的绝对值表示该信号量链表中阻塞进程的数目。
11     end
12 procedure signal(S)
13     var S:semapthere;
14     begin
15         S.value:=S.value+1;             // 释放一个单位资源,资源数目加1
16         if S.value<=0 then wakeup(S.L); // 如果资源数目小于0(加1后),表示仍然有进程处于阻塞状态,调用wakeup原语将S.L中第一个等待的进程唤醒。
17     end

3、AND型信号量

前面讨论的进程互斥问题都是共享一个临界资源而言的,但是在很多情况下一个进程需要获得两个或多个共享资源后才能执行其任务。如果此类问题利用上述办法将会陷入死锁状态。

AND同步机制的基本思想:将进程在整个运行过程中需要的所有资源一次性全部分配给进程,待进程用完后再一起释放。只要尚有一个资源未分配给进程,其他所有可能为之分配的资源也不分配给它。亦即,对若干个临界资源的分配采取原子操作方式:要么把它所请求的资源全部分配给进程,要么一个也不分配。由死锁理论可知,可避免死锁的发生。

 1 Swait(S1,S2,...,Sn)
 2     if Si>=1 and ... and Sn>=1 then
 3         for i:=1 to n do
 4         Si:=Si-1;
 5         endfor
 6     else
 7         place the process in the waiting queue associated with the first Si found with Si<1,and set the program count of this process to the begining of Swait operation
 8     endif
 9 Ssignal(S1,S2,...,Sn)
10     for i:=1 to n do
11         Si = Si+1;
12     Remove all the process waiting in the queue associated with Si into the ready queue.
13     endfor;

原文地址:https://www.cnblogs.com/IamJiangXiaoKun/p/9464336.html

时间: 2024-08-30 09:21:17

操作系统之信号量机制总结的相关文章

【操作系统总结】进程同步的信号量机制

信号量机制是由dijkstra 1965年提出,是解决进程同步重要的工具 下面方法适用与几个进程访问同一个临界区 整形信号量 定义一个表示资源数目的整形信号量S,仅能同步P, V操作改变.原始值S=1,每一个进程来的时候会执行: 首先执行wait()操作,如果信号量s<=0就会一直检测并阻塞 如果不小于0就会进入临界区,并把S设为0,保证其他进程无法进去临界区 在临界区执行完,再把信号量设置回来. wait(S) { while(S <= 0);//资源如果小余0就会阻塞.一直在这边检测 S-

操作系统——信号量机制

一.知识总览 信号量机制的基本原理:两个或多个进程可以利用彼此间收发的简单的信号来实现“正确的”并发执行,一个进程在收到一个指定信号前,会被迫在一个确定的或者需要的地方停下来,从而保持同步或互斥. 二.整型信号量 三.记录型信号量 typedef struct{ int value; struct process *L; }semaphore//信号量 void wait(semaphore S){//wait原语 S.value--; if(S.value<0){ block(S.L);//阻

操作系统 内存管理机制

参考和查阅了一下他人的资料,整理下 虚拟内存.物理内存.Swap分区.页面置换机制等基础知识 虚拟地址空间 与 物理地址空间的关系 虚拟地址由操作系统维护,由MMU可以进行转换,扩大了内存空间分页管理. 大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制. 虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页帧(frame),一个在磁盘,一个在内存,页和页桢的大小必须相同.在32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这

信号量机制

11.1 2 个程序的例子 先看 2 个程序: #include<unistd.h> int main(void) { allarm(10); for(;;;); } 这段程序的含义比较明显:这个程序在一个无限循环中,直到过了 10 秒,之后 程序被终止. 在来看另外一个程序: Static void setvalue(void) { Flag=1; } int main(void) { int sum=0; int flag=0; struct sigaction act; act.sa_h

GCD之信号量机制一

在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它相似,可以控制并发的线程数量. 1.首先熟悉下几个函数 dispatch_semaphore_create 创建一个信号量,设置一个初始值dispatch_semaphore_signal 发送一个信号,信号通知,信号量+1dispatch_semaphore_wait 等待信号,信号量-1 当一个

GCD之信号量机制二

在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误,下面的代码能说明. 1.下面是不采用信号量修改公有变量的值 dispatch_group_t group=dispatch_group_create(); // dispatch_semaphore_t semaphore=dispatch_semaphore_create(1); dispatch_queue_t queue=dispatch_get_global_queue(DI

锁机制,信号量机制,事件机制

IPC -- inter process Communication  进程间通信 守护进程随着父进程的代码执行完毕才结束 代码:from multiprocessing import Processimport time def func1(): for i in range(65,90): print(chr(i)) time.sleep(0.5) def func(): for i in range(10): print(i) time.sleep(0.5) if __name__ ==

操作系统篇-分段机制与GDT|LDT

|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在<操作系统篇-浅谈实模式与保护模式>中提到了两种模式,我们说在操作系统中,其实大部分时间是待在保护模式中的.因此若想理解操作系统程序中的启动相关的部分,必须要理解保护模式下的编程,而分段机制是保护模式编程下的基础.而且,由于实模式与保护模式的不同,对保护模式下的分段机制更需要注意. 二.线性地址 在保护模式下编程,访问内存时,需要在程序中给出段地址和偏移量,因为分段是保护模式的基本特征之一.传统上,段地址和偏移地址称为逻辑

基类子类在Qt信号量机制下的思考

背景知识: 基类 superClass class superClass { public: superClass(){ std::cout << "superClass()" << std::endl; } virtual ~superClass(){} virtual void print() { std::cout << "superclass print " << std::endl; } }; 子类subCl