操作系統(tǒng)實(shí)驗(yàn)題目及實(shí)驗(yàn)報(bào)告要求_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)題目及實(shí)驗(yàn)報(bào)告要求_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)題目及實(shí)驗(yàn)報(bào)告要求_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)題目及實(shí)驗(yàn)報(bào)告要求_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)題目及實(shí)驗(yàn)報(bào)告要求_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí) 驗(yàn) 報(bào) 告實(shí)驗(yàn)課程: 操作系統(tǒng)實(shí)驗(yàn) 學(xué)生姓名: 王橋 學(xué) 號(hào): 6100412024 專業(yè)班級(jí): 計(jì)科123班 2014年 6月3 日目 錄一、 實(shí)驗(yàn)一 1二、 實(shí)驗(yàn)二 7三、 實(shí)驗(yàn)三 21四、 實(shí)驗(yàn)四 28五、 實(shí)驗(yàn)五 33南昌大學(xué)實(shí)驗(yàn)報(bào)告 -(1)操作系統(tǒng)安裝及其接口環(huán)境學(xué)生姓名: 王橋 學(xué) 號(hào): 6100412024 專業(yè)班級(jí): 計(jì)科123班 實(shí)驗(yàn)類型: 驗(yàn)證 綜合 設(shè)計(jì) 創(chuàng)新 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績(jī): 一、實(shí)驗(yàn)?zāi)康氖煜indows/Linux操作系統(tǒng)的安裝過(guò)程與安裝方法,并掌握該操作系統(tǒng)所提供的用戶接口環(huán)境,并為后續(xù)實(shí)驗(yàn)做好編程環(huán)境準(zhǔn)備。二、實(shí)驗(yàn)內(nèi)容1、熟悉Windows/Linu

2、x操作系統(tǒng)的安裝過(guò)程與安裝方法,并掌握該操作系統(tǒng)所提供的用戶接口環(huán)境,通過(guò)系統(tǒng)提供的用戶管理程序、查看系統(tǒng)中的用戶情況、進(jìn)程、線程、內(nèi)存使用情況等,學(xué)會(huì)使用它進(jìn)行監(jiān)視進(jìn)程的狀況、系統(tǒng)資源的使用情況及用戶情況。并為后續(xù)實(shí)驗(yàn)做好編程環(huán)境準(zhǔn)備。2、用C語(yǔ)言編寫一小段程序,使其可以通過(guò)某個(gè)系統(tǒng)調(diào)用來(lái)獲得OS提供的某種服務(wù)。三、實(shí)驗(yàn)要求1 了解所安裝的操作系統(tǒng)對(duì)軟硬件資源的具體要求;2 機(jī)器最低硬件配置要求;3 操作系統(tǒng)所提供的用戶接口環(huán)境的熟悉;4 了解主要BIOS CMOS參數(shù)的含義及其設(shè)置方法;5 掌握程序編寫中系統(tǒng)調(diào)用的方法。四、主要實(shí)驗(yàn)步驟1、選擇語(yǔ)言為中文:2)選擇第一項(xiàng)“試用 Ubuntu

3、 而不改變計(jì)算機(jī)中的任何內(nèi)容”,進(jìn)入 live 桌面后點(diǎn)擊“安裝”圖標(biāo)。1)選擇語(yǔ)言,可以根據(jù)你自己的喜好選擇,當(dāng)然是選擇中文(簡(jiǎn)體)了2)選擇時(shí)區(qū),默認(rèn)上海就可以3)選擇鍵盤布局,一般默認(rèn)U.S.A 就可以4)準(zhǔn)備分區(qū),這是安裝過(guò)程中最重要的一步。選擇手動(dòng)。5)準(zhǔn)備分區(qū),這是安裝過(guò)程中最重要的一步。6)填寫用戶信息。7)文件遷移向?qū)Вc(diǎn)擊下一頁(yè)。8)準(zhǔn)備安裝。 9)安裝完成,重新啟動(dòng)。10)界面如下南昌大學(xué)實(shí)驗(yàn)報(bào)告 -(2)編程模擬進(jìn)程間的同步和互斥學(xué)生姓名: 王橋 學(xué) 號(hào): 6100412024 專業(yè)班級(jí): 計(jì)科123 實(shí)驗(yàn)類型: 驗(yàn)證 綜合 設(shè)計(jì) 創(chuàng)新 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績(jī): 一、實(shí)驗(yàn)?zāi)?/p>

