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

下載本文檔

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

文檔簡介

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

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

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

4、的通過實驗加強(qiáng)對進(jìn)程同步和互斥的理解,并掌握進(jìn)程(線程)的創(chuàng)建和調(diào)用方法。學(xué)會使用信號量解決資源共享問題。學(xué)生可以自己選擇在Windows或Linux系統(tǒng)下編寫。二、實驗內(nèi)容1以下為Linux系統(tǒng)下參考程序,請編譯、運(yùn)行并觀察程序的輸出,并分析實驗結(jié)果,寫出實驗報告。#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;/等待信號量的數(shù)值變?yōu)榉秦?fù)數(shù),此處設(shè)為負(fù)值,相當(dāng)于對信號量進(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); /*操作一組信號sem_set_id是進(jìn)程的標(biāo)識符,sem_op是結(jié)構(gòu)指針。sem_op:如果其值為正數(shù),該值會加到現(xiàn)有的信號內(nèi)含值中。通常用于釋放所控資源的使用權(quán);如果sem_op的值為負(fù)數(shù),而其絕對值又大于信號的現(xiàn)值,操作將會阻塞,直到信號值大于或等于sem_op的絕對值。通常用于獲取資源的使用權(quán);如果sem_op的值為0,則操作將暫時阻塞,直到信號的值變?yōu)?。*/寫文件,寫入的數(shù)值是當(dāng)前進(jìn)程的進(jìn)程號file=fopen(file_path,"w");if(file)/臨界區(qū)fprintf(file,"%dn",n

7、umber);printf("%dn",number);fclose(file);/發(fā)送信號,把信號量的數(shù)值加1,此處相當(dāng)于對信號量進(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; /信號量集的IDunion semun sem_val; /信號量的數(shù)值,用于semctl()int child_pid;int i;int rc;/ 建立信號量集,ID是250,其中只有一個信號量sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600);if(sem_set_id=-1)perror("main: semget");exit(1);/把第一個信號量的數(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)程,使它們可以同時以競爭的方式訪問信號量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)者問題。模擬PV操作同步機(jī)構(gòu),且用PV操作解決生產(chǎn)者消費(fèi)者問題。提示:(1) PV操作同步機(jī)構(gòu),由P操作原語和V操作原語組成,它們的定義如下:P操作原語P(s):將信號量s減去1,若結(jié)果

11、小于0,則執(zhí)行原語的進(jìn)程被置成等待信號量s的狀態(tài)。V操作原語V(s):將信號量s加1,若結(jié)果不大于0,則釋放一個等待信號量s的進(jìn)程。這兩條原語是如下的兩個過程: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)用過程的進(jìn)程置為等待信號量s的狀態(tài);R(s)表示釋放一個等待信號量s的進(jìn)程。在系統(tǒng)初始化時應(yīng)把semaphore定義為某個類型,為簡單起見,在模

12、擬實驗中可把上述的semaphore直接改成integer。(2)生產(chǎn)者消費(fèi)者問題。假定有一個生產(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)可同時存放10件產(chǎn)品。那么,用PV操作來實現(xiàn)生產(chǎn)者和消費(fèi)者之間的同步,生產(chǎn)者和消費(fèi)者兩個進(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ù)先定義的兩個類型,在模擬實現(xiàn)中semaphore用integer或char等代替。(3)進(jìn)程控制塊PCB。為了紀(jì)錄進(jìn)程執(zhí)行時的情況,以及進(jìn)程讓出處理器后的狀態(tài),斷點(diǎn)等信息,每個進(jìn)程都有

14、一個進(jìn)程控制塊PCB。在模擬實驗中,假設(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)時,在進(jìn)程控制塊PCB中要說明進(jìn)程等待原因(在模擬實驗中進(jìn)程等待原因為等待信號量s1或s2);當(dāng)進(jìn)程處于等待態(tài)或就緒態(tài)時,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ī)器指令,處理器的主要職責(zé)是解釋執(zhí)行機(jī)器指令。為了模擬生產(chǎn)者和消費(fèi)者進(jìn)程的并發(fā)執(zhí)行,我們必須模擬一組指令和處理器職能。模擬的一組指令見圖4-2,其中

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

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

17、對信號量S1、S2賦初值,對生產(chǎn)者、消費(fèi)者進(jìn)程的PCB初始化。初始化后轉(zhuǎn)向處理器調(diào)度程序,其流程如圖4-4處理器調(diào)度程序:在計算機(jī)系統(tǒng)中,進(jìn)程并發(fā)執(zhí)行時,任一進(jìn)程占用處理器執(zhí)行完一條指令后就有可能被打斷而讓出處理器由其他進(jìn)程運(yùn)行。故在模擬系統(tǒng)中也類似處理,每當(dāng)執(zhí)行一條模擬的指令后,保護(hù)當(dāng)前進(jìn)程的現(xiàn)場,讓它成為非運(yùn)行狀態(tài),由處理器調(diào)度程序按隨機(jī)數(shù)再選擇一個就緒進(jìn)程占用處理器運(yùn)行。處理器調(diào)度程序流程見圖4-5。開始初始化信號量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、行程序:按“指令計數(shù)器”PC之值執(zhí)行指定的質(zhì)量,且PC加1指向下一條指令。模擬處理器指令執(zhí)行的程序流程見圖4-6和4-7。另外,為了使得模擬程序有一個結(jié)束條件,在圖4-6中附加了“生產(chǎn)者運(yùn)行結(jié)束”的條件判斷,模擬時可以采取人工選擇的方法實現(xiàn)。圖4-7給出了P(S)和V(S)模擬指令執(zhí)行過程的流程。其他模擬指令的執(zhí)行過程已在圖4-2中指出。四、實驗報告(1) 實驗題目。(2) 打印源程序并附上注釋。(3) 從鍵盤上輸入一組字符,由生產(chǎn)者每次讀入一個字符供消費(fèi)者輸出。運(yùn)行模擬程序,打印依次讀入的字符和消費(fèi)者輸出的字符。(4) 把生產(chǎn)者和消費(fèi)者進(jìn)程中的P操作、V操作都改成空操作指令,觀察在兩者不同步

