操作系統(tǒng)設(shè)計(jì)報(bào)告_第1頁(yè)
操作系統(tǒng)設(shè)計(jì)報(bào)告_第2頁(yè)
操作系統(tǒng)設(shè)計(jì)報(bào)告_第3頁(yè)
操作系統(tǒng)設(shè)計(jì)報(bào)告_第4頁(yè)
操作系統(tǒng)設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩30頁(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)介

目錄27544_WPSOffice_Level1一、實(shí)驗(yàn)一Windows進(jìn)程管理 113505_WPSOffice_Level1·實(shí)驗(yàn)?zāi)康摹?shí)驗(yàn)內(nèi)容 15203_WPSOffice_Level1·實(shí)驗(yàn)結(jié)果與分析 35438_WPSOffice_Level1·小結(jié)與心得體會(huì) 41845_WPSOffice_Level1二、實(shí)驗(yàn)二Linux進(jìn)程管理 512661_WPSOffice_Level1·實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容 528700_WPSOffice_Level1·實(shí)驗(yàn)結(jié)果與分析 715196_WPSOffice_Level1·小結(jié)與心得體會(huì) 817839_WPSOffice_Level1三、實(shí)驗(yàn)三Linux進(jìn)程間通信 97535_WPSOffice_Level1·實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容 126452_WPSOffice_Level1·實(shí)驗(yàn)結(jié)果與分析 1118781_WPSOffice_Level1·小結(jié)與心得體會(huì) 1119424_WPSOffice_Level1四、實(shí)驗(yàn)四Windows的互斥與同步 126319_WPSOffice_Level1·實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容 1227420_WPSOffice_Level1·實(shí)驗(yàn)結(jié)果與分析 1410113_WPSOffice_Level1·小結(jié)與心得體會(huì) 155754_WPSOffice_Level1五、實(shí)驗(yàn)六銀行家算法的模擬與實(shí)現(xiàn) 1625993_WPSOffice_Level1·實(shí)驗(yàn)?zāi)康?1619230_WPSOffice_Level1·總體設(shè)計(jì) 1628167_WPSOffice_Level1·詳細(xì)設(shè)計(jì) 1726240_WPSOffice_Level1·實(shí)驗(yàn)結(jié)果與分析 181257_WPSOffice_Level1·小結(jié)與心得體會(huì) 1920449_WPSOffice_Level1六、實(shí)驗(yàn)八磁盤調(diào)度算法的模擬與實(shí)現(xiàn) 20843_WPSOffice_Level1·實(shí)驗(yàn)?zāi)康?2022348_WPSOffice_Level1·總體設(shè)計(jì) 2020226_WPSOffice_Level1·詳細(xì)設(shè)計(jì) 214450_WPSOffice_Level1·實(shí)驗(yàn)結(jié)果與分析 2232680_WPSOffice_Level1·小結(jié)與心得體會(huì) 2316088_WPSOffice_Level1七、實(shí)驗(yàn)九*基于信號(hào)量機(jī)制的并發(fā)程序設(shè)計(jì) 249396_WPSOffice_Level1·實(shí)驗(yàn)?zāi)康?241166_WPSOffice_Level1·總體設(shè)計(jì) 2432164_WPSOffice_Level1·詳細(xì)設(shè)計(jì) 248610_WPSOffice_Level1·實(shí)驗(yàn)結(jié)果與分析 2715442_WPSOffice_Level1·小結(jié)與心得體會(huì) 2731481_WPSOffice_Level1八、實(shí)驗(yàn)十*簡(jiǎn)單shell命令行解釋器的設(shè)計(jì)與實(shí)現(xiàn) 2827347_WPSOffice_Level1·實(shí)驗(yàn)?zāi)康?2820483_WPSOffice_Level1·總體設(shè)計(jì) 286567_WPSOffice_Level1·詳細(xì)設(shè)計(jì) 2819154_WPSOffice_Level1·實(shí)驗(yàn)結(jié)果與分析 3024569_WPSOffice_Level1·小結(jié)與心得體會(huì) 31九、課程設(shè)計(jì)報(bào)告日志 32實(shí)驗(yàn)題目實(shí)驗(yàn)一、Windows進(jìn)程管理實(shí)驗(yàn)?zāi)康膶W(xué)會(huì)使用VC編寫(xiě)基本的Win32ConsolApplication控制臺(tái)應(yīng)用程序)。通過(guò)創(chuàng)建進(jìn)程、觀察正在運(yùn)行的進(jìn)程和終止進(jìn)程的程序設(shè)計(jì)和調(diào)試操作,進(jìn)一步熟悉操作系統(tǒng)的進(jìn)程概念,理解Windows進(jìn)程的“一生”。通過(guò)閱讀和分析實(shí)驗(yàn)程序,學(xué)習(xí)創(chuàng)建進(jìn)程、觀察進(jìn)程、終止進(jìn)程以及父子進(jìn)程同步的基本程序設(shè)計(jì)方法。實(shí)驗(yàn)內(nèi)容1.背景知識(shí):Windows所創(chuàng)建的每個(gè)進(jìn)程都從調(diào)用CreateProcess()API函數(shù)開(kāi)始,該函數(shù)的任務(wù)是在對(duì)象管理器子系統(tǒng)內(nèi)初始化進(jìn)程對(duì)象。每一進(jìn)程都以調(diào)用ExitProcess()或TerminateProcess()API函數(shù)終止。通常應(yīng)用程序的框架負(fù)責(zé)調(diào)用ExitProcess()函數(shù)。對(duì)于C++運(yùn)行庫(kù)來(lái)說(shuō),這一調(diào)用發(fā)生在應(yīng)用程序的main()函數(shù)返回之后。模塊介紹:主函數(shù)模塊、創(chuàng)建子進(jìn)程、startClone()模塊、互斥信號(hào)量的創(chuàng)建與釋放實(shí)驗(yàn)步驟:編寫(xiě)基本的Win32ConsolApplication創(chuàng)建進(jìn)程進(jìn)行父子進(jìn)程的簡(jiǎn)單通信及終止進(jìn)程數(shù)據(jù)結(jié)構(gòu)數(shù)組以及函數(shù)的調(diào)用父子進(jìn)程參數(shù)的傳遞父子進(jìn)程利用互斥信號(hào)進(jìn)行同步互斥體的創(chuàng)建、獲得、檢測(cè)與釋放、API接口子進(jìn)程的創(chuàng)建與關(guān)閉程序流程圖:關(guān)鍵代碼//清單1-2創(chuàng)建子進(jìn)程//創(chuàng)建傳遞過(guò)來(lái)的進(jìn)程的克隆過(guò)程并賦于其ID值voidStartClone(intnCloneID){//提取用于當(dāng)前可執(zhí)行文件的文件名TCHARszFilename[MAX_PATH];GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進(jìn)程的命令行并通知其EXE文件名和克隆IDTCHARszCmdLine[MAX_PATH]; sprintf(szCmdLine,"\"%s\"%d",szFilename,nCloneID); //用于子進(jìn)程的STARTUPINFO結(jié)構(gòu)STARTUPINFOsi;ZeroMemory(&si,sizeof(si));si.cb=sizeof(si); //必須是本結(jié)構(gòu)的大小//返回的用于子進(jìn)程的進(jìn)程信息PROCESS_INFORMATIONpi;//利用同樣的可執(zhí)行文件和命令行創(chuàng)建進(jìn)程,并賦于其子進(jìn)程的性質(zhì)BOOLbCreateOK=::CreateProcess(szFilename, //產(chǎn)生這個(gè)EXE的應(yīng)用程序的名稱szCmdLine, //告訴其行為像一個(gè)子進(jìn)程的標(biāo)志NULL, //缺省的進(jìn)程安全性NULL, //缺省的線程安全性FALSE, //不繼承句柄CREATE_NEW_CONSOLE, //使用新的控制臺(tái)NULL, //新的環(huán)境NULL, //當(dāng)前目錄&si, //啟動(dòng)信息&pi); //返回的進(jìn)程信息//對(duì)子進(jìn)程釋放引用if(bCreateOK){CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}}實(shí)驗(yàn)結(jié)果與分析實(shí)驗(yàn)1-1結(jié)果分析:其中出現(xiàn)的問(wèn)題就是要將void改成int,然后加上return0,從main()函數(shù)開(kāi)始,程序?qū)?huì)運(yùn)行輸出Hello,Win32ConsolApplication。問(wèn)題:如果運(yùn)行不成功,則可能的原因是什么?答:原因可能是編譯器的不同導(dǎo)致兼容性不同,編譯出錯(cuò);還有就是創(chuàng)建項(xiàng)目出錯(cuò),不對(duì)應(yīng)無(wú)法運(yùn)行。實(shí)驗(yàn)1-2結(jié)果分析:從main()函數(shù)開(kāi)始,首先判斷argc的值(argc初始值默認(rèn)為1)因?yàn)閍rgc不滿足大于1,所以不能將argv[1]賦值給nClone;然后nClone<c_nCloneMax,則調(diào)用StartClone(++nClone)函數(shù),創(chuàng)建子進(jìn)程;創(chuàng)建子進(jìn)程后,argc的值變?yōu)?,然后將自增的nClone賦值argv[1],然后將繼續(xù)執(zhí)行main()函數(shù),直到(nClone>c_nCloneMax),跳出,結(jié)束創(chuàng)建新進(jìn)程。最初結(jié)果與第一次修改結(jié)果相同:(出現(xiàn)六個(gè)進(jìn)程)第二次修改結(jié)果:(無(wú)限產(chǎn)生進(jìn)程)問(wèn)題:從中你可以得出什么結(jié)論?說(shuō)明nClone的作用。變量的定義和初始化方法(位置)對(duì)程序的執(zhí)行結(jié)果有影響嗎?為什么?答:在控制程序執(zhí)行過(guò)程,當(dāng)nClone>5時(shí)跳出循環(huán),創(chuàng)建子進(jìn)程結(jié)束;但是當(dāng)變量賦值的位置不同的時(shí)候?qū)τ趫?zhí)行結(jié)果有影響,在第二次更改中,由于nClone每次都初始化為0,會(huì)陷入死循環(huán),不斷創(chuàng)建子進(jìn)程。實(shí)驗(yàn)1-3結(jié)果分析:從main()函數(shù)開(kāi)始,首先判斷argc的值(argc初始值默認(rèn)為1),決定進(jìn)行父進(jìn)程還是子進(jìn)程,因?yàn)閍rgc不滿足大于1,所以調(diào)用parent()函數(shù),在執(zhí)行parent()函數(shù)過(guò)程中調(diào)用StartClone();然后通過(guò)sprintf(szCmdLine,"\"%s\"child",szFilename)將argv[1]賦值child后面滿足條件后調(diào)用child()函數(shù);由于設(shè)置了互斥信號(hào),則只允許一個(gè)進(jìn)程進(jìn)行,所以只有當(dāng)父進(jìn)程釋放互斥信號(hào)hMutexSuicide時(shí),子進(jìn)程檢測(cè)獲得才結(jié)束進(jìn)程。最初結(jié)果和修改之后的結(jié)果:?jiǎn)栴}:參考MSDN中的幫助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子進(jìn)程如何利用互斥體進(jìn)行同步的。給出父子進(jìn)程同步過(guò)程的一個(gè)大概描述。答:CreateMutex()創(chuàng)建互斥體hMutexSuicide信號(hào)、OpenMutex()打開(kāi)互斥體、ReleaseMutex()釋放互斥體、WaitForSingleObject()檢測(cè)Hhandle信號(hào)狀態(tài),通過(guò)這些只允許有一個(gè)狀態(tài)被創(chuàng)建或者使用也就是信號(hào)量唯一,實(shí)現(xiàn)進(jìn)程的同步。小結(jié)與心得體會(huì)通過(guò)這個(gè)實(shí)驗(yàn)讓我更加深入了解了熟悉操作系統(tǒng)的進(jìn)程這方面的概念,也更加清楚了操作系統(tǒng)進(jìn)程在各種時(shí)期的相關(guān)操作與設(shè)計(jì),也讓我更加對(duì)于操作系統(tǒng)這一學(xué)科產(chǎn)生了更加濃厚的興趣。所有進(jìn)程都是以調(diào)用CreateProcess()API函數(shù)開(kāi)始的是ExitProcess()函數(shù)結(jié)束的,在獲得互斥體時(shí),首先,想要訪問(wèn)調(diào)用的線程可使用OpenMutex()API來(lái)獲得指向?qū)ο蟮木浔蝗缓?,線程將這個(gè)句柄提供給一個(gè)等待函數(shù)。當(dāng)內(nèi)核將互斥體對(duì)象發(fā)送給等待線程時(shí),就表明該線程獲得了互斥體的擁有權(quán)。當(dāng)線程獲得擁有權(quán)時(shí),線程控制了對(duì)共享資源的訪問(wèn)——必須設(shè)法盡快地放棄互斥體。放棄共享資源時(shí)需要在該對(duì)象上調(diào)用ReleaseMute()API。然后系統(tǒng)負(fù)責(zé)將互斥體擁有權(quán)傳遞給下一個(gè)等待著的線程(由到達(dá)時(shí)間決定順序)。還有就是,Windows提供的常用對(duì)象可分成三類:核心應(yīng)用服務(wù)、線程同步和線程間通訊。其中,開(kāi)發(fā)人員要可以使用線程同步對(duì)象來(lái)協(xié)調(diào)線程和進(jìn)程的工作,以使其共享信息并執(zhí)行任務(wù)。實(shí)驗(yàn)題目實(shí)驗(yàn)二、Linux進(jìn)程管理實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)進(jìn)程的創(chuàng)建、撤銷和運(yùn)行加深對(duì)進(jìn)程概念和進(jìn)程并發(fā)執(zhí)行的理解,明確進(jìn)程和程序之間的區(qū)別。實(shí)驗(yàn)內(nèi)容背景知識(shí)fork調(diào)用的一個(gè)奇妙之處就是它僅僅被調(diào)用一次,卻能夠返回兩次,它可能有三種不同的返回值:在父進(jìn)程中,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID;在子進(jìn)程中,fork返回0;如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值;在fork函數(shù)執(zhí)行完畢后,如果創(chuàng)建新進(jìn)程成功,則出現(xiàn)兩個(gè)進(jìn)程,一個(gè)是子進(jìn)程,一個(gè)是父進(jìn)程。在子進(jìn)程中,fork函數(shù)返回0,在父進(jìn)程中,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID。我們可以通過(guò)fork返回的值來(lái)判斷當(dāng)前進(jìn)程是子進(jìn)程還是父進(jìn)程。模塊介紹2-1:一個(gè)父進(jìn)程,一個(gè)子進(jìn)程2-2:一個(gè)父進(jìn)程,一個(gè)子進(jìn)程實(shí)驗(yàn)步驟創(chuàng)建進(jìn)程創(chuàng)建子進(jìn)程執(zhí)行新任務(wù)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)為鏈表結(jié)構(gòu),C++語(yǔ)言編寫(xiě),運(yùn)用了C++庫(kù)函數(shù)。個(gè)進(jìn)程會(huì)派生多個(gè)子進(jìn)程時(shí),子進(jìn)程與子進(jìn)程具有兄弟關(guān)系。程序流程圖關(guān)鍵代碼//清單2-2子進(jìn)程執(zhí)行新任務(wù)intmain(){pid_tpid;/*forkachildprocess*/pid=fork(); if(pid<0) {/*erroroccurred*/ fprintf(stderr,"ForkFailed");return1;}elseif(pid==0){/*子進(jìn)程*/ execlp("/bin/ls","ls",NULL);}else{/*父進(jìn)程將一直等待,直到子進(jìn)程運(yùn)行完畢*/wait(NULL);printf("ChildComplete");}return0;}實(shí)驗(yàn)結(jié)果與分析實(shí)驗(yàn)2-1結(jié)果分析:從main()函數(shù)開(kāi)始,運(yùn)行父進(jìn)程,接著通過(guò)判斷是否創(chuàng)建成功,while((x=fork())==-1)進(jìn)行判斷,如果x>0,則繼續(xù)創(chuàng)建子進(jìn)程,若成功,則此時(shí)有一個(gè)子進(jìn)程和一個(gè)父進(jìn)程,先創(chuàng)建的子進(jìn)程會(huì)輸出a,接下來(lái)是父進(jìn)程執(zhí)行完畢,輸出b,后面是進(jìn)程執(zhí)行完畢輸出c;fork出來(lái)的進(jìn)程不能確定子進(jìn)程和父進(jìn)程誰(shuí)先執(zhí)行,是隨機(jī)的,所以每次執(zhí)行的結(jié)果可能會(huì)不一樣的,父進(jìn)程與子進(jìn)程爭(zhēng)奪CPU資源。所以最終的輸出結(jié)果是acbc或者是bcac。問(wèn)題:觀察屏幕上的顯示結(jié)果,并分析多次運(yùn)行為什么會(huì)出現(xiàn)不同的結(jié)果。答:fork出來(lái)的進(jìn)程不能確定子進(jìn)程和父進(jìn)程誰(shuí)先執(zhí)行,是隨機(jī)的,所以每次執(zhí)行的結(jié)果可能會(huì)不一樣的,父進(jìn)程與子進(jìn)程爭(zhēng)奪CPU資源。實(shí)驗(yàn)2-2結(jié)果分析:從main()函數(shù)開(kāi)始,父進(jìn)程創(chuàng)建子進(jìn)程,首先判斷子進(jìn)程是否創(chuàng)建成功,如果pid<0則創(chuàng)建進(jìn)程失敗,當(dāng)pid=0時(shí),運(yùn)行子進(jìn)程,輸出系統(tǒng)當(dāng)前目錄。父進(jìn)程將會(huì)一直等待子進(jìn)程信號(hào),只有當(dāng)子進(jìn)程釋放信號(hào),父進(jìn)程輸出“ChildComplete”。問(wèn)題:觀察該程序在屏幕上的顯示結(jié)果,并分析實(shí)驗(yàn)結(jié)果。答:分析:屏幕上出現(xiàn)的是當(dāng)前目錄的列表,以及子進(jìn)程結(jié)束打印輸出的子進(jìn)程complete,首先該程序創(chuàng)建一個(gè)子進(jìn)程然后,但是fork()是一次調(diào)用返回兩個(gè)參數(shù),在父進(jìn)程中返回的是創(chuàng)建子進(jìn)程的ID,在子進(jìn)程中返回的是0,故會(huì)同時(shí)出現(xiàn)一起存在的結(jié)果小結(jié)與心得體會(huì)本實(shí)驗(yàn)在實(shí)驗(yàn)一的基礎(chǔ)上將創(chuàng)建進(jìn)程實(shí)驗(yàn)到了Linux系統(tǒng)上,實(shí)驗(yàn)是有兩個(gè)塊組成,創(chuàng)建進(jìn)程和子進(jìn)程執(zhí)行新任務(wù)構(gòu)成,本實(shí)驗(yàn)最重要的一個(gè)函數(shù)就是fork()函數(shù),就是在fork的時(shí)候調(diào)用一次,返回兩個(gè)參數(shù),這也是對(duì)于這個(gè)實(shí)驗(yàn)的基本理解,在Linux中利用fork建立一個(gè)子進(jìn)程,父進(jìn)程繼續(xù)運(yùn)行,子進(jìn)程在同樣的位置執(zhí)行同樣的程序。對(duì)于子進(jìn)程,fork()返回0,出錯(cuò)時(shí)返回-1,對(duì)于父進(jìn)程,fork()返回子進(jìn)程的pid,while((x=fork())==-1)這句話是用來(lái)判斷子進(jìn)程是否能創(chuàng)建成功,而且當(dāng)x=0時(shí)運(yùn)行子進(jìn)程,當(dāng)x>0時(shí)父進(jìn)程執(zhí)行,而x<0時(shí),則進(jìn)程創(chuàng)建不成功,通過(guò)代碼輸出相應(yīng)的字符去確定父子進(jìn)程的先后執(zhí)行順序,也同時(shí)可以發(fā)現(xiàn)子父進(jìn)程會(huì)爭(zhēng)奪cpu資源形成兩中不同的結(jié)果,說(shuō)明進(jìn)程的執(zhí)行是隨機(jī)的關(guān)鍵看是否獲得資源。通過(guò)本實(shí)驗(yàn)初步認(rèn)識(shí)了Linux系統(tǒng)下如何創(chuàng)建進(jìn)程以及進(jìn)程是如何執(zhí)行的,以及對(duì)于fork函數(shù)的深刻理解,也讓我感受到了Linux系統(tǒng)的簡(jiǎn)約,原始點(diǎn)但也能說(shuō)是有趣,發(fā)現(xiàn)這個(gè)開(kāi)源的系統(tǒng)比想象的要更加有趣,以及在現(xiàn)在主流的操作系統(tǒng)中我也認(rèn)為它能很好的完成各種功能的實(shí)現(xiàn),只不過(guò)相對(duì)比較麻煩一點(diǎn)罷了,但是對(duì)于程序員來(lái)說(shuō)這樣才能更加深入的了解底層的原理才能更好的提升自己的能力。實(shí)驗(yàn)題目實(shí)驗(yàn)三、Linux進(jìn)程間通信實(shí)驗(yàn)?zāi)康腖inux系統(tǒng)的進(jìn)程通信機(jī)構(gòu)(IPC)允許在任意進(jìn)程間大批量地交換數(shù)據(jù),通過(guò)本實(shí)驗(yàn),理解熟悉Linux支持的消息通信機(jī)制。實(shí)驗(yàn)內(nèi)容背景知識(shí)UINX/Linux系統(tǒng)把信號(hào)量、消息隊(duì)列和共享資源統(tǒng)稱為進(jìn)程間通信資源(IPCresource)。提供給用戶的IPC資源是通過(guò)一組系統(tǒng)調(diào)用實(shí)現(xiàn)的。這組系統(tǒng)調(diào)用為用戶態(tài)進(jìn)程提供了以下三種服務(wù):用信號(hào)量對(duì)進(jìn)程要訪問(wèn)的臨界資源進(jìn)行保護(hù)。用消息隊(duì)列在進(jìn)程間以異步方式發(fā)送消息。用一塊預(yù)留出的內(nèi)存區(qū)域供進(jìn)程之間交換數(shù)據(jù)。在Linux中創(chuàng)建子進(jìn)程要使用fork()函數(shù),執(zhí)行新的命令要使用exec()系列函數(shù),等待子進(jìn)程結(jié)束使用wait()函數(shù),結(jié)束終止進(jìn)程使用exit()函數(shù)。fork()原型如下:pid_tfork(void);fork建立一個(gè)子進(jìn)程,父進(jìn)程繼續(xù)運(yùn)行,子進(jìn)程在同樣的位置執(zhí)行同樣的程序。對(duì)于父進(jìn)程,fork()返回子進(jìn)程的pid,對(duì)于子進(jìn)程,fork()返回0。出錯(cuò)時(shí)返回-1。模塊介紹主函數(shù)、SERVER函數(shù)、CLIENT函數(shù)實(shí)驗(yàn)步驟用一個(gè)程序作為“引子”,先后fork()兩個(gè)子進(jìn)程SERVER和CLIENT,進(jìn)行通信。SERVER端建立一個(gè)key為75的消息隊(duì)列,等待其他進(jìn)程發(fā)來(lái)的消息。當(dāng)遇到類型為1的消息,則作為結(jié)束信號(hào),取消該隊(duì)列,并退出SERVER。SERVER每接收到一個(gè)消息后顯示一句“(server)received”。CLIENT端使用key為75的消息隊(duì)列,先后發(fā)送類型從10到1的消息,然后退出。最后的一個(gè)消息,即是SERVER端需要的結(jié)束信號(hào)。CLIENT每發(fā)送一條消息后顯示一句“(client)sent”。父進(jìn)程在SERVER和CLIENT均退出后結(jié)束。數(shù)據(jù)結(jié)構(gòu)#defineMSGKEY75structmsgform{longmtype; charmtext[1030];}msg;intmsgqid,i;程序流程圖關(guān)鍵代碼voidCLIENT(){inti;msgqid=msgget(MSGKEY,0777);for(i=10;i>=1;i--){msg.mtype=i; printf("(client)sent\n"); msgsnd(msgqid,&msg,1024,0);}exit(0);}voidSERVER(){msgqid=msgget(MSGKEY,0777|IPC_CREAT);do{msgrcv(msgqid,&msg,1030,0,0); printf("(Server)recieved\n");}while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0);exit(0);}voidmain(){while((i=fork())==-1);if(!i)SERVER();while((i=fork())==-1);if(!i)CLIENT();wait(0);wait(0);}實(shí)驗(yàn)結(jié)果與分析實(shí)驗(yàn)3-1結(jié)果分析:這個(gè)程序從主函數(shù)開(kāi)始,然后通過(guò)fork()函數(shù)創(chuàng)建兩個(gè)子進(jìn)程SERVER和CLIENT,用來(lái)進(jìn)行通信。在client函數(shù)中創(chuàng)建75序列,打開(kāi)0777序列標(biāo)識(shí)符然后后續(xù)傳遞給server函數(shù)進(jìn)行匹配,然后設(shè)定msg.mtype=i就是讓后面server函數(shù)唯一接收client傳過(guò)來(lái)的信息,for循環(huán)10次,傳遞10次信息,通過(guò)msgsnd(msgqid,&msg,1024,0)來(lái)傳遞信息。問(wèn)題:從理論上說(shuō),上述程序應(yīng)當(dāng)是每當(dāng)client發(fā)送一條消息后,server接收該消息,client再發(fā)送下一條,也即是應(yīng)該交替出現(xiàn)(client)sent和(server)received,但實(shí)際結(jié)果大多不是這樣,會(huì)出現(xiàn)幾個(gè)(client)sent連續(xù)后再幾個(gè)(server)received,請(qǐng)分析原因。答:message的傳送和控制并不保證完全同步,當(dāng)一個(gè)程序不再激活狀態(tài)的時(shí)候,它完全可能繼續(xù)睡眠,造成上面現(xiàn)象,在多次sendmessage后才receivemessage.這一點(diǎn)有助于理解消息轉(zhuǎn)送的實(shí)現(xiàn)機(jī)理.小結(jié)與心得體會(huì)本實(shí)驗(yàn)是對(duì)于熟悉Linux支持的消息通信機(jī)制,在Linux系統(tǒng)的進(jìn)程通信機(jī)構(gòu)(IPC)允許在任意進(jìn)程間大批量地交換數(shù)據(jù),通過(guò)本實(shí)驗(yàn)讓我熟悉了解了通信的傳送與接收的機(jī)制,在message傳送與接收的過(guò)程中,其實(shí)在傳送與接收的過(guò)程中并不是完全同步的,在多次多次sendmessage后才receivemessage,通過(guò)實(shí)驗(yàn),體會(huì)到了Linux系統(tǒng)在這方面的功能,也很好的了解了本實(shí)驗(yàn)所要我們學(xué)習(xí)的本質(zhì)!這也可以看看現(xiàn)在生活中的通信機(jī)制,當(dāng)然不是進(jìn)程之間,但十分相似與相近,在我們使用qq或者微信的時(shí)候,我們也等同于一個(gè)發(fā)送機(jī)制和一個(gè)接收機(jī)制,所以想象一下我們現(xiàn)在如此發(fā)達(dá)的通信的時(shí)代,研究人員是如何去減少這個(gè)延時(shí),當(dāng)我們網(wǎng)絡(luò)信號(hào)不好時(shí),延時(shí)就會(huì)很大,也很難同步。在本實(shí)驗(yàn)中我們所使用的是操作系統(tǒng)中的消息隊(duì)列這一進(jìn)程通信方法,我不僅深入了解本實(shí)驗(yàn)所用的消息隊(duì)列的方式,還了解到還有管道、信號(hào)量、信號(hào)、共享內(nèi)存、套接字等這些方式的特點(diǎn),了解過(guò)后也對(duì)linux進(jìn)程通信方式有了全面的了解,讓我感受到通信的多樣化與奇特!實(shí)驗(yàn)題目實(shí)驗(yàn)四、Windows的互斥與同步二、實(shí)驗(yàn)?zāi)康幕仡櫜僮飨到y(tǒng)進(jìn)程、線程的有關(guān)概念,加深對(duì)Windows線程的理解。了解互斥體對(duì)象,利用互斥與同步操作編寫(xiě)生產(chǎn)者-消費(fèi)者問(wèn)題的并發(fā)程序,加深對(duì)P(即semWait)、V(即semSignal)原語(yǔ)以及利用P、V原語(yǔ)進(jìn)行進(jìn)程間同步與互斥操作的理解。實(shí)驗(yàn)內(nèi)容背景知識(shí)信號(hào)量:信號(hào)量是一個(gè)與隊(duì)列有關(guān)的整型變量。可以初始化成非負(fù)數(shù);semWait操作使信號(hào)量減1。若值為負(fù)數(shù),則執(zhí)行semWait的進(jìn)程阻塞,否則繼續(xù)執(zhí)行;semSignal操作使信號(hào)量加1。若值小于或等于0,則被semWait操作阻塞的進(jìn)程被解除阻塞。模塊介紹生產(chǎn)者:Produce()、Append()和消費(fèi)者:Take()、Consume()實(shí)驗(yàn)步驟生產(chǎn)者消費(fèi)者問(wèn)題創(chuàng)建一個(gè)工程,用清單4-1中的程序,編譯成可執(zhí)行文件。在命令窗口運(yùn)行步驟1中生成的可執(zhí)行文件,列出運(yùn)行結(jié)果。仔細(xì)閱讀源程序,找出創(chuàng)建線程的WINDOWSAPI函數(shù)修改清單4-1中的程序,調(diào)整生產(chǎn)者線程和消費(fèi)者線程的個(gè)數(shù),使得消費(fèi)者數(shù)目大與生產(chǎn)者,觀察察運(yùn)行結(jié)果。修改信號(hào)量EmptySemaphore的初始化方法,觀察結(jié)果有何不同。根據(jù)步驟4的結(jié)果,并查看MSDN。數(shù)據(jù)結(jié)構(gòu)constunsignedshortSIZE_OF_BUFFER=2;//緩沖區(qū)長(zhǎng)度unsignedshortProductID=0;//產(chǎn)品號(hào)unsignedshortConsumeID=0;//將被消耗的產(chǎn)品號(hào)unsignedshortin=0;//產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)unsignedshortout=0;//產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)intbuffer[SIZE_OF_BUFFER];//緩沖區(qū)是個(gè)循環(huán)隊(duì)列boolp_ccontinue=true;//控制程序結(jié)束HANDLEMutex;//用于線程間的互斥HANDLEFullSemaphore;//當(dāng)緩沖區(qū)滿時(shí)迫使生產(chǎn)者等待HANDLEEmptySemaphore;//當(dāng)緩沖區(qū)空時(shí)迫使消費(fèi)者等待DWORDWINAPIProducer(LPVOID);//生產(chǎn)者線程DWORDWINAPIConsumer(LPVOID);//消費(fèi)者線程程序流程圖關(guān)鍵代碼DWORDWINAPIProducer(LPVOIDlpPara)//生產(chǎn)者{while(p_ccontinue){WaitForSingleObject(EmptySemaphore,INFINITE);//p(empty);WaitForSingleObject(Mutex,INFINITE); //p(mutex);Produce();Append();Sleep(1500);ReleaseMutex(Mutex); //V(mutex);ReleaseSemaphore(FullSemaphore,1,NULL); //V(full); }return0;}DWORDWINAPIConsumer(LPVOIDlpPara)//消費(fèi)者{ while(p_ccontinue){WaitForSingleObject(FullSemaphore,INFINITE);//P(full);WaitForSingleObject(Mutex,INFINITE); //P(mutex);Take();Consume();Sleep(1500);ReleaseMutex(Mutex); //V(mutex);ReleaseSemaphore(EmptySemaphore,1,NULL); //V(empty); }return0;}實(shí)驗(yàn)結(jié)果與分析實(shí)驗(yàn)4-1結(jié)果分析:修改后代碼清單4-1后,從main()函數(shù)開(kāi)始,首先創(chuàng)建了生產(chǎn)者-消費(fèi)者問(wèn)題中應(yīng)用到的互斥信號(hào)和同步信號(hào)以及其他基礎(chǔ)定義,創(chuàng)建消費(fèi)者生產(chǎn)者線程;最初生產(chǎn)者滿足條件生產(chǎn)產(chǎn)品,所以先執(zhí)行生產(chǎn)者,然后當(dāng)資源有產(chǎn)品時(shí),會(huì)執(zhí)行消費(fèi)者,生產(chǎn)者和消費(fèi)者在代碼運(yùn)行過(guò)程中出現(xiàn)是隨機(jī)的,當(dāng)生產(chǎn)者多于消費(fèi)者時(shí),生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者;反之,消費(fèi)者經(jīng)常等待;若緩沖區(qū)為空,則必定是生產(chǎn)者運(yùn)行,緩沖區(qū)為滿,則消費(fèi)者運(yùn)行,生產(chǎn)者等待,而對(duì)于結(jié)果的表示,則是調(diào)用Append()和Consume()中的循環(huán)輸出。問(wèn)題:線程的第一個(gè)執(zhí)行函數(shù)是什么(從哪里開(kāi)始執(zhí)行)?它位于創(chuàng)建線程的API函數(shù)的第幾個(gè)參數(shù)中?答:生產(chǎn)者第一個(gè)執(zhí)行的函數(shù)是Producer(),消費(fèi)者第一個(gè)執(zhí)行的函數(shù)是Consumer(),位于創(chuàng)建線程API的第3個(gè)函數(shù)。實(shí)驗(yàn)4-2結(jié)果分析:當(dāng)生產(chǎn)者多余消費(fèi)者時(shí)候,生產(chǎn)者生產(chǎn)多個(gè)的時(shí)候消費(fèi)者才會(huì)去消費(fèi)。當(dāng)生產(chǎn)者少于消費(fèi)者時(shí),生產(chǎn)者基本每生產(chǎn)一個(gè),消費(fèi)者就消費(fèi)一個(gè)。問(wèn)題:觀察結(jié)果有何不同,從中你可以得出什么結(jié)論?答:當(dāng)生產(chǎn)者個(gè)數(shù)多于消費(fèi)者個(gè)數(shù)時(shí)生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者對(duì)產(chǎn)品進(jìn)行消費(fèi);反之,消費(fèi)者經(jīng)常等待生產(chǎn)者生產(chǎn)。實(shí)驗(yàn)4-3結(jié)果分析:將資源EmptySemaphore的初始值設(shè)置為0,也就是一開(kāi)始兩個(gè)資源都不能獲取,導(dǎo)致無(wú)論是生產(chǎn)者還是消費(fèi)者的P操作都不無(wú)法取到資源,只能一直等待,所以窗口不輸出任何東西,表示的含義就是生產(chǎn)者和消費(fèi)者都在等待EmptySemphore資源的釋放。小結(jié)與心得體會(huì)通過(guò)本實(shí)驗(yàn)深入了解互斥體對(duì)象,利用互斥與同步操作編寫(xiě)生產(chǎn)者-消費(fèi)者問(wèn)題的并發(fā)程序,加深對(duì)P(即semWait)、V(即semSignal)原語(yǔ)以及利用P、V原語(yǔ)進(jìn)行進(jìn)程間同步與互斥操作的理解,還回顧了顧操作系統(tǒng)進(jìn)程、線程的有關(guān)概念,加深對(duì)Windows線程的理解,在本實(shí)驗(yàn)中,有意思的就是可以通過(guò)改變生產(chǎn)者和消費(fèi)者的數(shù)量大小來(lái)觀察在進(jìn)程運(yùn)行的時(shí)候,生產(chǎn)者和消費(fèi)者的狀態(tài),當(dāng)消費(fèi)者大于個(gè)數(shù)多于消費(fèi)者個(gè)數(shù)時(shí)生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者對(duì)產(chǎn)品進(jìn)行消費(fèi);反之,消費(fèi)者經(jīng)常等待生產(chǎn)者生產(chǎn)。這也和老師上課講的理論知識(shí)遙相呼應(yīng),也讓我更加加深了對(duì)于生產(chǎn)者消費(fèi)者的問(wèn)題的理解,接著通過(guò)設(shè)置資源EmptySemaphore的初始值設(shè)置為0,使其兩個(gè)資源不能進(jìn)行獲取,導(dǎo)致無(wú)論消費(fèi)者還是生產(chǎn)者都是在不停的等待,導(dǎo)致界面的不顯示,所以在進(jìn)行實(shí)驗(yàn)的時(shí)候通過(guò)改變一個(gè)小小的值就可以改變實(shí)驗(yàn)結(jié)果,也讓我體會(huì)到底層語(yǔ)言的艱辛,也感覺(jué)到了寫(xiě)代碼時(shí)候要及其注意參數(shù)的傳遞,因?yàn)榭赡苡捎趨?shù)的傳遞,或者對(duì)于資源的賦值就可以改變實(shí)驗(yàn)結(jié)果,達(dá)不到想要的效果,所以我們?cè)贆z查錯(cuò)誤時(shí)候要仔細(xì)檢查這方面的錯(cuò)誤,通過(guò)本實(shí)驗(yàn)收獲很多,感觸頗深!實(shí)驗(yàn)題目實(shí)驗(yàn)六、銀行家算法的模擬與實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康倪M(jìn)一步理解進(jìn)程的并發(fā)執(zhí)行。加強(qiáng)對(duì)進(jìn)程死鎖的理解,理解安全狀態(tài)與不安全狀態(tài)的概念。掌握使用銀行家算法避免死鎖問(wèn)題。總體設(shè)計(jì)背景知識(shí) 死鎖:多個(gè)進(jìn)程在執(zhí)行過(guò)程中,因?yàn)楦?jìng)爭(zhēng)資源會(huì)造成相互等待的局面。如果沒(méi)有外力作用,這些進(jìn)程將永遠(yuǎn)無(wú)法向前推進(jìn)。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或者系統(tǒng)產(chǎn)生了死鎖。 安全序列:系統(tǒng)按某種順序并發(fā)進(jìn)程,并使它們都能達(dá)到獲得最大資源而順序完成的序列為安全序列。 安全狀態(tài):能找到安全序列的狀態(tài)稱為安全狀態(tài),安全狀態(tài)不會(huì)導(dǎo)致死鎖。 不安全狀態(tài):在當(dāng)前狀態(tài)下不存在安全序列,則系統(tǒng)處于不安全狀態(tài)。 銀行家算法:銀行家算法顧名思義是來(lái)源于銀行的借貸業(yè)務(wù),一定數(shù)量的本金要滿足多個(gè)客戶的借貸周轉(zhuǎn),為了防止銀行家資金無(wú)法周轉(zhuǎn)而倒閉,對(duì)每一筆貸款,必須考察其是否能限期歸還。當(dāng)一進(jìn)程提出資源申請(qǐng)時(shí),銀行家算法執(zhí)行下列步驟以決定是否向其分配資源:檢查該進(jìn)程所需要的資源是否已超過(guò)它所宣布的最大值。檢查系統(tǒng)當(dāng)前是否有足夠資源滿足該進(jìn)程的請(qǐng)求。系統(tǒng)試探著將資源分配給該進(jìn)程,得到一個(gè)新?tīng)顟B(tài)。執(zhí)行安全性算法,若該新?tīng)顟B(tài)是安全的,則分配完成;若新?tīng)顟B(tài)是不安全的,則恢復(fù)原狀態(tài),阻塞該進(jìn)程。模塊介紹主函數(shù)運(yùn)行模塊銀行家算法模塊檢查資源分配安全模塊輸出資源分配模塊設(shè)計(jì)步驟初始化時(shí)讓系統(tǒng)擁有一定的資源;用鍵盤輸入的方式允許進(jìn)程動(dòng)態(tài)申請(qǐng)資源;如果試探分配后系統(tǒng)處于安全狀態(tài),則修改系統(tǒng)的資源分配情況,正式分配資源;如果試探分配后系統(tǒng)處于不安全狀態(tài),則提示不能滿足請(qǐng)求,恢復(fù)原狀態(tài)并阻塞該進(jìn)程。詳細(xì)設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)資源總量向量Resource,m維,表示m種資源的總量??捎觅Y源向量Available,m維,表示未分配的各種可用資源數(shù)量。需求矩陣Claim,n*m矩陣,表示n個(gè)進(jìn)程對(duì)m類資源的最大需求。分配矩陣Allocation,n*m矩陣,表示n個(gè)進(jìn)程已分配的各種資源數(shù)。程序流程圖關(guān)鍵代碼intchkerr(ints)//函數(shù)chkerr,檢查是否安全{while(1){inti; intflag1=0; for(i=0;i<M;){ intsum=0;intk; for(k=0;k<M;k++){sum+=FINISH[k];}if(sum==M){ intij;printf("存在安全序列:["); for(ij=0;ij<M;ij++){ printf("p%d",array[ij]);} printf("]\n"); printf("【經(jīng)安全性檢查,系統(tǒng)安全,本次分配成功?!縗n\n"); return1; }if(FINISH[i]!=1){ flag1=0; for(intj=0;j<N;j++){//資源檢查 if(NEED[i][j]>WORK[j]){//進(jìn)程i所需要的資源j能否被滿足 flag1=1;break;}}}//有不滿足的,就退出 if(flag1==0&&FINISH[i]!=1){//表示i進(jìn)程沒(méi)執(zhí)行,且可以執(zhí)行 intj; FINISH[i]=1;//i號(hào)進(jìn)程,可以執(zhí)行 printf("進(jìn)程p%d執(zhí)行\(zhòng)n",i);printf("系統(tǒng)當(dāng)前可用資源:"); for(j=0;j<N;j++) {WORK[j]+=ALLOCATION[i][j];//各分配的資源回收 printf("%d",WORK[j]); } printf("\n"); array[cnt++]=i; i=0;}else{i++;}}//不能執(zhí)行判斷下一個(gè)進(jìn)程實(shí)驗(yàn)結(jié)果與分析實(shí)驗(yàn)結(jié)果:首先剛進(jìn)去的界面進(jìn)行資源展示的界面當(dāng)輸入不合理時(shí):分配失敗時(shí):分配成功時(shí):實(shí)驗(yàn)分析:本實(shí)驗(yàn)由幾個(gè)模塊組成,先是對(duì)于進(jìn)程所需資源量和剩余資源量的計(jì)算,然后調(diào)用顯示函數(shù),將所有的資源數(shù)量以及進(jìn)程的各種數(shù)量顯示出來(lái),接著就是銀行家算法的主體,通過(guò)用戶輸入的進(jìn)程分配第一個(gè)資源,接著由程序自行判斷,用銀行家算法變成資源預(yù)分配狀態(tài),接著運(yùn)用安全檢測(cè)函數(shù)檢測(cè)與分配的安全性,如果安全責(zé)則輸出安全序列,分配成功,否則資源請(qǐng)求不合理再重新調(diào)配資源。小結(jié)與心得體會(huì)通過(guò)本實(shí)驗(yàn)加深了我對(duì)死鎖避免銀行家算法的理解,死鎖避免其關(guān)鍵首先在于對(duì)于請(qǐng)求資源不能大于剩余資源的數(shù)量,也就是用戶剛開(kāi)始輸入判斷的那步,還有就是要時(shí)刻檢查資源是否足夠還有系統(tǒng)嘗試著分配資源給進(jìn)程然后得到新的安全序列,不安全則恢復(fù),這也是銀行家算法的核心。在本實(shí)驗(yàn)中還加深了我對(duì)于進(jìn)程死鎖的理解,理解安全狀態(tài)與不安全狀態(tài)的概念,進(jìn)程死鎖的條件是互斥、占有且等待、不可搶占、循環(huán)等待,這也是在避免死鎖時(shí)的關(guān)鍵,可以通過(guò)對(duì)于任一條件的不滿足破壞死鎖,但是銀行家算法相比與其他,代價(jià)較小,當(dāng)進(jìn)程分配的為死鎖序列時(shí),程序?qū)?huì)進(jìn)行回滾,恢復(fù)原來(lái)的狀態(tài),使系統(tǒng)不會(huì)出現(xiàn)死鎖狀態(tài)。在做本實(shí)驗(yàn)之前,在學(xué)習(xí)銀行家算法時(shí),原本是有一些些不明白,在通過(guò)本實(shí)驗(yàn)之后,茅塞頓開(kāi),感覺(jué)十分奇妙,是死鎖避免安全性檢查的奇特,也讓我對(duì)操作系統(tǒng)的興趣又加深了一步,也希望將來(lái)能夠?qū)W習(xí)到更多更深的知識(shí)去豐富自己,加強(qiáng)自己。實(shí)驗(yàn)題目實(shí)驗(yàn)七、磁盤調(diào)度算法的模擬與實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康牧私獯疟P結(jié)構(gòu)以及磁盤上數(shù)據(jù)的組織方式。掌握磁盤訪問(wèn)時(shí)間的計(jì)算方式。掌握常用磁盤調(diào)度算法及其相關(guān)特性??傮w設(shè)計(jì)背景知識(shí)磁盤調(diào)度算法:磁盤調(diào)度的目的是要盡可能降低磁盤的尋道時(shí)間,以提高磁盤I/O系的性能。先進(jìn)先出算法FIFO:按訪問(wèn)請(qǐng)求到達(dá)的先后次序進(jìn)行調(diào)度。最短服務(wù)時(shí)間優(yōu)先算法SSTF:優(yōu)先選擇使磁頭臂從當(dāng)前位置開(kāi)始移動(dòng)最少的磁盤I/O請(qǐng)求進(jìn)行調(diào)度。SCAN(電梯算法):要求磁頭臂先沿一個(gè)方向移動(dòng),并在途中滿足所有未完成的 請(qǐng)求,直到它到達(dá)這個(gè)方向上的最后一個(gè)磁道,或者在這個(gè)方向上沒(méi)有別的請(qǐng)求為止,后一種改進(jìn)有時(shí)候稱作LOOK策略。然后倒轉(zhuǎn)服務(wù)方向,沿相反方向掃描,同樣按順序完成所有請(qǐng)求。C-SCAN(循環(huán)掃描)算法:在磁盤調(diào)度時(shí),把掃描限定在一個(gè)方向,當(dāng)沿某個(gè)方 向訪問(wèn)到最后一個(gè)磁道時(shí),磁頭臂返回到磁盤的另一端,并再次開(kāi)始掃描。磁盤數(shù)據(jù)的組織:磁盤上每一條物理記錄都有唯一的地址,該地址包括三個(gè)部分:磁頭號(hào)(盤面號(hào))、柱面號(hào)(磁道號(hào))和扇區(qū)號(hào)。給定這三個(gè)量就可以唯一地確定一個(gè)地址。磁盤訪問(wèn)時(shí)間的計(jì)算方式:磁盤在工作時(shí)以恒定的速率旋轉(zhuǎn)。為保證讀或?qū)?,磁頭必須移動(dòng)到所要求的磁道上,當(dāng)所要求的扇區(qū)的開(kāi)始位置旋轉(zhuǎn)到磁頭下時(shí),開(kāi)始讀或?qū)憯?shù)據(jù)。對(duì)磁盤的訪問(wèn)時(shí)間包括:尋道時(shí)間、旋轉(zhuǎn)延遲時(shí)間和傳輸時(shí)間。模塊介紹主函數(shù)模塊先進(jìn)先出算法FIFO模塊最短服務(wù)時(shí)間優(yōu)先算法SSTF模塊SCAN(循環(huán)掃描)算法模塊C-SCAN(循環(huán)掃描)算法模塊設(shè)計(jì)步驟首先對(duì)于main函數(shù)的總體設(shè)計(jì),采用用戶輸入磁道號(hào)數(shù)組與算法編號(hào),然后調(diào)用相應(yīng)算法函數(shù)先進(jìn)先出算法FIFO模塊的設(shè)計(jì)最短服務(wù)時(shí)間優(yōu)先算法SSTF模塊的設(shè)計(jì)SCAN(循環(huán)掃描)算法模塊的設(shè)計(jì)C-SCAN(循環(huán)掃描)算法模塊的設(shè)計(jì)詳細(xì)設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)#definemaxsize1000//定義最大數(shù)組域voidsort(int*a,intleft,intright)//二分法排序voidFIFO(intarray[],intm)//先進(jìn)先出調(diào)度算法voidSSTF(intarray[],intm)//最短服務(wù)時(shí)間優(yōu)先算法voidSCAN(intarray[],intm)//掃描算法,采用look策略voidCSCAN(intarray[],intm)//循環(huán)掃描算法,采用look策略程序流程圖3.關(guān)鍵代碼voidsort(int*a,intleft,intright)//二分法排序{if(left>=right)/*如果左邊索引大于或者等于右邊的索引就代表已經(jīng)整理完成一個(gè)組了*/{return;}inti=left;intj=right;intkey=a[left];while(i<j)/*控制在當(dāng)組內(nèi)尋找一遍*/{while(i<j&&key<=a[j])//找到從右邊開(kāi)始第一個(gè)大于key的值 /*而尋找結(jié)束的條件就是找到一個(gè)小于或者大于key的數(shù)(大于或小于取決于你想升序還是降序)2、沒(méi)有符合條件1的,并且i與j的大小沒(méi)有反轉(zhuǎn)*/{ j--;}/*向前尋找*/a[i]=a[j];/*找到一個(gè)這樣的數(shù)后就把它賦給前面的被拿走的i的值(如果第一次循環(huán)且key是a[left],那么就是給key)*/while(i<j&&key>=a[i])/*這是i在當(dāng)組內(nèi)向前尋找,同上,不過(guò)注意與key的大小關(guān)系停止循環(huán)和上面相反,因?yàn)榕判蛩枷胧前褦?shù)往兩邊扔,所以左右兩邊的數(shù)大小與key的關(guān)系相反*/{ i++; }a[j]=a[i];} a[i]=key; /*當(dāng)在當(dāng)組內(nèi)找完一遍以后就把中間數(shù)key回歸*/ sort(a,left,i-1);/*最后用同樣的方式對(duì)分出來(lái)的左邊的小組進(jìn)行同上的做法*/ sort(a,i+1,right);/*用同樣的方式對(duì)分出來(lái)的右邊的小組進(jìn)行同上的做法*/ /*當(dāng)然最后可能會(huì)出現(xiàn)很多分左右,直到每一組的i=j為止*/}實(shí)驗(yàn)結(jié)果與分析實(shí)驗(yàn)結(jié)果:先進(jìn)先出算法(FIFO)最短服務(wù)時(shí)間優(yōu)先算法(SSTF)掃描算法(SCAN)(LOOK策略)循環(huán)掃描算法(C-SCAN)(LOOK策略)實(shí)驗(yàn)分析:先來(lái)先服務(wù)的優(yōu)點(diǎn)為簡(jiǎn)單與公平,缺點(diǎn)就是平均尋道時(shí)間距離大,效率不高,磁壁粘著,適用于磁盤I/O較少的場(chǎng)合;最短尋道時(shí)間優(yōu)先算法性能比"先來(lái)先服務(wù)"好,能保證平均尋道時(shí)間最短,但是可能出現(xiàn)"饑餓"現(xiàn)象,