4、的通過(guò)實(shí)驗(yàn)加強(qiáng)對(duì)進(jìn)程同步和互斥的理解,并掌握進(jìn)程(線程)的創(chuàng)建和調(diào)用方法。學(xué)會(huì)使用信號(hào)量解決資源共享問(wèn)題。學(xué)生可以自己選擇在Windows或Linux系統(tǒng)下編寫。二、實(shí)驗(yàn)內(nèi)容1以下為L(zhǎng)inux系統(tǒng)下參考程序,請(qǐng)編譯、運(yùn)行并觀察程序的輸出,并分析實(shí)驗(yàn)結(jié)果,寫出實(shí)驗(yàn)報(bào)告。#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<time.h>#include<sys/types.h>#include<sys/wait.h>#include<linux/se

5、m.h>#define NUM_PROCS 5#define SEM_ID 250#define FILE_NAME "/tmp/sem_aaa"#define DELAY 4000000void update_file(int sem_set_id, char *file_path, int number)struct sembuf sem_op;FILE *file;/等待信號(hào)量的數(shù)值變?yōu)榉秦?fù)數(shù),此處設(shè)為負(fù)值,相當(dāng)于對(duì)信號(hào)量進(jìn)行P操作sem_op.sem_num=0;sem_op.sem_op=-1;sem_op.sem_flg=0;semop(sem_set_i

6、d,&sem_op,1); /*操作一組信號(hào)sem_set_id是進(jìn)程的標(biāo)識(shí)符,sem_op是結(jié)構(gòu)指針。sem_op:如果其值為正數(shù),該值會(huì)加到現(xiàn)有的信號(hào)內(nèi)含值中。通常用于釋放所控資源的使用權(quán);如果sem_op的值為負(fù)數(shù),而其絕對(duì)值又大于信號(hào)的現(xiàn)值,操作將會(huì)阻塞,直到信號(hào)值大于或等于sem_op的絕對(duì)值。通常用于獲取資源的使用權(quán);如果sem_op的值為0,則操作將暫時(shí)阻塞,直到信號(hào)的值變?yōu)?。*/寫文件,寫入的數(shù)值是當(dāng)前進(jìn)程的進(jìn)程號(hào)file=fopen(file_path,"w");if(file)/臨界區(qū)fprintf(file,"%dn",n

7、umber);printf("%dn",number);fclose(file);/發(fā)送信號(hào),把信號(hào)量的數(shù)值加1,此處相當(dāng)于對(duì)信號(hào)量進(jìn)行V操作sem_op.sem_num=0;sem_op.sem_op=1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1);/子進(jìn)程寫文件void do_child_loop(int sem_set_id,char *file_name)pid_t pid=getpid();int i,j;for(i=0;i<3;i+)update_file(sem_set_id,file_name,pi

8、d);for(j=0;j<4000000;j+); int main(int argc,char *argv)int sem_set_id; /信號(hào)量集的IDunion semun sem_val; /信號(hào)量的數(shù)值,用于semctl()int child_pid;int i;int rc;/ 建立信號(hào)量集,ID是250,其中只有一個(gè)信號(hào)量sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600);if(sem_set_id=-1)perror("main: semget");exit(1);/把第一個(gè)信號(hào)量的數(shù)值設(shè)置為1sem_val.val

9、=1;rc=semctl(sem_set_id,0,SETVAL,sem_val);if(rc=-1)perror("main:semctl");exit(1);/建立一些子進(jìn)程,使它們可以同時(shí)以競(jìng)爭(zhēng)的方式訪問(wèn)信號(hào)量for(i=0;i<NUM_PROCS;i+)child_pid=fork();switch(child_pid)case -1: perror("fork");case 0: /子進(jìn)程do_child_loop(sem_set_id,FILE_NAME);exit(0);default: /父進(jìn)程接著運(yùn)行break;/等待子進(jìn)程結(jié)束f

10、or(i=0;i<NUM_PROCS;i+)int child_status;wait(&child_status);printf("main:we're donen");fflush(stdout);return 0;gcc o 1 1.c (編譯、鏈接程序) ./1(執(zhí)行程序)2模擬PV操作同步機(jī)構(gòu),且用PV操作解決生產(chǎn)者消費(fèi)者問(wèn)題。模擬PV操作同步機(jī)構(gòu),且用PV操作解決生產(chǎn)者消費(fèi)者問(wèn)題。提示:(1) PV操作同步機(jī)構(gòu),由P操作原語(yǔ)和V操作原語(yǔ)組成,它們的定義如下:P操作原語(yǔ)P(s):將信號(hào)量s減去1,若結(jié)果

