【操作系统】信号量机制的应用

写在前面

  • 关于文章

    在前边学习了操作系统中进程管理中的进程概念、进程创建、进程并发、进程同步、信号量机制等相关内容,信号量(Semaphore)是另一种临界区的保护机制,它是操作系统提供的一种协调共享资源访问的方法。它将资源纳入全局考虑,从操作系统的层面对资源进行宏观的调配。

    信号量Semphore中的整数sem就是这个系统资源剩余量。申请时减少,释放时增加即可,没有时等待分配,所以先进先出。具体的实现接口为P()和V(),分别是荷兰语(?)增加prolagg和减少verhoog的缩写。

    在这里主要学习一下信号量机制的应用。

信号量的应用

利用信号量实现进程互斥

为使多个进程互斥的访问某临界资源,须为该资源设置一互斥信号量mutex,并设其初始值为1,然后将各进程访问资源的临界区CS置于wait(mutex)和signal(mutex)之间即可。

Var  mutex: semaphore  :=1;  // 设置一互斥信号量mutex并设其初始值为1
        begin
        parbegin  // 在parbegin~parend 之间有两个进程表示并发进程
            process 1: begin
                                   repeat
                                      wait(mutex);  // 进入区 执行P操作进行申请互斥资源
                                      critical section  // 临界区 申请到资源后进行使用
                                      signal(mutex);  // 退出去 资源使用完毕执行V操作
                                      remainder section  // 剩余区
                                   until false;
                               end
           process 2: begin
	         						repeat
	             						wait(mutex);  // 进入区 执行P操作进行申请互斥资源
										critical section  // 临界区 申请到资源后进行使用
                           				signal(mutex);  // 退出去 资源使用完毕执行V操作
	              						remainder section  // 剩余区
                                    until false; 
	       						end
         parend
         end

案例

用记录型信号量实现两个进程互斥使用一台打印机。

Var  mutex: semaphore  :=1;   //表示打印机
        begin
        parbegin
            p1: begin
	     			 repeat
                         wait(mutex);
                          使用打印机
                         signal(mutex);
						 remainder section;
                      until false;
                    end
            p2: begin
                  repeat
                     wait(mutex);
                      使用打印机
                      signal(mutex);
					 remainder section;
                   until false; 
                 end
        parend  
        end

利用信号量实现前驱关系

案例

Var  a, b, c, d, e, f, g; semaphore :=0, 0, 0, 0, 0, 0, 0; // 观察前驱关系图,有几个箭头就设置几个信号量
     begin
          parbegin
               begin  S1; signal(a); signal(b); end;
               begin  wait(a); S2; signal(c); signal(d); end;
               begin  wait(b); S3; signal(e); end;
               begin  wait(c); S4; signal(f); end;
               begin  wait(d); S5; signal(g); end;
               begin  wait(e); wait(f); wait(g); S6; end;
          parend
     end

利用记录型信号量实现同步

P1,p2两进程因合作完成一项任务而共用一个变量x。

进程p2将处理结果送入x;进程P1将x的结果打印。

案例

Var  empty: semaphore  :=1;  // 设置信号量empty=1表示P1的print(x)已完成

Var  full: semaphore  :=1;  //  设置信号量full=1表示P1可以打印x
begin
        parbegin
    		// 进程P1将x的结果打印
            p1: begin
                       repeat
                          … …
                          wait(full);  // 首先执行P操作 判断full信号量即判断是否有数据
                          print(x);  // 申请到full 表示有数据进行打印操作
                          signal(empty);  // 打印操作完成后对empty信号量进行V操作
                          … …
                      until false;
                 end
           // 进程p2将处理结果送入x         
           p2: begin
                   repeat
                   … …
                   wait(empty);  // 首先执行P操作 判断empty信号量即判断是否为空
    				x:=处理结果;  // 申请到empty 表示为空进行存入数据
        			signal(full);  // 存入数据操作完成后对full信号量进行V操作
    				… …
        			until false; 
    			end
        parend
end

微信关注

WeChat

 

本站为非盈利性站点,所有资源、文章等仅供学习参考,并不贩卖软件且不存在任何商业目的及用途,如果您访问和下载某文件,表示您同意只将此文件用于参考、学习而非其他用途。
本站所发布的一切软件资源、文章内容、页面内容可能整理来自于互联网,在此郑重声明本站仅限用于学习和研究目的;并告知用户不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
如果本站相关内容有侵犯到您的合法权益,请仔细阅读本站公布的投诉指引页相关内容联系我,依法依规进行处理!
作者:理想
链接:https://www.imyjs.cn/archives/578
THE END
二维码
【操作系统】信号量机制的应用
写在前面 关于文章 在前边学习了操作系统中进程管……
<<上一篇
下一篇>>
文章目录
关闭
目 录