磁壁粘著;掃描算法尋道性能較好,可避免"饑餓"現(xiàn)象;既考慮了距離,同時(shí)又考慮了方向,但是卻不利于遠(yuǎn)離磁頭一端的訪問(wèn)請(qǐng)求,

磁壁粘著;循環(huán)掃描算法則消除了對(duì)兩端磁道請(qǐng)求的不公平。小結(jié)與心得體會(huì)通過(guò)本次實(shí)驗(yàn)讓我充分了解了掌握常用磁盤調(diào)度算法及其相關(guān)特性,在本實(shí)驗(yàn)我們模擬的是磁盤調(diào)度的模擬和實(shí)現(xiàn),充分了解其各種調(diào)度算法的原理以及對(duì)于尋道數(shù)量以及平均尋道長(zhǎng)度的理解,在設(shè)計(jì)算法時(shí)候,要注意的就是要掌握各算法特性以及它調(diào)度的規(guī)律,我們?cè)谠O(shè)計(jì)算法時(shí),還要注意代碼代碼的重復(fù)利用性,就是可以單獨(dú)提出一個(gè)重復(fù)利用到的函數(shù),比如掃描算法都是運(yùn)用了look策略,我們就使用了一個(gè)sort二分查找的函數(shù)供他們調(diào)用,減少了代碼的耦合性,還是代碼不顯得冗余、易懂。然后在設(shè)計(jì)算法時(shí)遇到的困難就是在設(shè)計(jì)時(shí)要運(yùn)用許多的for循環(huán)去累加數(shù),比如累加尋道數(shù)量的累加,容易搞混淆,要及其注意,然后還有對(duì)于其他來(lái)說(shuō)就是sort函數(shù)的編寫(xiě),通過(guò)各種學(xué)習(xí)與請(qǐng)教,讓我搞懂以及不斷測(cè)試后,終于將程序功能變得十分完善,十分完美。通過(guò)這次的學(xué)習(xí),讓我感受到了計(jì)算機(jī)磁盤調(diào)度的奇妙之處,在不同場(chǎng)合結(jié)果其實(shí)并不相同,分為不同的場(chǎng)合,各種磁盤調(diào)度算法都不一樣,也讓我感受到,人類真正實(shí)現(xiàn)智能化,還需要我們這一代的努力與奮斗,不斷突破自我,深入學(xué)習(xí),才能使操作系統(tǒng)的未來(lái)更上一層樓,我也愿意在這方面貢獻(xiàn)我的綿薄之力!實(shí)驗(yàn)題目實(shí)驗(yàn)九、基于信號(hào)量機(jī)制的并發(fā)程序設(shè)計(jì)實(shí)驗(yàn)?zāi)康幕仡櫜僮飨到y(tǒng)進(jìn)程、線程的有關(guān)概念,針對(duì)經(jīng)典的同步、互斥、死鎖與饑餓問(wèn)題進(jìn)行并發(fā)程序設(shè)計(jì)與實(shí)現(xiàn)。理解Linux支持的信息量機(jī)制,利用IPC的信號(hào)量系統(tǒng)調(diào)用編程實(shí)現(xiàn)哲學(xué)家進(jìn)餐問(wèn)題。總體設(shè)計(jì)背景知識(shí)哲學(xué)家進(jìn)餐問(wèn)題描述有五個(gè)哲學(xué)家,他們的生活方式是交替地進(jìn)行思考和進(jìn)餐,哲學(xué)家們共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個(gè)碗和五支筷子,平時(shí)哲學(xué)家進(jìn)行思考,饑餓時(shí)便試圖取其左、右最靠近他的筷子,只有在他拿到兩支筷子時(shí)才能進(jìn)餐,該哲學(xué)家進(jìn)餐完畢后,放下左右兩只筷子又繼續(xù)思考。約束條件:只有拿到兩只筷子時(shí),哲學(xué)家才能吃飯。如果筷子已被別人拿走,則必須等別人吃完之后才能拿到筷子。任一哲學(xué)家在自己未拿到兩只筷子吃完飯前,不會(huì)放下手中已經(jīng)拿到的筷子模塊介紹wait_for_2fork()模塊(對(duì)兩個(gè)筷子進(jìn)行p操作)free_2fork()模塊(對(duì)筷子進(jìn)行V操作)philosephere()模塊(哲學(xué)家模塊)Main()主函數(shù)模塊設(shè)計(jì)步驟分析實(shí)驗(yàn)要求,找到實(shí)驗(yàn)解決辦法,確定數(shù)據(jù)結(jié)構(gòu)分析然后編寫(xiě)主函數(shù)模塊,定義5個(gè)信號(hào)量都為1,創(chuàng)建五個(gè)進(jìn)程編寫(xiě)philosephere()模塊(哲學(xué)家模塊),對(duì)于進(jìn)程進(jìn)行PV操作編寫(xiě)P操作函數(shù)模塊編寫(xiě)V操作函數(shù)模塊運(yùn)行測(cè)試、分析結(jié)果詳細(xì)設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)#defineERR_EXIT(m)do{perror(m);exit(EXIT_FAILURE);}while(0)#defineDELAY(rand()%5+1)intsemid;//信號(hào)量IDunionsemun{ intval; /*ValueforSETVAL*/ structsemid_ds*buf; /*BufferforIPC_STAT,IPC_SET*/ unsignedshort*array; /*ArrayforGETALL,SETALL*/ structseminfo*__buf; /*BufferforIPC_INFO(Linux-specific)*/};程序流程圖關(guān)鍵代碼voidwait_for_2fork(intno)//P操作{ intleft=no;intright=(no+1)%5;//拿右邊的筷子structsembufbuf[2]={{left,-1,0},{right,-1,0}};//拿起筷子,因此第left,right信號(hào)量減一semop(semid,buf,2);//P操作,若果能同時(shí)拿起兩個(gè)筷子,就不用等待}voidfree_2fork(intno)//V操作{ intleft=no;intright=(no+1)%5;structsembufbuf[2]={{left,1,0},{right,1,0}};//放下筷子,因此第left,right信號(hào)量加一semop(semid,buf,2);//V操作,同時(shí)放下兩只筷子}intphilosephere(intno)//哲學(xué)家算法{srand(getpid());for(;;){printf("%disthinking\n",no);sleep(DELAY);printf("%dishungry\n",no);wait_for_2fork(no);printf("%diseating\n",no);sleep(DELAY);free_2fork(no);}}intmain(intargc,char*argv[]){unionsemunsu;su.val=1;semid=semget(IPC_PRIVATE,5,IPC_CREAT|0666);//因?yàn)槭歉缸舆M(jìn)程通信,可以設(shè)置為IPC_PRIVATE,五個(gè)人,因此管理五個(gè)信號(hào)量if(semid==-1)ERR_EXIT("semget");for(inti=0;i<5;i++)semctl(semid,i,SETVAL,su);//將5個(gè)信號(hào)量分別初始化為1intno=0;inti=0;pid_tpid;for(i=1;i<5;i++){pid=fork(); //產(chǎn)生5個(gè)進(jìn)程if(pid==-1)ERR_EXIT("fork");if(pid==0){no=i;break;//必須break,否則子進(jìn)程會(huì)創(chuàng)建出新的進(jìn)程}}//printf("no=%d\n",no);philosephere(no);return0;}實(shí)驗(yàn)結(jié)果與分析實(shí)驗(yàn)結(jié)果:........分析:實(shí)驗(yàn)未出現(xiàn)死鎖現(xiàn)象,進(jìn)程一直在重復(fù)的思考、就餐。然后程序沒(méi)有運(yùn)行卡著,即沒(méi)有發(fā)生死鎖現(xiàn)象,從中也可以發(fā)現(xiàn)同時(shí)最多只能有兩個(gè)哲學(xué)家一起用餐,也不會(huì)出現(xiàn)相鄰哲學(xué)家一起用餐的情況。小結(jié)與心得體會(huì)通過(guò)本次實(shí)驗(yàn)首先是對(duì)于哲學(xué)家就餐問(wèn)題有了更深的了解,按照實(shí)驗(yàn)要求通過(guò)PV操作來(lái)解決哲學(xué)家就餐問(wèn)題,這也使我回顧了操作系統(tǒng)進(jìn)程、線程的有關(guān)概念,針對(duì)經(jīng)典的同步、互斥、死鎖與饑餓問(wèn)題進(jìn)行并發(fā)程序設(shè)計(jì)與實(shí)現(xiàn),在運(yùn)用PV操作解決哲學(xué)家問(wèn)題的同時(shí),我也發(fā)現(xiàn)了另外幾種可以很好解決哲學(xué)家就餐問(wèn)題的方法,比如允許最多4個(gè)哲學(xué)家同時(shí)坐在桌子上或者只有一個(gè)哲學(xué)家的兩根筷子都可用時(shí),他才能拿起它們(他必須在臨界區(qū)內(nèi)拿起兩根筷子)?;蛘呤褂梅菍?duì)稱解決方案。即單號(hào)的哲學(xué)家先拿起左邊的筷子,接著右邊的筷子;而雙號(hào)的哲學(xué)家先拿起右邊的筷子,接著左邊的筷子。在設(shè)計(jì)本實(shí)驗(yàn)時(shí),主要就是PV操作的運(yùn)用,在運(yùn)用PV操作時(shí)就是對(duì)于semop函數(shù)的操作,先是對(duì)于信號(hào)量的加一或者減一,然后調(diào)用semop函數(shù)進(jìn)行PV操作,因此本實(shí)驗(yàn)的關(guān)鍵就是對(duì)于信號(hào)量系統(tǒng)調(diào)用編程實(shí)現(xiàn)哲學(xué)家進(jìn)餐問(wèn)題,也讓我深刻理解了Linux支持的信息量機(jī)制,我也從中體會(huì)到操作系統(tǒng)的奇妙之處,加深了我對(duì)于操作系統(tǒng)的學(xué)習(xí)以及理解,我從中也受益匪淺。實(shí)驗(yàn)題目實(shí)驗(yàn)十、簡(jiǎn)單shell命令行解釋器的設(shè)計(jì)與實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康谋緦?shí)驗(yàn)主要目的在于進(jìn)一步學(xué)會(huì)如何在Linux系統(tǒng)下使用進(jìn)程相關(guān)的系統(tǒng)調(diào)用,了解shell工作的基本原理,自己動(dòng)手為L(zhǎng)inux操作系統(tǒng)設(shè)計(jì)一個(gè)簡(jiǎn)單的命令接口??傮w設(shè)計(jì)背景知識(shí)常見(jiàn)的shell內(nèi)部命令如下:cd<目錄>更改當(dāng)前的工作目錄到另一個(gè)<目錄>。如果<目錄>未指定,輸出當(dāng)前工作目錄如果<目錄>不存在,應(yīng)當(dāng)有適當(dāng)?shù)腻e(cuò)誤信息提示。這個(gè)命令應(yīng)該也能改變PWD的環(huán)境變量environ列出所有環(huán)境變量字符串的設(shè)置(類似于Linux系統(tǒng)下的env命令)echo<內(nèi)容>顯示echo后的內(nèi)容且換行help簡(jiǎn)短概要的輸出你的shell的使用方法和基本功能。jobs輸出shell當(dāng)前的一系列子進(jìn)程,必須提供子進(jìn)程的命名和PID號(hào)。quit,exit,bye退出shell。提示:shell的主體就是反復(fù)下面的循環(huán)過(guò)程while(1){接收用戶輸入的命令行;解析命令行;if(用戶命令為內(nèi)部命令)直接處理;elseif(用戶命令為外部命令)創(chuàng)建子進(jìn)程執(zhí)行命令;else提示錯(cuò)誤的命令;}模塊介紹一個(gè)main函數(shù)模塊包含了判斷與響應(yīng)的操作設(shè)計(jì)步驟分析實(shí)驗(yàn)要求,確定好所要實(shí)現(xiàn)的shell內(nèi)部命令,確定數(shù)據(jù)結(jié)構(gòu)將所確定的shell命令行進(jìn)行分類,按照首字母來(lái)分類在細(xì)分shell命令,編寫(xiě)shell命令詳細(xì)操作測(cè)試程序,分析結(jié)果 詳細(xì)設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)charcmd[2100]; //用來(lái)存放用戶的輸入命令intlen=strlen(cmd)//用來(lái)獲取用戶命令行長(zhǎng)度charcata[100]; //用來(lái)將cmd值傳遞賦值程序流程圖關(guān)鍵代碼intmain(){charcmd[2100];while(1){printf("\n--------------------------------------------------\n"); printf("shell命令行解釋器"); printf("\n--------------------------------------------------\n\n");printf("請(qǐng)輸入你的操作:");scanf("%s",cmd);Intlen=strlen(cmd),i;if(cmd[0]=='e'&&cmd[1]=='c')//echo{intflag=0;for(i=5;i<len-1;i++){if(cmd[i]!='')flag=1;//hif(flag){putchar(cmd[i]);}} if(flag){putchar('\n');}elseif(cmd[0]=='q'||cmd[1]=='x'||cmd[0]=='b')//quit,exit,bye {printf("Bye\n"); return0;}elseif(cmd[0]=='h'){ //helpprintf("echo<content>\tprintalinecontent\n");printf("quit,exit,bye\tendproduce\n");printf("cd<catalog>\techocatalog\n");printf("jobs\techoprocessnameandpid...\n");printf("environ\techoenvironmentvariable\n");}els

溫馨提示

  • 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)論