11、小于0,則執(zhí)行原語(yǔ)的進(jìn)程被置成等待信號(hào)量s的狀態(tài)。V操作原語(yǔ)V(s):將信號(hào)量s加1,若結(jié)果不大于0,則釋放一個(gè)等待信號(hào)量s的進(jìn)程。這兩條原語(yǔ)是如下的兩個(gè)過(guò)程:procedure p (var s: semaphore);begin s:=s-1;if s<0 then W(s)end pprocedure v (var s: semaphore);begin s: =s+1;if s<=0 then R(s)end V其中W(s)表示將調(diào)用過(guò)程的進(jìn)程置為等待信號(hào)量s的狀態(tài);R(s)表示釋放一個(gè)等待信號(hào)量s的進(jìn)程。在系統(tǒng)初始化時(shí)應(yīng)把semaphore定義為某個(gè)類型,為簡(jiǎn)單起見(jiàn),在模

12、擬實(shí)驗(yàn)中可把上述的semaphore直接改成integer。(2)生產(chǎn)者消費(fèi)者問(wèn)題。假定有一個(gè)生產(chǎn)者和消費(fèi)者,生產(chǎn)者每次生產(chǎn)一件產(chǎn)品,并把生產(chǎn)的產(chǎn)品存入共享緩沖器以供消費(fèi)者取走使用。消費(fèi)者每次從緩沖器內(nèi)取出一件產(chǎn)品去消費(fèi)。禁止生產(chǎn)者將產(chǎn)品放入已滿的緩沖器內(nèi),禁止消費(fèi)者從空緩沖器內(nèi)取產(chǎn)品。假定緩沖器內(nèi)可同時(shí)存放10件產(chǎn)品。那么,用PV操作來(lái)實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者之間的同步,生產(chǎn)者和消費(fèi)者兩個(gè)進(jìn)程的程序如下:B:array 0.9 of products;s1,s2: semaphore;IN, out; integer;IN:=0;out:=0;cobeginprocedure producer;c

13、: products;beginL1:produce (c);p (s1);BIN:=C;IN:=(IN+1)mod 10;v(s2);goto L1end;procedure consumer;x: products;beginL2:P(s2);x:=Bout;out:=(out+1) mod 10;v(s1);consume(x);goto L2end;coend其中的semaphore和products是預(yù)先定義的兩個(gè)類型,在模擬實(shí)現(xiàn)中semaphore用integer或char等代替。(3)進(jìn)程控制塊PCB。為了紀(jì)錄進(jìn)程執(zhí)行時(shí)的情況,以及進(jìn)程讓出處理器后的狀態(tài),斷點(diǎn)等信息,每個(gè)進(jìn)程都有

14、一個(gè)進(jìn)程控制塊PCB。在模擬實(shí)驗(yàn)中,假設(shè)進(jìn)程控制塊的結(jié)構(gòu)如圖4-1。其中進(jìn)程的狀態(tài)有:運(yùn)行態(tài)、就緒態(tài)、等待態(tài)和完成態(tài)。當(dāng)進(jìn)程處于等待態(tài)時(shí),在進(jìn)程控制塊PCB中要說(shuō)明進(jìn)程等待原因(在模擬實(shí)驗(yàn)中進(jìn)程等待原因?yàn)榈却盘?hào)量s1或s2);當(dāng)進(jìn)程處于等待態(tài)或就緒態(tài)時(shí),PCB中保留了斷點(diǎn)信息,一旦進(jìn)程再度占有處理器則就從斷點(diǎn)位置繼續(xù)運(yùn)行;當(dāng)進(jìn)程處于完成狀態(tài),表示進(jìn)程執(zhí)行結(jié)束。進(jìn)程名狀態(tài)等待原因斷點(diǎn) 圖4-1 進(jìn)程控制塊結(jié)構(gòu)(4)處理器的模擬。計(jì)算機(jī)硬件提供了一組機(jī)器指令,處理器的主要職責(zé)是解釋執(zhí)行機(jī)器指令。為了模擬生產(chǎn)者和消費(fèi)者進(jìn)程的并發(fā)執(zhí)行,我們必須模擬一組指令和處理器職能。模擬的一組指令見(jiàn)圖4-2,其中