19、的情況下可能出現(xiàn)的與時間有關(guān)的錯誤。打印依次讀入的字符和消費(fè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)場,PC=>當(dāng)前進(jìn)程PCB的斷點(diǎn)有就緒進(jìn)程?否是圖4-5處理器調(diào)度程序流程P(s)GOTO空操作PutGETproduceconsumeV(s)開始j:=PC按j轉(zhuǎn)向各模擬指令對應(yīng)的過程現(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í)行開始SS+1將調(diào)用V(s)過程的進(jìn)程置為就緒找一個等待s信

20、號量的進(jìn)程置為就緒態(tài)S<0返回否是開始SS-1將調(diào)用P(s)過程的進(jìn)程置為就緒將調(diào)用P(s)過程的進(jìn)程置為等待信號量s的狀態(tài)S<0返回否是(1)模擬P(S) (2)模擬V(S)圖 4-7 模擬PV操作的執(zhí)行三、實驗要求1、 linux操作系統(tǒng)2、 Windows操作系統(tǒng)四、主要實驗步驟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ū)長度unsigned short ProductID = 0; /產(chǎn)品號unsigned short ConsumeID = 0; /將被消耗的產(chǎn)品號unsigned short in = 0; /產(chǎn)品進(jìn)緩沖區(qū)時的緩沖區(qū)下標(biāo)unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標(biāo)int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個循環(huán)隊列bool g_continue = true; /控制程序結(jié)束HANDLE g_hMutex; /用于線程間的互斥HANDLE g_hFullSemaphore; /當(dāng)緩沖區(qū)

22、滿時迫使生產(chǎn)者等待HANDLE g_hEmptySemaphore; /當(dāng)緩沖區(qū)空時迫使消費(fèi)者等待DWORD WINAPI Producer(LPVOID); /生產(chǎn)者線程DWORD WINAPI Consumer(LPVOID); /消費(fèi)者線程int main() /創(chuàng)建各個互斥信號 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)者個數(shù)多于消費(fèi)者個數(shù)時, /生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者;反之,消費(fèi)者經(jīng)常等待 const unsigned short PRODUCERS_COUNT = 3; /生產(chǎn)者的個數(shù) const unsigned short CONSUMERS_COUNT = 1; /消費(fèi)者的個數(shù) /總的線程數(shù) const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT;

24、 /各線程的handle DWORD producerIDCONSUMERS_COUNT; /生產(chǎn)者線程的標(biāo)識符 DWORD consumerIDTHREADS_COUNT; /消費(fèi)者線程的標(biāo)識符 /創(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)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID號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ū)中取出一個產(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; /消耗一個產(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ù)據(jù)及處理結(jié)果七、 實驗體會或?qū)Ω倪M(jìn)實驗的建議實驗還是挺難的,而且是第一個實驗,所以參考了百度的代碼。南昌大學(xué)實驗報告 -(3)編程實現(xiàn)銀行家安全算法學(xué)生姓名: 王橋 學(xué) 號: 6100412024 專業(yè)班級: 計科123 實驗類型: 驗證 綜合 設(shè)計 創(chuàng)新 實驗日期: 實驗成績: 一、實驗?zāi)康耐ㄟ^實驗加強(qiáng)對銀行家安全算法的理解和掌握。二、實驗內(nèi)容熟悉避免死鎖發(fā)生的方法,死鎖與安全序列的關(guān)系,編程實現(xiàn)

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

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

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

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

36、據(jù)輸入有誤,請重試!n請輸入進(jìn)程P%d的請求向量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)沒有足夠的資源,進(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)/若找不到安全系列,則之前的資源分配無效printf("本次資源分配作廢,恢復(fù)原來的資源分配狀態(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)程請求資源?n是:輸入1n否:輸入0n請輸入:");scanf("%d",&j);/若還有進(jìn)程請求資源,j=1,之前的for循環(huán)條件滿足end();void line()/美化程序,使程序運(yùn)行時更加明朗美觀printf("-n");void start()/表示銀行家算法開始line();printf(" 銀行家算法開始n");line();void end()/表示銀行家算法結(jié)束line();printf(" 銀行家算法結(jié)束,謝謝使用n");line();void i

39、nput()/輸入銀行家算法起始各項數(shù)據(jù)for (n=0;n<5;n+)printf("請輸入進(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;請輸入系統(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時,系統(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("開始執(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記下各個進(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ù)據(jù)及處理結(jié)果P1請求資源request(1,0,2)P4請求資源request(3,3,0)P0請求資源request(0,

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

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

49、ion();/對數(shù)據(jù)按到達(dá)時間進(jìn)行排序void fcfs();/先來先服務(wù)計算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請輸入:");scanf("%d",&which);if (which=1)input();break;elseif (which=2)random();break;elseprintf("輸入錯誤,請重新輸入!");ordination(); /進(jìn)程按照到達(dá)時間進(jìn)行排序fcfs();output();printf("繼續(xù)輸入1,退出輸入0。n請輸入:");scanf("%d",&

溫馨提示

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

評論

0/150

提交評論