本次實驗的基本內容是在linux 0.11的核心中實現訊號量,並向使用者提供使用訊號量的介面,使用者使用該介面解決乙個實際的程序同步問題。實驗的主要內容包括如下兩個部分:
在linux 0.11核心上(linux 0.11核心中沒有定義訊號量)實現訊號量,並建立相應的系統呼叫以供使用者使用。應提供的系統介面主要包括:
int createsemaphore(char * semname);
該操作用來在核心中建立乙個訊號量,輸入的引數是訊號量的名字,返回的是訊號量的乙個整數標識semid,訊號量是一種核心資源,不應該無限制的建立,所以在核心中訊號量可以被組織成乙個陣列,此時semid就是建立的訊號量在核心訊號量陣列中的下標。如果這個名為semname的訊號量已經建立,則返回這個已建立的訊號量的標識semid,也即多個具有相同名字的訊號量建立介面返回相同的返回值,即相同的semid
int setsemaphore(int semid, int value);
用來設定訊號量的值,其中semid是訊號量標識,value是要設定的訊號量值,該函式的返回值是訊號量的當前值。該介面通常用來設定訊號量的初值。
int waitsemaphore(int semid);
該函式就是訊號量的p操作,其功能就是對訊號量的值減1,如果其值小於0則令呼叫程序等待在訊號量semid上。
int signalsemaphore(int semid);
該函式就是訊號量的v操作,其功能就是對訊號量的值加1,如果其值小於等於0則令喚醒等待在訊號量semid上的程序。
在定義了訊號量的linux 0.11作業系統上編寫使用者程式來演示訊號量的作用。該使用者程式解決就是傳統的生產者—消費者問題,要求編寫的使用者程式完成下面的任務:
1.編寫的主程式演示生產者—消費者兩個程序的同步過程;
2.編寫的主程式建立兩個程序:生產者程序和消費者程序;
3.編寫生產者程序和消費者程序的**。
4.要求對比三種設定下的執行結果:
在linux-0.11/include/linux目錄下新建sem.h,定義訊號量的資料結構。sem.h的**如下
#ifndef _sem_h
#define _sem_h
#include #define semtable_len 20
#define sem_name_len 20
typedef struct semaphore sem_t;
extern sem_t semtable[semtable_len];
#endif
**截圖如下:
在linux-0.11/kernel目錄下,新建實現訊號量函式的源**檔案sem.c。
#include #include #include #include #include #include #include #include #include //#include sem_t semtable[semtable_len];
int cnt = 0;
sem_t *sys_sem_open(const char *name,unsigned int value)
int sys_sem_post(sem_t *sem)
int sys_sem_unlink(const char *name)
}else /* 子程序來建立消費者 */
printf("pid %d:\tconsumer %d consumes item %d\n", pid, nr_consumers-i+1, item_used);
fflush(stdout);
sem_post(empty); /* 喚醒生產者程序 */
sem_post(metux);
if(item_used == nr_items) /* 如果已經消費完最後乙個商品,則結束 */
goto ok;}}
}}ok: close(fi);
close(fo);
return 0;
}
將此檔案移動到usr/root目錄下,此目錄需要掛載hdc才可以訪問。移動成功之後直接重新編譯linux並在虛擬環境內執行。
執行linux-0.11之後,首先編譯pc.c,使用命令gcc -o pc pc.c,隨後執行pc,使用命令./pc > sem_output即可,最終在虛擬環境內輸入sync把修改的資料寫入磁碟。
首先掛載hdc,然後進入usr/root目錄並在終端內執行sudo less sem_output命令,可看到下圖結果:
刪除pc.c檔案中關於訊號量的**,重新編譯執行後得出如下結果
在有無訊號量的不同條件下對比執行結果後可以發現,如果去掉所有與訊號量有關的**,編譯執行程式之後可以發現輸出的數字順序完全混亂。
訊號量不存在的情況下,程序之間無法同步或者協作,造成此種情況的有如下原因:
作業系統訊號量
本文將針對較為簡單的生產者消費者問題,給出利用訊號量解決問題的方法。生產者 能產生並投放資源的程序 消費者 單純使用 消耗 資源的程序 問題表述 一組 生產者程序和一 組消費者程序 設每組有多個程序 通過緩衝區發生聯絡。生產者程序將生產的產品 資料 訊息等統稱為產品 送入緩衝區,消費者程序從中取出產...
作業系統 訊號量
代表了一類物理資源,是相應的物理資源的抽象,通常為整型或結構體型,除了初始化之外,其他情況下只能使用p v進行操作 執行一次p s 則s.value減一,若執行p s 之後s.value 0,則表示該類資源可用,否則不可用 執行一次v s 則s.value加一,若執行v操作以後,s.value的值仍...
作業系統訊號量和管程
同步互斥回顧 併發問題 競爭條件 競態條件 同步確保執行緒同步 訊號量是抽象資料型別 訊號量實現一般有兩種 訊號量可以用在兩個方面 用二值訊號量實現互斥功能 mutex new semaphore 1 初始化乙個值為1的訊號量作為乙個鎖 mutex p 訊號量減1 執行臨界區 此時如果有其他執行緒要...