15、每條指令的功能由一個(gè)過(guò)程來(lái)實(shí)現(xiàn)。用變量PC來(lái)模擬“指令計(jì)數(shù)器”,假設(shè)模擬的指令長(zhǎng)度為1,每執(zhí)行一條模擬指令后,PC加1,指出下一條指令地址。使用模擬的指令,可把生產(chǎn)者和消費(fèi)者進(jìn)程的程序表示為圖4-3的形式。定義兩個(gè)一維數(shù)組PA0.4和SA0.4,每一個(gè)PAi存放生產(chǎn)者程序中的一條模擬指令執(zhí)行的入口地址;每個(gè)SAi存放消費(fèi)者程序中的一條模擬指令執(zhí)行的入口地址。于是模擬處理器執(zhí)行一條指令的過(guò)程為:取出PC之值,按PAPC 或SAPC得模擬指令執(zhí)行的入口地址,將PC之值加1,轉(zhuǎn)向由入口地址確定的相應(yīng)的過(guò)程執(zhí)行。(5)程序設(shè)計(jì)本實(shí)驗(yàn)中的程序由三部分組成:初始化程序、處理器調(diào)度程序、模擬處理器指令執(zhí)行程

16、序。各部分程序的功能及相互間的關(guān)系由圖4-4至圖4-7指出。模擬的指令功能P(s)執(zhí)行P操作原語(yǔ)V(s)執(zhí)行v操作原語(yǔ)putBIN:=product;IN:=(IN+1) mod 10GETX:=Bout;out:=(out+1) mod 10produce輸入一個(gè)字符放入C中consume打印或顯示x中的字符GOTO LPC: LNOP空操作圖4-2 模擬的處理器指令序號(hào)生產(chǎn)者程序消費(fèi)者程序0produceP(s2)1P(s1)GET2PUTV(s1)3V(s2)consume4goto 0goto 0圖4-3 生產(chǎn)者和消費(fèi)者程序初始化程序:模擬實(shí)驗(yàn)的程序從初始化程序入口啟動(dòng),初始化工作包括

17、對(duì)信號(hào)量S1、S2賦初值,對(duì)生產(chǎn)者、消費(fèi)者進(jìn)程的PCB初始化。初始化后轉(zhuǎn)向處理器調(diào)度程序,其流程如圖4-4處理器調(diào)度程序:在計(jì)算機(jī)系統(tǒng)中,進(jìn)程并發(fā)執(zhí)行時(shí),任一進(jìn)程占用處理器執(zhí)行完一條指令后就有可能被打斷而讓出處理器由其他進(jìn)程運(yùn)行。故在模擬系統(tǒng)中也類似處理,每當(dāng)執(zhí)行一條模擬的指令后,保護(hù)當(dāng)前進(jìn)程的現(xiàn)場(chǎng),讓它成為非運(yùn)行狀態(tài),由處理器調(diào)度程序按隨機(jī)數(shù)再選擇一個(gè)就緒進(jìn)程占用處理器運(yùn)行。處理器調(diào)度程序流程見(jiàn)圖4-5。開(kāi)始初始化信號(hào)量S1,S2S1:=10,S2:=0處理器調(diào)度程序生產(chǎn)者和消費(fèi)者進(jìn)程的PCB中狀態(tài)為就緒,斷點(diǎn)為0將現(xiàn)行進(jìn)程置為生產(chǎn)者進(jìn)程,PC:=0結(jié)束圖 4-4 初始化流程模擬處理器指令執(zhí)

18、行程序:按“指令計(jì)數(shù)器”PC之值執(zhí)行指定的質(zhì)量,且PC加1指向下一條指令。模擬處理器指令執(zhí)行的程序流程見(jiàn)圖4-6和4-7。另外,為了使得模擬程序有一個(gè)結(jié)束條件,在圖4-6中附加了“生產(chǎn)者運(yùn)行結(jié)束”的條件判斷,模擬時(shí)可以采取人工選擇的方法實(shí)現(xiàn)。圖4-7給出了P(S)和V(S)模擬指令執(zhí)行過(guò)程的流程。其他模擬指令的執(zhí)行過(guò)程已在圖4-2中指出。四、實(shí)驗(yàn)報(bào)告(1) 實(shí)驗(yàn)題目。(2) 打印源程序并附上注釋。(3) 從鍵盤上輸入一組字符,由生產(chǎn)者每次讀入一個(gè)字符供消費(fèi)者輸出。運(yùn)行模擬程序,打印依次讀入的字符和消費(fèi)者輸出的字符。(4) 把生產(chǎn)者和消費(fèi)者進(jìn)程中的P操作、V操作都改成空操作指令,觀察在兩者不同步

