學生實驗報告
實驗課名稱: 計算機作業系統
實驗專案名稱: 程序間通訊實驗
專業名稱: 電腦科學與技術
一.實驗目的:
linux系統的程序通訊機構(ipc)允許在任意程序間大批量地交換資料。本實驗的目的是了解和熟悉linux支援的訊息通訊機制、共享儲存區機制及資訊量機制。
二.實驗要求:
閱讀linux系統的msg.c、sem.c和shm.c等原始碼檔案,熟悉linux的三種機制。
三.實驗內容:
(1)訊息的建立,傳送和接收。
①使用系統呼叫msgget(),msgsnd(),msgrev()及msgctl()編制一長度為1k的訊息的傳送和接收程式。
②觀察上面程式,說明控制訊息佇列系統呼叫msgctl()在此起什麼作用?
(2)共享儲存區的建立、附接和斷接。
使用系統呼叫shmget(),shmat(),sgmdt(),shmctl(),編制乙個與上述功能相同的程式。
(3)比較上述(1),(2)兩種訊息通訊機制中資料傳輸的時間。
四.演算法描述:
1.server建立乙個 key 為75的訊息佇列,等待其它程序發來的訊息。當遇到型別為 1的訊息,則作為結束訊號,取消該佇列,並退出server。server每接收到乙個訊息後顯示一句「(server)received。」 client使用 key為75的訊息佇列,先後傳送型別從10到1的訊息,然後退出。最後乙個訊息,即是 server端需要的結束訊號。client 每傳送一條訊息後顯示一句「(client)sent」。
2.為了便於操作 和觀察結果,用乙個 程式為「引子」,先後fork( )兩個子程序,server和 client,進行通訊。 server端建立乙個key為75的共享區,並將第乙個位元組置為-1.作為資料空的標誌.等待其他程序發來的訊息.當該位元組的值發生變化時,表示收到了該訊息,進行處理.然後再次把它的值設為-1,如果遇到的值為0,則視為結束訊號,取消該佇列,並退出server。server每接收一次資料後顯示「(server)received」。client端建立乙個key為75的共享區,當共享取得第乙個位元組為-1時,server端空閒,可傳送請求。client隨即填入10到1。期間等待server端再次空閒。進行完這些操作後,client退出。client每傳送一次資料後顯示「(client)sent」。
五.執行結果與分析:
《結果》
執行的結果和預想的完全一樣。但在執行的過程中, 發現每當client 傳送一次資料後,server 要等大約0.1 秒才有響應。同樣,之後client 又需要等待大約0.1 秒才傳送下乙個
資料。《分析》
出現上述的應答延遲的現象是程式設計的問題。當client 端傳送了資料後,並沒有任何措施通知server 端資料已經發出,需要由client 的查詢才能感知。此時,client 端並有放棄系統的控制權, 仍然占用cpu的時間片。只有當系統進行排程時, 切換到了server程序,再進行應答。這個問題,也同樣存在於server 端到client 的應答過程之中。
3 比較兩種訊息通訊機制中的資料傳輸的時間
由於兩種機制實現的機理和用處都不一樣, 難以直接進行時間上的比較。如果比較其效能,應更加全面的分析。
(1) 訊息佇列的建立比共享區的設立消耗的資源少. 前者只是乙個軟體上設定的問題, 後者需要對硬體操作, 實現記憶體的映像, 當然控制起來比前者複雜. 如果每次都重新進行佇列或共享的建立, 共享區的設立沒有什麼優勢。
(2) 當訊息佇列和共享區建立好後, 共享區的資料傳輸, 受到了系統硬體的支援, 不耗費多餘的資源; 而訊息傳遞, 由軟體進行控制和實現, 需要消耗一定的cpu資源. 從這個意義上講, 共享區更適合頻繁和大量的資料傳輸
(3) 訊息的傳遞, 自身就帶有同步的控制. 當等到訊息的時候, 程序進入睡眠狀態, 不再消耗cpu資源. 而共享佇列如果不借助其他機制進行同步, 接受資料的一方必須進行不斷的查詢, 白白浪費了大量的cpu資源. 可見訊息方式的使用更加靈活
六.源程式:
1.訊息的建立、傳送和接收
#include
#include
#include
#include
#include
#include
#define msgkey 75
struct msgform
msg;
int msgqid,i;
void client()
}void server()
while(msg.mtype!=1); www.docin.com msgctl(msgqid,ipc_rmid,0);
}void main()
2.共享儲存區的建立、附接和斷接
#include
#include
#include
#include
#include
#include
#include
#include
#define shmkey 75
int shmid,i;
int *addr;
void client()
}void server()
while(*addr);
shmctl(shmid,ipc_rmid,0);
}void main()
作業系統 程序通訊
競爭條件 兩個或多個程序讀寫某些共享資料,而最後的結果取決於程序執行的精確時序,稱為競爭條件。凡涉及到資源的共享時就容易發生這樣的事情。解決的辦法是設立臨界區,讓程序互斥地訪問共享資源。乙個好的避免競爭條件的方案,必須滿足4個條件 任何兩個程序不能同時處於臨界區。不應對cpu的速度和數量做任何假設。...
作業系統 程序通訊
常用通訊模型 間接 通過作業系統核心 直接阻塞,被認為是同步的 非阻塞,被認為是非同步的 接收到訊號可能 類似軟中斷,停止正常執行。不適合傳遞資料 因為它傳遞的資訊很小,只是一位。僅起到通知作用。效率高。系統處理過程 註冊針對某個訊號的handler 一旦產生了訊號,作業系統收到訊號後,執行在核心態...
作業系統 程序通訊
程序通訊 程序之間的資訊交換 程序是分配系統資源的單位 包括記憶體位址空間 因此各程序擁有的記憶體位址空間相互獨立 共享儲存 1 兩個程序對共享空間的訪問必須是互斥的 2 基於資料結構的共享,慢是低階通訊 3 基於儲存區的共享,高階通訊,在記憶體中畫出一塊共享儲存區,資料形式儲存位置都由程序控制 訊...