进程同步算法实现实验报告Linux,操作系统进程同步实验报告.doc
操作系統進程同步實驗報告
實驗三:進程同步實驗
一、實驗任務:
(1)掌握操作系統的進程同步原理;
(2)熟悉linux的進程同步原語;
(3)設計程序,實現經典進程同步問題。
二、實驗原理:
(1)P、V操作
PV操作由P操作原語和V操作原語組成(原語是不可中斷的過程),對信號量進行操作,具體定義如下:
P(S):①將信號量S的值減1,即S=S-1;
②如果S30,則該進程繼續執行;否則該進程置為等待狀態,排入等待隊列。
V(S):①將信號量S的值加1,即S=S+1;
②如果S>0,則該進程繼續執行;否則釋放隊列中第一個等待信號量的進程。
(2)信號量
信號量(semaphore)的數據結構為一個值和一個指針,指針指向等待該信號量的下一個進程。信號量的值與相應資源的使用情況有關。當它的值大于0時,表示當前可用資源的數量;當它的值小于0時,其絕對值表示等待使用該資源的進程個數。注意,信號量的值僅能由PV操作來改變。
一般來說,信號量S30時,S表示可用資源的數量。執行一次P操作意味著請求分配一個單位資源,因此S的值減1;當S<0時,表示已經沒有可用資源,請求者必須等待別的進程釋放該類資源,它才能運行下去。而執行一個V操作意味著釋放一個單位資源,因此S的值加1;若S£0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀態的進程,使之運行下去。
(3)linux的進程同步原語
①wait();阻塞父進程,子進程執行;
②#include
#include
key_t ftok (char*pathname, char proj);它返回與路徑pathname相對應的一個鍵值。
③int semget(key_t key, int nsems, int semflg)
參數key是一個鍵值,由ftok獲得,唯一標識一個信號燈集,用法與msgget()中的key相同;參數nsems指定打開或者新創建的信號燈集中將包含信號燈的數目;semflg參數是一些標志位。參數key和semflg的取值,以及何時打開已有信號燈集或者創建一個新的信號燈集與msgget()中的對應部分相同。該調用返回與健值key相對應的信號燈集描述字。調用返回:成功返回信號燈集描述字,否則返回-1。
④int semop(int semid, struct sembuf *sops, unsigned nsops);
semid是信號燈集ID,sops指向數組的每一個sembuf結構都刻畫一個在特定信號燈上的操作。nsops為sops指向數組的大小。
⑤int semctl(int semid,int semnum,int cmd,union semun arg)
該系統調用實現對信號燈的各種控制操作,參數semid指定信號燈集,參數cmd指定具體的操作類型;參數semnum指定對哪個信號燈操作,只對幾個特殊的cmd操作有意義;arg用于設置或返回信號燈信息。
三、實驗源程序:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PERM S_IRUSR|S_IWUSR
#define SEMKEY (key_t)0x200
typedef union _senum{
int val;
struct semid_ds *buf;
ushort *array;
}semun;
int semid;
static int count=0;
FILE *fp,*fp1,*fp2;
struct sembuf prmutex={0,-1,0},pwmutex={1,-1,0},ps={2,-1,0};
struct sembuf vrmutex={0,1,0},vwmutex={1,1,0},vs={2,1,0};
int initsem()
{
semun x;
x.val=1;
if((semid=semget(SEMKEY,3,0600|IPC_CREAT|IPC_EXCL))==-1)
{
if(errno==EEXIST)
s
總結
以上是生活随笔為你收集整理的进程同步算法实现实验报告Linux,操作系统进程同步实验报告.doc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux libodbc.so.1,C
- 下一篇: c语言自动生成球队名称,C语言实现队(循