19、的情況下可能出現(xiàn)的與時(shí)間有關(guān)的錯(cuò)誤。打印依次讀入的字符和消費(fèi)者輸出的字符。開(kāi)始隨即選擇就緒進(jìn)程作為現(xiàn)行進(jìn)程模擬處理器指令執(zhí)行程序?qū)F(xiàn)行進(jìn)程狀態(tài)改為運(yùn)行態(tài)現(xiàn)行進(jìn)程PCB的斷點(diǎn)值=>PC結(jié)束保護(hù)現(xiàn)場(chǎng),PC=>當(dāng)前進(jìn)程PCB的斷點(diǎn)有就緒進(jìn)程?否是圖4-5處理器調(diào)度程序流程P(s)GOTO空操作PutGETproduceconsumeV(s)開(kāi)始j:=PC按j轉(zhuǎn)向各模擬指令對(duì)應(yīng)的過(guò)程現(xiàn)行進(jìn)程為生產(chǎn)者?否是j:=SAij:=PAiPC:=i+1置現(xiàn)行進(jìn)程為就緒態(tài)返回生產(chǎn)者運(yùn)行結(jié)束?置生產(chǎn)者進(jìn)程為完成態(tài)是否圖 4-6 模擬處理器指令執(zhí)行開(kāi)始SS+1將調(diào)用V(s)過(guò)程的進(jìn)程置為就緒找一個(gè)等待s信

20、號(hào)量的進(jìn)程置為就緒態(tài)S<0返回否是開(kāi)始SS-1將調(diào)用P(s)過(guò)程的進(jìn)程置為就緒將調(diào)用P(s)過(guò)程的進(jìn)程置為等待信號(hào)量s的狀態(tài)S<0返回否是(1)模擬P(S) (2)模擬V(S)圖 4-7 模擬PV操作的執(zhí)行三、實(shí)驗(yàn)要求1、 linux操作系統(tǒng)2、 Windows操作系統(tǒng)四、主要實(shí)驗(yàn)步驟linux操作系統(tǒng)下的操作步驟: gedit semaphore.c (編輯程序)gcc o semaphore semaphore.c (編譯、鏈接程序)./semaphore(執(zhí)行程序)生產(chǎn)者和消費(fèi)者的代碼:#include <iostream>const unsigned short

21、 SIZE_OF_BUFFER = 5; /緩沖區(qū)長(zhǎng)度unsigned short ProductID = 0; /產(chǎn)品號(hào)unsigned short ConsumeID = 0; /將被消耗的產(chǎn)品號(hào)unsigned short in = 0; /產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個(gè)循環(huán)隊(duì)列bool g_continue = true; /控制程序結(jié)束HANDLE g_hMutex; /用于線程間的互斥HANDLE g_hFullSemaphore; /當(dāng)緩沖區(qū)

22、滿時(shí)迫使生產(chǎn)者等待HANDLE g_hEmptySemaphore; /當(dāng)緩沖區(qū)空時(shí)迫使消費(fèi)者等待DWORD WINAPI Producer(LPVOID); /生產(chǎn)者線程DWORD WINAPI Consumer(LPVOID); /消費(fèi)者線程int main() /創(chuàng)建各個(gè)互斥信號(hào) g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphor

23、e(NULL,0,SIZE_OF_BUFFER-1,NULL); /調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個(gè)數(shù)多于消費(fèi)者個(gè)數(shù)時(shí), /生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者;反之,消費(fèi)者經(jīng)常等待 const unsigned short PRODUCERS_COUNT = 3; /生產(chǎn)者的個(gè)數(shù) const unsigned short CONSUMERS_COUNT = 1; /消費(fèi)者的個(gè)數(shù) /總的線程數(shù) const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT;

24、 /各線程的handle DWORD producerIDCONSUMERS_COUNT; /生產(chǎn)者線程的標(biāo)識(shí)符 DWORD consumerIDTHREADS_COUNT; /消費(fèi)者線程的標(biāo)識(shí)符 /創(chuàng)建生產(chǎn)者線程 for (int i=0;i<PRODUCERS_COUNT;+i) hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /創(chuàng)建消費(fèi)者線程int i; for ( i=0;i<CONSUMERS_COUNT;+i) hThreads

25、PRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi); if (hThreadsi=NULL) return -1; while(g_continue) if(getchar() /按回車后終止程序運(yùn)行 g_continue = false; return 0;/生產(chǎn)一個(gè)產(chǎn)品。簡(jiǎn)單模擬了一下,僅輸出新產(chǎn)品的ID號(hào)void Produce() std:cerr << "Producing " << +ProductID << " . &quo

26、t; std:cerr << "Succeed" << std:endl;/把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)void Append() std:cerr << "Appending a product . " g_bufferin = ProductID; in = (in+1)%SIZE_OF_BUFFER; std:cerr << "Succeed" << std:endl; /輸出緩沖區(qū)當(dāng)前的狀態(tài) for (int i=0;i<SIZE_OF_BUFFER;+i) std

