进程管理及进程间通讯课件.pptVIP

进程管理及进程间通讯课件.ppt

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

在操作系統中,信號量的最簡單形式是一個整數,多個進程可檢查並設置信號量的值。這種檢查和設置操作是不可被中斷的,也稱為“原語”操作。檢查並設置操作的結果是信號量的當前值和設置值相加的結果,該設置值可以是正值,也可以是負值。根據檢查和設置操作的結果,進行操作的進程可能會進入休眠狀態,而當其他進程完成自己的檢查並設置操作後,由系統檢查前一個休眠進程是否可以在新信號量值的條件下完成相應的檢查和設置操作。這樣,通過信號量,就可以協調多個進程的操作。信號量可用來實現所謂的“關鍵段”。關鍵段指同一時刻只能有一個進程執行其中代碼的代碼段。也可用信號量解決經典的“生產者――消費者”問題。這一問題可以描述如下:兩個進程共用一個公共的、固定大小的緩衝區。其中的一個進程,即生產者,向緩衝區放入資訊,另外一個進程,即消費者,從緩衝區中取走資訊(該問題也可以一般化為m個生產者和n個消費者)。當生產者向緩衝區放入資訊時,如果緩衝區是滿的,則生產者進入休眠,而當消費者從緩衝區中拿走資訊後,可喚醒生產者;當消費者從緩衝區中取信息時,如果緩衝區為空,則消費者進入休眠,而當生產者向緩衝區寫入資訊後,可喚醒消費者。Linux利用semid_ds結構來表示SystemVIPC信號量,如圖5.10所示。和消息佇列類似,系統中所有的信號量組成了一個semary鏈表,該鏈表的每個節點指向一個semid_ds結構。從圖5.10可以看出,semid_ds結構的sem_base指向一個信號量數組,允許操作這些信號量數組的進程可以利用系統調用執行操作。系統調用可指定多個操作,每個操作由三個參數指定:信號量索引、操作值和操作標誌。信號量索引用來定位信號量數組中的信號量;操作值是要和信號量的當前值相加的數值。首先,Linux按如下的規則判斷是否所有的操作都可以成功:操作值和信號量的當前值相加大於0,或操作值和當前值均為0,則操作成功。如果系統調用中指定的所有操作中有一個操作不能成功時,則Linux會掛起這一進程。但是,如果操作標誌指定這種情況下不能掛起進程的話,系統調用返回並指明信號量上的操作沒有成功,而進程可以繼續執行。如果進程被掛起,Linux必須保存信號量的操作狀態並將當前進程放入等待佇列。為此,Linux在堆疊中建立一個sem_queue結構並填充該結構。新的sem_queue結構添加到信號量對象的等待佇列中(利用sem_pending和sem_pending_last指針)。當前進程放入sem_queue結構的等待佇列中(sleeper)後調用調度程式選擇其他的進程運行。如果所有的信號量操作都成功了,當前進程可繼續運行。在此之前,Linux負責將操作實際應用於信號量佇列的相應元素。這時,Linux檢查任何等待的或掛起的進程,看它們的信號量操作是否可以成功。如果這些進程的信號量操作可以成功,Linux就會將它們從掛起佇列中移去,並將它們的操作實際應用於信號量佇列。同時,Linux會喚醒休眠進程,以便可在下次調度程式運行時可以運行這些進程。當新的信號量操作應用於信號量佇列之後,Linux會接著檢查掛起佇列,直到沒有操作可成功,或沒有掛起進程為止。和信號量操作相關的概念還有“死鎖”。當某個進程修改了信號量而進入關鍵段之後,卻因為崩潰而沒有退出關鍵段,這時,其他被掛起在信號量上的進程永遠得不到運行機會,這就是所謂的死鎖。Linux通過維護一個信號量數組的調整鏈表來避免這一問題。5.5.3共用記憶體

由於進程的虛擬地址可以映射到任意一處物理地址,這樣,如果兩個進程的虛擬地址映射到同一物理地址,這兩個進程就可以利用這一虛擬地址進行通訊。但是,一旦記憶體被共用之後,對共用記憶體的訪問同步需要由其他IPC機制,例如信號量來實現。Linux中的共用記憶體通過訪問鍵來訪問,並進行訪問許可權的檢查。共用記憶體對象的創建者負責控制訪問許可權以及訪問鍵的公有或私有特性。如果具有足夠的許可權,也可以將共用記憶體鎖定到物理記憶體中。圖5.11是Linux中共享記憶體對象的結構。和消息佇列及信號量類似,Linux中也有一個鏈表維護著所有的共用記憶體對象。圖5.11中的共用記憶體對象的結構元素可說明如下:(1)shm_segsz:共用記憶體的大小;(2)times:使用共用記憶體的進程數目;(3)attaches:描述被共用的物理記憶體映射到各進程的虛擬記憶體區域。(4)shm_npages:共用虛擬記憶體頁的數目;圖5.11Sy

文档评论(0)

子不语 + 关注
官方认证
服务提供商

平安喜乐网络服务,专业制作各类课件,总结,范文等文档,在能力范围内尽量做到有求必应,感谢

认证主体菏泽喜乐网络科技有限公司
IP属地未知
统一社会信用代码/组织机构代码
91371726MA7HJ4DL48

1亿VIP精品文档

相关文档