【操作系统总结】进程同步的信号量机制
来源:互联网 发布:摄像制作软件 编辑:程序博客网 时间:2024/04/29 10:07
信号量机制是由dijkstra 1965年提出,是解决进程同步重要的工具
下面方法适用与几个进程访问同一个临界区
整形信号量
定义一个表示资源数目的整形信号量S,仅能同步P, V操作改变。原始值S=1,每一个进程来的时候会执行:
- 首先执行wait()操作,如果信号量s<=0就会一直检测并阻塞
- 如果不小于0就会进入临界区,并把S设为0,保证其他进程无法进去临界区
- 在临界区执行完,再把信号量设置回来。
wait(S) { while(S <= 0);//资源如果小余0就会阻塞。一直在这边检测 S--;//进入临界区就会将}signal(S) { S ++;//在临界区执行完了,就会把信号量+1}
记录型信号量
整形信号量没有遵循”让权等待原则”,进程一但进不去临界区就在那一直检测,不释放处理机,所以有了记录型信号量
- 首先一个进程请求该类资源,执行wait操作,发现value<0,就进入阻塞,插入链表,释放处理机
- 进程不再使用该资源了,就会执行signal操作,发现value小于0,表示还有进程在等待,就会唤醒链表中的阻塞队列
信号量S是一个结构
typedef struct { int value;//表示资源数目的整形变量 struct process_control_block *list;//进程链表,阻塞的进程都会放到这里}
wait(semaphore *S) { S->value--;//首先执行wait操作,就将value-1, if(S->value < 0) bolck(S->list);//如果发现value小于0,就会阻塞,把进程放入链表中}signal(semaphore *S) { S->value ++;//让value+1 if(S->value <= 0) wakeup(S->list);//如果发现还是小于0,证明还有进程在阻塞,唤醒链表中的第一个进程}
下面是针对多个并发进程访问多个临界资源
AND型信号量
AND型信号量思想,就是把进程整个运行中需要的资源,一次性的全部分配给他,然后进程执行完了,再一次性释放。如果有一个未分配,其他资源也不分配给这个进程,这样就可以避免死锁问题
- 进程先执行Swait操作,如果所有资源都可以分配,就把所有资源分配给这个进程
- 当进程执行完了,就会Ssignal操作释放资源,然后唤醒等待队列中另一个进程
Swait(S1, S2,.........Sn) { while(true) { if(S1>=1&&....&&Sn>=1) {//检测所有的资源都可以分配 for(i = i; i<n; i++) { for(i = i; i<n; i++) Si--;//所有的资源数量-1 break; } } else { //进入阻塞队列,等待资源 } }}Ssignal(S1, S2,......Sn) { while(true) { for(i=1; i<n;i++) {//释放所有的资源 Si++; //唤醒等待队列中的进程 } }}
信号量集
上面的只能对信号量执行+1或者-1操作,每次只能对资源进行一个单位的申请或者释放,当需要N个单位的时候,就要执行N此wait操作,这样很低效
机遇AND型信号量的扩充—>信号量集
- 该资源的分配下限是ti
- 当资源Si高于他的分配下限的时候可以分配也就是 Si > ti;
- di是进程对该资源的需求量,分配资源以后要进程Si = Si - di
- 当进程不需要资源的时候,释放就要进行Si = Si + di;
Swait(S1, t1, d1,.........Sn, tn, dn) { while(true) { if(S1>=t1&&....&&Sn>=tn) {//检测所有的资源都可以分配 for(i = i; i<n; i++) { for(i = i; i<n; i++) Si = Si - di;//所有的资源数量d1,所需的资源量 break; } } else { //进入阻塞队列,等待资源 } }}Ssignal(S1, d1,......Sn, dn) { while(true) { for(i=1; i<n;i++) {//释放所有的资源 Si = Si + di; //唤醒等待队列中的进程 } }}
特殊情况
- Swait(S, d, d)只有一个信号量,也就是只需要这一个资源,现有资源不能小余d
- Swait(S, 1, 1)就是一般的信号量机制(整形信号量机制)
- Swait(S, 1, 0)当S >= 1时,允许多个进程进入临界区,否则就会组织任何进程进入临界区
0 0
- 【操作系统总结】进程同步的信号量机制
- 操作系统:进程同步(2)信号量机制
- 进程同步之间的信号量机制
- 操作系统的信号量 进程互斥 同步等概念
- 操作系统中进程互斥的方式之一,信号量机制
- 基于信号量机制的进程同步问题模拟程序
- 操作系统:进程同步(3)信号量应用
- 操作系统 -- 进程间同步机制
- 进程同步中的信号量机制(一)
- 进程同步中的信号量机制(二)
- 进程同步之信号量机制(笔记三)
- 进程同步机制的优缺点比较,......同步机制包括 “原子操作 信号量机制 自旋锁 管程,会合,分布式系统”等
- [操作系统学习笔记(4)] 进程同步,信号量
- 【操作系统】进程同步机制相关解释
- 【操作系统总结】经典的进程同步问题-生产者消费者问题
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- linux进程间的通信(C): 使用信号量进行同步的共享内存机制
- Xcode開發環境用什麼字體好?
- swf文件格式解析入门(tag解析)
- Java代码 实现直接选择排序
- 【编程语言-Java】Java创建线程的两个方法
- swf文件分析 转
- 【操作系统总结】进程同步的信号量机制
- 多线程基础
- 对拍
- HIT 2815 扩展欧几里得(前方高能)
- IO流
- 【编程语言-Java】Java线程创建方式及对比
- 百度地图 使覆盖物显示在地图中心位置
- 国外程序员整理的机器学习资源大全
- 接口