27、:cout << i <<": " << g_bufferi; if (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費(fèi)" std:cout << std:endl; /從緩沖區(qū)中取出一個(gè)產(chǎn)品void Take() std:cerr << "Taking a product . " ConsumeID = g_bufferout; out = (out+1

28、)%SIZE_OF_BUFFER; std:cerr << "Succeed" << std:endl; /輸出緩沖區(qū)當(dāng)前的狀態(tài) for (int i=0;i<SIZE_OF_BUFFER;+i) std:cout << i <<": " << g_bufferi; if (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費(fèi)" std:cout <

29、;< std:endl; /消耗一個(gè)產(chǎn)品void Consume() std:cerr << "Consuming " << ConsumeID << " . " std:cerr << "Succeed" << std:endl;/生產(chǎn)者DWORD WINAPI Producer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleO

30、bject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0;/消費(fèi)者DWORD WINAPI Consumer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume

31、(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0;六、 實(shí)驗(yàn)數(shù)據(jù)及處理結(jié)果七、 實(shí)驗(yàn)體會(huì)或?qū)Ω倪M(jìn)實(shí)驗(yàn)的建議實(shí)驗(yàn)還是挺難的,而且是第一個(gè)實(shí)驗(yàn),所以參考了百度的代碼。南昌大學(xué)實(shí)驗(yàn)報(bào)告 -(3)編程實(shí)現(xiàn)銀行家安全算法學(xué)生姓名: 王橋 學(xué) 號(hào): 6100412024 專業(yè)班級(jí): 計(jì)科123 實(shí)驗(yàn)類型: 驗(yàn)證 綜合 設(shè)計(jì) 創(chuàng)新 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績(jī): 一、實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)實(shí)驗(yàn)加強(qiáng)對(duì)銀行家安全算法的理解和掌握。二、實(shí)驗(yàn)內(nèi)容熟悉避免死鎖發(fā)生的方法,死鎖與安全序列的關(guān)系,編程實(shí)現(xiàn)

32、銀行家算法,要求輸出進(jìn)程的安全序列。三、實(shí)驗(yàn)要求1、需寫出設(shè)計(jì)說(shuō)明;2、設(shè)計(jì)實(shí)現(xiàn)代碼及說(shuō)明3、運(yùn)行結(jié)果;四、主要實(shí)驗(yàn)步驟#include <stdio.h>#include <stdlib.h>#include <string.h>int max53; /最大需求矩陣開(kāi)始定義銀行家算法中需要用到的數(shù)據(jù),定義了5個(gè)進(jìn)程,3類資源int allocation53;/已分配矩陣int need53;/需求矩陣,int available3;/系統(tǒng)可利用資源int request53;/請(qǐng)求矩陣char *finish5;/表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,開(kāi)始先

33、令finish【i】=false,當(dāng)有足夠資源給進(jìn)程i,再令它等于trueint safe5;/存儲(chǔ)安全序列int n,i,m;int k=0;int j=0;int work3;/表示系統(tǒng)可供給進(jìn)程繼續(xù)運(yùn)行所需的各類資源數(shù)目int works53;void start();/表示程序開(kāi)始void end();/表示程序結(jié)束void input();/輸入數(shù)據(jù)void output();/輸出數(shù)據(jù)void change();/系統(tǒng)分配資源,原有資源情況改變void outputsafe();/輸出安全序列的資源分配情況int check();/安全性算法void main()/主程序開(kāi)始sta

34、rt();for (;j=0;)/確認(rèn)輸入數(shù)據(jù)的正確性,若輸入錯(cuò)誤,重新輸入input();printf("以下為進(jìn)程資源情況,請(qǐng)確認(rèn)其是否正確:n");output();printf("數(shù)據(jù)是否無(wú)誤:n正確:輸入1n錯(cuò)誤:輸入0n請(qǐng)輸入:");scanf("%d",&j);printf("數(shù)據(jù)確認(rèn)無(wú)誤,算法繼續(xù)。n"); if (check()=0)/若check函數(shù)返回值為,表示輸入的初始數(shù)據(jù)找不到安全序列,無(wú)法進(jìn)行下一步,程序結(jié)束end();exit(0);for(;j=1;)/當(dāng)有多個(gè)進(jìn)程請(qǐng)求資源時(shí)

