熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> 操作系統 >> 正文

進程的同步與通信:消息機制

2022-06-13   來源: 操作系統 

   消息機制

   消息和消息隊列

  ) 消息(message)

  ) 消息隊列

  當一個進程收到由其它多個進程發來的消息時可將這些消息排成一個消息隊列每個消息隊列有一個稱為關鍵字key的名稱它是由用戶指定的每個消息隊列還有一個消息隊列描述符其作用與用戶文件描述符一樣以方便用戶和系統對消息隊列的訪問在一個系統中可能有若干個消息隊列由所有的消息隊列的頭標組成一個頭標數組

   消息隊列的建立與操作

  ) 消息隊列的建立

  在一個進程要利用消息機制與其它進程通信之前應利用系統調用msgget( )先建立一個指名的消息隊列對於該系統調用核心將搜索消息隊列頭標表確定是否有指定名字的消息隊列若無核心將分配一個新的消息隊列頭標並對它進行初始化然後給用戶返回一個消息隊列描述符 否則它只是檢查該消息隊列的許可權後便返回

  ) 消息隊列的操縱

  () 用於查詢有關消息隊列的情況如隊列中的消息數目隊列中的最大字節數最後一個發送消息的進程的標識符發送時間等

  () 用於設置和改變有關消息隊列的屬性如改變消息隊列的用戶標識符或用戶組標識符消息隊列的許可權等

  () 消除消息隊列的標識符

   消息的發送和接收

  ) 消息的發送

  當進程要與其它進程通信時可利用msgsnd( )系統調用來發送消息對於msgsnd( )系統調用核心檢查消息隊列描述符和許可權是否合法消息長度是否超過系統規定的長度通過檢查後核心為消息分配消息數據區並將消息從用戶消息緩沖區拷貝到消息數據區分配消息首部將它鏈入消息隊列的末尾在消息首部中填寫消息的類型大小以及指向消息數據區的指針等還要修改消息隊列頭標中的數據(如消息隊列中的消息數字節數等然後喚醒在等待消息到來的睡眠進程

  ) 消息的接收

  進程可利用msgrcv( )系統調用從指定消息隊列中讀一個消息對於msgrcv( )系統調用是先由核心檢查消息隊列標識符和許可權繼而根據用戶指定的消息類型做相應的處理消息類型msgtyp的參數可能有三種情況當msgtyp=核心尋找消息隊列中的第一個消息並將它返回給調用進程當msgtyp為正整數時核心返回指定類型的第一個消息當msgtyp為負整數時核心應在其類型值小於或等於msgtyp絕對值的所有消息中選出類型值最低的第一個消息返回如果所返回消息的大小等於或小於用戶的請求核心便將消息正文拷貝到用戶區再從隊列中刪除該消息並喚醒睡眠的發送進程如果消息長度比用戶要求的大則系統返回出錯信息

——返回教材目錄

了解更多計算機相關基礎課程視頻


From:http://tw.wingwit.com/Article/program/czxt/201311/24314.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.