35、,循環(huán)開(kāi)始printf("請(qǐng)輸入請(qǐng)求資源的進(jìn)程i(下標(biāo)):");/輸入發(fā)出請(qǐng)求向量的進(jìn)程及請(qǐng)求向量scanf("%d",&i);printf("請(qǐng)輸入進(jìn)程P%d的請(qǐng)求向量Request%d:",i,i);for(n=0;n<3;n+)scanf("%d",&requestin);for(;requesti0>needi0|requesti1>needi1|requesti2>needi2;) /若請(qǐng)求向量大于需求資源,則認(rèn)為是輸入錯(cuò)誤,要求重新輸入printf("數(shù)

36、據(jù)輸入有誤,請(qǐng)重試!n請(qǐng)輸入進(jìn)程P%d的請(qǐng)求向量Request%d:",i,i);for(n=0;n<3;n+)scanf("%d",&requestin);if(requesti0<=available0&&requesti1<=available1&& requesti2<=available2) /判斷系統(tǒng)是否有足夠資源提供分配printf("系統(tǒng)正在為進(jìn)程P%d分配資源n",i);change();/分配資源j=0;elseprintf("系統(tǒng)沒(méi)有足夠的資源,進(jìn)程

37、P%d需要等待。n",i);if (j=0)/j=0表示系統(tǒng)有足夠資源分配的情況printf("當(dāng)前系統(tǒng)資源情況如下:n");/輸出分配資源后的系統(tǒng)資源分配情況output();if(check()=0)/若找不到安全系列,則之前的資源分配無(wú)效printf("本次資源分配作廢,恢復(fù)原來(lái)的資源分配狀態(tài)。n");for (m=0;m<3;m+)/恢復(fù)分配資源前的系統(tǒng)資源狀態(tài)availablem+=requestim;allocationim-=requestim;needim+=requestim;output();/輸出系統(tǒng)資源狀態(tài)prin

38、tf("是否還有進(jìn)程請(qǐng)求資源?n是:輸入1n否:輸入0n請(qǐng)輸入:");scanf("%d",&j);/若還有進(jìn)程請(qǐng)求資源,j=1,之前的for循環(huán)條件滿足end();void line()/美化程序,使程序運(yùn)行時(shí)更加明朗美觀printf("-n");void start()/表示銀行家算法開(kāi)始line();printf(" 銀行家算法開(kāi)始n");line();void end()/表示銀行家算法結(jié)束line();printf(" 銀行家算法結(jié)束,謝謝使用n");line();void i

39、nput()/輸入銀行家算法起始各項(xiàng)數(shù)據(jù)for (n=0;n<5;n+)printf("請(qǐng)輸入進(jìn)程P%d的相關(guān)信息:n",n);printf("Max:");for (m=0;m<3;m+)scanf("%d",&maxnm);printf("Allocation:");for (m=0;m<3;m+)scanf("%d",&allocationnm);for (m=0;m<3;m+)neednm=maxnm-allocationnm;printf(&qu

40、ot;請(qǐng)輸入系統(tǒng)可利用資源數(shù)Available:");for (m=0;m<3;m+)scanf("%d",&availablem);void output() /輸出系統(tǒng)現(xiàn)有資源情況line();printf("資源情況 Max Allocation Need Availablen");printf("進(jìn)程 A B C A B C A B C A B Cn");line();for(n=0;n<5;n+)printf("P%d%9d%3d%3d%5d%3d%3d%6d%3d%3d",

41、n,maxn0,maxn1,maxn2,allocationn0,allocationn1,allocationn2,needn0,needn1,needn2);if (n=0)printf("%6d%3d%3dn",available0,available1,available2);elseprintf("n");line();void change()/當(dāng)Requesti,j<=Availablej時(shí),系統(tǒng)把資源分配給進(jìn)程Pi,Availablej和Needi,j發(fā)生改變for (m=0;m<3;m+)availablem-=reques

42、tim;allocationim+=requestim;needim-=requestim;void outputsafe()/輸出安全序列的資源分配表printf("該安全序列的資源分配圖如下:n");line();printf("資源情況 Work Need Allocation Work+Allocation Finishn");printf("進(jìn)程 A B C A B C A B C A B Cn");line();for(n=0;n<5;n+)printf("P%d%9d%3d%3d%5d%3d%3d%5d%

43、3d%3d%6d%3d%3d%12sn",safen,workssafen0,workssafen1,workssafen2,needsafen0,needsafen1,needsafen2,allocationsafen0,allocationsafen1,allocationsafen2,workssafen0+allocationsafen0,workssafen1+allocationsafen1,workssafen2+allocationsafen2,finishn);line();int check()/安全性算法printf("開(kāi)始執(zhí)行安全性算法n"

44、;);for (m=0;m<3;m+)/數(shù)組work和finish初始化workm=availablem;for (n=0;n<5;n+)finishn="false"safen=0;k=0;for (m=0;m<5;m+)for (n=0;n<5;n+)if(strcmp(finishn,"false")=0 && needn0<=work0 && needn1<=work1 && needn2<=work2)/查找可以分配資源但尚未分配到資源的進(jìn)程safek=n

45、; /以數(shù)組safek記下各個(gè)進(jìn)程得到分配的資源的順序workssafek0=work0;workssafek1=work1;workssafek2=work2;work0+=allocationn0; /進(jìn)程執(zhí)行后釋放出分配給它的資源work1+=allocationn1;work2+=allocationn2;finishn="ture" /finishn變?yōu)橐允驹撨M(jìn)程完成本次分k+;for (m=0;m<5;m+)/判斷是否所有進(jìn)程分配資源完成if (strcmp(finishm,"false")=0)printf("找不到安全序列

46、,系統(tǒng)處于不安全狀態(tài)。n");return 0;/找不到安全序列,結(jié)束check函數(shù),返回else if (m=4) /此處m=4表示所有數(shù)組finish的所有元素都為tureprintf("找到安全序列P%d->P%d->P%d->P%d->P%d,系統(tǒng)是安全的n",safe0,safe1,safe2,safe3,safe4);j=1;outputsafe(); /輸出安全序列的資源分配表return 1;五、實(shí)驗(yàn)數(shù)據(jù)及處理結(jié)果P1請(qǐng)求資源request(1,0,2)P4請(qǐng)求資源request(3,3,0)P0請(qǐng)求資源request(0,

47、2,0)八、 實(shí)驗(yàn)體會(huì)或?qū)Ω倪M(jìn)實(shí)驗(yàn)的建議編寫銀行家算法程序還是需要較強(qiáng)的分析和編程能力的。在此次實(shí)驗(yàn)過(guò)程中,不僅需要細(xì)心、耐心和專心外,還要C語(yǔ)言基礎(chǔ)功底較扎實(shí)。編寫后雖然可以達(dá)到相應(yīng)效果,但最好還要考慮如何使顯示界面簡(jiǎn)潔明了。南昌大學(xué)實(shí)驗(yàn)報(bào)告 -(4)進(jìn)程調(diào)度算法的實(shí)現(xiàn)學(xué)生姓名: 王橋 學(xué) 號(hào): 6100412024 專業(yè)班級(jí): 計(jì)科123 實(shí)驗(yàn)類型: 驗(yàn)證 綜合 設(shè)計(jì) 創(chuàng)新 實(shí)驗(yàn)日期: 實(shí)驗(yàn)成績(jī): 一、實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)實(shí)驗(yàn)加強(qiáng)對(duì)進(jìn)程調(diào)度算法的理解和掌握。二、實(shí)驗(yàn)內(nèi)容編寫程序?qū)崿F(xiàn)進(jìn)程調(diào)度算法,具體可以編寫程序?qū)崿F(xiàn)先來(lái)先服務(wù)算法或優(yōu)先度高者調(diào)度算法。三、實(shí)驗(yàn)要求1、需寫出設(shè)計(jì)說(shuō)明;2、設(shè)計(jì)實(shí)現(xiàn)代碼

48、及說(shuō)明3、運(yùn)行結(jié)果;四、主要實(shí)驗(yàn)步驟#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 5 /進(jìn)程個(gè)數(shù),可改變int rtN; /到達(dá)時(shí)間int stN; /服務(wù)時(shí)間int ctN; /完成時(shí)間int cytN; /周轉(zhuǎn)時(shí)間float rctN; /帶權(quán)周轉(zhuǎn)時(shí)間float av2;/平均數(shù)int n,m;void start();/表示程序開(kāi)始void end();/表示程序結(jié)束void input();/輸入數(shù)據(jù)void random();/系統(tǒng)隨機(jī)產(chǎn)生數(shù)據(jù)void ordinat

49、ion();/對(duì)數(shù)據(jù)按到達(dá)時(shí)間進(jìn)行排序void fcfs();/先來(lái)先服務(wù)計(jì)算void output();/輸出結(jié)果void main()start();int which;int c=1;for (;c=1;)for (;)printf("輸入數(shù)據(jù)還是由系統(tǒng)隨機(jī)產(chǎn)生數(shù)據(jù)?n1、輸入數(shù)據(jù)t2、系統(tǒng)隨機(jī)產(chǎn)生數(shù)據(jù)n請(qǐng)輸入:");scanf("%d",&which);if (which=1)input();break;elseif (which=2)random();break;elseprintf("輸入錯(cuò)誤,請(qǐng)重新輸入!");ordination(); /進(jìn)程按照到達(dá)時(shí)間進(jìn)行排序fcfs();output();printf("繼續(xù)輸入1,退出輸入0。n請(qǐng)輸入:");scanf("%d",&

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論