操作系統原理實驗報告_第1頁
操作系統原理實驗報告_第2頁
操作系統原理實驗報告_第3頁
操作系統原理實驗報告_第4頁
操作系統原理實驗報告_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《操作系統原理》

實驗報告班級: 姓名: 學號: 指導老師: 目錄:實驗題目:實驗一線程創(chuàng)建與撤銷 錯誤!未定義書簽實驗題目:實驗二線程同步 錯誤!未定義書簽實驗題目:實驗三線程互斥 錯誤!未定義書簽實驗題目:實驗四進程通信 錯誤!未定義書簽實驗題目:實驗五讀者-寫者問題 錯誤!未定義書簽實驗題目:實驗六進程調度 錯誤!未定義書簽實驗題目:實驗七存儲管理之動態(tài)鏈接庫 錯誤!未定義書簽實驗題目:實驗八存儲管理之內存分配 錯誤!未定義書簽實驗題目:實驗九存儲管理之頁面置換算法 錯誤!未定義書簽實驗題目:實驗十設備管理 錯誤!未定義書簽實驗題目:實驗十一文件管理之文件讀寫 錯誤!未定義書簽實驗題目:實驗一線程創(chuàng)建與撤銷完成人:XXX報告日期:2018年3月31日一、實驗內容簡要描述(1)熟悉VC++VisualStudio開發(fā)環(huán)境。(2)使用相關函數創(chuàng)建和撤銷線程。(3)在一個進程中創(chuàng)建3個線程,名字分別為threada、threadb、threadc。threada輸出“helloworld!threadb輸出“Mynameis。threadc輸出“Pleasewait…”,然后sleep5秒鐘,接著輸出“Iwakeup”。二、 程序設計1、設計思路該函數創(chuàng)建一個在調用進程的地址空間中執(zhí)行的線程。2、主要數據結構HANDLECreateThread(LPSECURITY_ATTRIBUTESIpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINEIpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);VOIDExitThread(DWORDdwExitCode);VOIDSleep(DWORDdwMilliseconds);VOIDSleep(DWORDdwMilliseconds);三、實驗結果1、基本數據lpThreadAttributes:指向一個SECURITY_ATTRIBUTES勾,該結構決定了返回的句柄是否可被子進程繼承。若lpThreadAttributes為NULL則句柄不能被繼承。在WindowsNT^該結構的lpSecuhtyDescriptor 成員定義了新進程的安全性描述符。若lpThreadAttributes為NULL則線程獲得一個默認的安全性描述符。dwStackSize:定義原始堆棧提交時的大小(按字節(jié)計)。系統將該值舍入為最近的頁。若該值為0,或小于默認時提交的大小,默認情況是使用與調用線程同樣的大小。更多的信息,請看ThreadStackSize。IpStartAddress:指向一個LPTHREAD_START_ROUTlNE的應用定義的函數,該線程執(zhí)行此函數。該指針還表示潰程進程中線程的起始地址。該函數必須存在于遠程進程中。IpParameter:定義一個傳遞給該迸程的32位值。dwCreationFIags:定義控制進程倉U建的附力口標志。若定義了CREATE_SUSPENDED標志,線程創(chuàng)建時處于掛起狀態(tài),并且直到ResumeThread?數調用時d能運行。若該值為0,則該線程在創(chuàng)建后立即執(zhí)行。lpThreadId:指向一個32位值,它接收該線程的標識符。2.源程序代碼行數完成該實驗投入的時間(小時數)與其他同學討論次數31113、測試結果分析口百格動磁星\i乍,提作案統解殂bin\Debug\testexeflellaWorld!我的專字:孫婷我的孚號114134820?Pleasewait.--Iuakeup_Pi^ocessreturned4683872<0x^778executiontime:5.029sPressanykeytocontinue.四、實驗體會1、實驗體會和收獲深入理解了線程與進程的概念,熟悉了在Windows環(huán)境下何時使用進程,何時使用線程,怎么創(chuàng)建和撤銷線程。五、源代碼#include<>#include<iostream>usingnamespacestd;DWORDWINAPIta(LPVOIDargv){cout<<"HelloWorld!\n";}DWORDWINAPItb(LPVOIDargv){cout<<"我的名字:孫婷\n";cout<<"我的學號:9\n";}DWORDWINAPItc(LPVOIDargv){cout<<"Pleasewait...\n";Sleep(5000);cout<<"Iwakeup.\n";}intmain(){HANDLEthreada,threadb,threadc;DWORDTEST;threada=CreateThread(NULL,0,ta,NULL,0,0);threadb=CreateThread(0,0,tb,0,0,0);threadc=CreateThread(0,0,tc,0,0,0);ExitThread(TEST);ExitThread(TEST);ExitThread(TEST);return0;}實驗題目:實驗二 線程同步完成人:XXX報告日期:2018年4月7日一、 實驗內容簡要描述1)在程序中使用CreateSemaphore(NULL,0,1,"SemaphoreNam31)創(chuàng)建一個名為SemaphoreName的信號量,其初值為0。2)使用OpenSemaphore(SYNCHRONIZE]SEMAPHORE__MODIFY_STATE,NULL,"SemaphoreName1)打開該信號量。3)創(chuàng)建一個子線程,主線程創(chuàng)建子線程后調WaitForSingleObject(hHandle,INFINITE),這里等待時間設置為INFINITE表示要一直等待下去,直到該信號量被喚醒為止。4)子線程sleep5秒鐘,然后輸出“Iamover.”結束,調用ReleaseSemaphore(hHandle1,1,NULL)釋放信號量,使信號量的值加1。二、 程序設計1、設計思路A)等待一個對象WaitForSingleObjects 函數決定等待條件是否被滿足。如果等待條件并沒有被滿足,調用線程進人一個高效的等待狀態(tài),當等待滿足條件時占用非常少的處理器時間。在運行前,一個等待函數修改同步對象類型的狀態(tài)。修改僅發(fā)生在引起函數返回的對象身上。例如,信號的計數減l。WaitForSingleObject函數能等待的對象包括:Changenotification改變通告);Consoleinput(控制臺輸入);Event(事件);Job(作業(yè));Mutex(互斥對象);Process(進程);Semaphore(信號量);Thread(線程);Waitabletimer(可等待定時器)。當使用等待函數或代碼直接或間接創(chuàng)建窗口時, 一定要小心。如果一個線程創(chuàng)建了任何窗口,它必須處理進程消息。消息廣播被發(fā)送到系統的所有窗口。 一個線程用沒有超時的等待函數也許會引起系統死鎖。 間接創(chuàng)建窗口的兩個例子是DDE和COMCoInitialize。因此,如果用戶有一個創(chuàng)建窗口的線程,用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx函數,而不要用SignalObjectAndWait函數。B)等待多個對象WaiForMultipleObjects 函數當下列條件之一滿足時返回:(1)任意一個或全部指定對象處于信號態(tài);(2)超時間隔已過。C)創(chuàng)建信號量如果成功就傳回一個handle,否則傳回NULL不論哪一種情況,GetLastError都會傳回一個合理的結果。如果指定的Semaphore名稱已經存在,則函數還是成功的,GetLastError會傳回ERROR_ALREADY_EXISTSD)打開信號量為現有的一個已命名信號機對象創(chuàng)建一個新句柄。E)增加信號量的值該函數將指定信號對象的計數增加一個指定的值。2、主要數據結構DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);DWORDWaitForMultipleObjects(DWORDnCountCONSTHANDLE*lpHandlesBOOLfWaitAll,DWORDdwMilliSeconds)HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpAttributes,LONGlInitialCount,LONGlMaximumCountLPCTSTRlpName);HANDLEOpenSemaphore(DWORDdwDesiredAccessC:\U5ers\jsj\De5kt。p\testl\bin\Debug\tMtl.exeSendplioreCreateSuccess*SenaploreOpenSuccess!riiFeadlcreateSucchee*NouInThread!Ianouei*_ReleaseSemApLoFeei*F=87SenaplioveIReleaseSuccess!fc=1WaitForBin3leObjecterr=0UfiIT_OBJECT?d?eS=0我的名字,孫婷我的學號:141240209Procesereturned0<0x0> execu^ion(ime:8.005sPressanyMeytocontinue.);rc=ReleaseSemaphore(hHandle1,1,NULL);Often,acriticalsectionobjectisusedtoprotectsharedresources 。通過定義在數據段中的——個CRITICAL_SECTION吉構實現。CRITICAL_SECTIONmyCritical;并且在任何線程使用此臨界區(qū)對象之前必須對它進行初始化。void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);之后,任何線程訪問臨界區(qū)中數據的時候,必須首先調用EnterCriticalSection函數,申請進入臨界區(qū)(又叫關鍵代碼段,使用共享資源的任何代碼都必須封裝在此)。在同一時間內,Windows只允許一個線程進入臨界區(qū)。所以在申請的時候,如果有另一個線程在臨界區(qū)的話,EnterCriticalSection 函數會一直等待下去,直到其他線程離開臨界區(qū)才返回。EnterCriticalSection 函數用法如下:voidEnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);當操作完成的時候,還要將臨界區(qū)交還給 Windows以便其他線程可以申請函數來完成使用。這個工作由LeaveCriticalSection函數來完成voidLeaveCriticalSection(LPCRITICAL_SECTIONIpCriticalSection);當程序不再使用臨界區(qū)對象的時候,必須使用DeleteCriticalSection函數將它刪除。voidDeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);b.使用互斥鎖(Interlocked)提供一種手段來保證值的遞增(減)能夠以原子操作方式來進行,也就是不中斷地進行。LONGInterlockedIncrement(LPLONGlpAddend);試結果分析C:\LI&ers\j可\Des匕Dp\test\t)in\Debug\test.exeThreadlcreatesuccess!TlipeadScreatesuccess!countinfunc2=6countinfund=7Processreturned0<0x0>execirtiontine:1?0095Pj'e£& tocontinue.四、實驗體會1、實驗體會和收獲熟練了Windows系統環(huán)境下線程的創(chuàng)建與撤銷,熟悉了Windows系統提供的線程互斥API,使用Windows系統提供的線程互斥API解決實際問題。五、源代碼#include<>#include<>#include<>staticintcount=5;epuei*PipeCreate£u.ccesetep-uftp-PipeConnectSuccess!er-uer-PipeRead.SuccessfftTAFaneClientis=He1Lo!Mynunber:141340209*Mynane:?孫婷LcascInputToSend.?Iio,孫瘴,eruerPipeWriteSuccess?eruerPipeConnectSuccess*erverPipeReadSucces!AiIAfi*onClient19=endIonsei*-uebeEND*1nputDataPLea&e?H&Llo!raunbei?:141340239.Mynane=-于卜婷WaitPipeSugga尊寸GallPipeSuccess!Dataff?Sfepu&risH.llo!孫婷!1raputDataPlease?endH*帕Client:tobeEND?pipe\\myPipe";charInBuffer[50]="";charOutBuffer[50]="";DWORDBytesRead,BytesWrite;hPipeHandle=CreateNamedPipe((LPCTSTR)lpName,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED|WRITE_DAC,PIPE_TYPE_MESSAGE|PIPE_READMODE_BYTE|PIPE_WAIT,1,20,30,NMPWAIT_USE_DEFAULT_WAIT,(LPSECURITY_ATTRIBUTES)NULL); \pipe\\myPipe";charInBuffer[50]="";charOutBuffer[50]="";DWORDBytesRead;intnRetCode=0;interr=0;while(1){strcpy(InBuffer,"");strcpy(OutBuffer,"");printf("InputDataPlease!\n");scanf("%s",InBuffer);if(!strcmp(InBuffer,"end")){CallNamedPipe(lpName,InBuffer,sizeof(InBuffer),OutBuffer,sizeof(OutBuffer),&BytesRead,NMPWAIT_USE_DEFAULT_WAIT);break;}rc=WaitNamedPipe(lpName,NMPWAIT_WAIT_FOREVERg讀者擁有臨界區(qū)的所有權,寫者都阻塞在臨界區(qū)對象write上。當寫者擁有臨界區(qū)對象所有權時,第一個判斷完readcount==1后,其余的讀者由于等待對readcount的判斷,阻塞在Mutex上!寫者優(yōu)先:寫者優(yōu)先和讀者優(yōu)先有相同之處,不同的地方在:一旦有一個寫者到來時,應該盡快讓寫者進行寫,如果有一個寫者在等待,則新到的讀者操作不能讀操作,為此添加一個整型變量writecount,記錄寫者的數目,當writecount=0時才可以釋放讀者進行讀操作!為了實現對全局變量writecount的互斥訪問,設置了一個互斥對象Mutex3。為了實現寫者優(yōu)先,設置一個臨界區(qū)對象 read,當有寫者在寫或等待時,讀者必須阻塞在臨界區(qū)對象read上。讀者除了要一個全局變量readcount實現操作上的互斥外,還需要一個互斥對象對阻塞在read這一個過程實現互斥,這兩個互斥對象分別為 mutexl和mutex2。3、主要數據結構voidRP_ReaderThread(void*p)讀者線程信息voidRP_WriterThread(void*p)寫者線程信息voidReaderPriority(char*file)讀者優(yōu)先處理函數voidWP_ReaderThread(void*p)讀者線程信息voidWriterPriority(char*file)寫者優(yōu)先處理函數三、實驗結果1、測試結果分析A.讀者優(yōu)先運行ReaderPriopity:Readerthread1sent?thereadingrequire?Readerthread1beginstopeadfile.WritertllHBjd2Sent£tlieurltIngrequire_Keaderthread3Sentstlie1*6adIngrequire_Kea.de戶thread3beginstoreadfile.Wi'itepthread5sentsthewritingpequire■R&aderthread4sentsthereadingrrequireRfintierthread4beginstoreadflie.Readerthread3finishertreadingfile.n^adcrthread1Finishedreadingfile.Hed.derthread4Finisbed1k停ad£ngfile.Writertlnread2beyinstoVritet。the£ile.Wi'iterthread2finishedWritingtothefileteptfii?ead5beginstoUrite七t>theFlie,Wi'iterthread5FinishedWritingtothefile11readerandwaiterhavefinishedoperatinressAnyKeyToContinue:B.寫者優(yōu)先運行n",m_serial);n",m_serial);TiterPvioi'ity:WriterMyiterMritei*WriterUviterWriterWriterthreadthreadthreadthreadthl'fe^dthreadthread1sentsthew尸五七]WriterMyiterMritei*WriterUviterWriterWriterthreadthreadthreadthreadthl'fe^dthreadthread1sentsthew尸五七]ngr-E(£iJiireIjegin尋to27entsthebeginsto3sentstheS£ent£the4sentstheWritetothefile,writin^iE(tuii*€*Uritetothefile,writiieccuire.unitingrequire.uritinffr-E(iuirE.WriterWriterWriterWriterWritel*Writerthread;thi'eadthreadthreadthreadthi"eadlWritertJir'ead

WriterthreadfinigticdWritingtQthefile.WriterWriterWriterWriterWritel*Writerthread;thi'eadthreadthreadthreadthi"eadlWritertJir'ead

Writerthread力egin寫tQUritetothefile.finishingrWritin^|tothefileheginstoU^itetot)?efile.finishedUi'itIngtothe£ile.beginstoUritet:othefiLe-Finish±n;rWptotliefile

finishedWritingtothefile.H11readerAndwriterhavefinishedoperatingPressarhyKeifToContinue四、實驗體會1、實驗體會和收獲Windows2000/XP提供了互斥量(mutex)、信號量(semapore)、事件(event)等三種同步對象和相應的系統調用,用于線程的互斥與同步。通過對讀者寫者問題的調試,了解Windows2000/XP中的同步機制。五、源代碼#include""#include<>#include<>#include<>#include<>#include<>#include<>#defineREADER'R'n",m_serial);#defineREADER'R'n",m_serial);n",m_serial);Sleep(m_persist);n",m_serial);n",m_serial);n",m_serial);Sleep(m_persist);n",m_serial);erial;inFile>>thread_info[n_thread].entity;inFile>>thread_info[n_thread].delay;inFile>>thread_info[n_thread++].persist;();}for(inti=0;i<(int)(n_thread);i++){if(thread_info[i].entity==READER||thread_info[i].entity=='R'){h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),&thread_info[i],0,&thread_ID);n");}n",m_serial);wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);Sleep(m_persist);n",m_serial);n",m_serial);n",m_serial);Sleep(m_persist);n",m_serial);erial;inFile>>thread_info[n_thread].entity;inFile>>thread_info[n_thread].delay;inFile>>thread_info[n_thread++].persist;();}for(inti=0;i<(int)(n_thread);i++){if(thread_info[i].entity==READER||thread_info[i].entity=='R'){n");}試結果分析g\testexe?C;\Usurs\jsJ\Dcktop\tus,g\testexe要創(chuàng)建的進理數目:輸入選程的調度萬玄:<P/R)器入迸程名字和進岸所需時現13143546進程名2優(yōu)先級46輪數8cps時間需要時間0 4進程狀態(tài)U計數器03450Q 5U044400 6U014760 3R0進程名優(yōu)先級輪數cpu時間需要時間進程狀態(tài)計數器34500 5W94144440RQ 61 2UU01O4680 4R0進程名優(yōu)先級掄數cpu時間需要時間進程狀態(tài)計數器444UU 6U14401 2W124301 3U134500 5R0進程名優(yōu)先級論數CP11時間需要時間進程狀態(tài)計數器14401 2U1243n1 3U134201 4U144400 6R0進程名優(yōu)先級論數cpu時間需要時間進程狀態(tài)計數器24301 3U1142n1 4U114101 5U114401 2B1進程名優(yōu)先級輪數cpu時|用需要時間進程狀態(tài)計數器342n1 4U144161 SU114102 12243U1 3K1進程名優(yōu)先級筋cpu時村需要時間講程狀態(tài)計的器441R1 5U114162 1U224082 2W234201 4R1陽聆優(yōu)先級輪數CDU時間需要時間講程狀態(tài)計數器14102 1U224002 2W233702 3W244101 5R1進程名優(yōu)先級輪數「P,時間需要時間進程狀態(tài)計數器94002 2U233902 3W2438U2 4U214102 1R2進程名優(yōu)先級輪數cpu時間需要時間進程狀態(tài)計數器33902 3U2438U2 4W213803 0F3C!\Uae圖國XOfrsktopt.且H\b?n\Defaug,t@ct自檢能程名程七扣々不土P程日程日優(yōu)先級38373819優(yōu)先級373b38判優(yōu)先級363E38羽先線J53834流先級333834需先級32加3d程名花丸級38程書驕呈名2G卷先級383436■先級343gZb?pu時閭22 、Lpa時間3 、cpu時間434gcpu時間444cpu時間4CRU時間34cpu時間34需要時間41S需要時間14需要時間23n3要時間3需要時間1Q3需要時間2同B需要時間0阿0署要對間0S01需要時間noe工驗入?141?朝如9,孫婷「口匚匕s寫reLuriitiil0<0x0>exccutlunLineressanyJkeytocontinue?送程狀態(tài)F法超狀態(tài)F)程狀態(tài)F也程狀態(tài)WFF立程狀態(tài)UFF能桂狀態(tài)U1FF程狀態(tài)FFF近程狀態(tài)FFF*程狀態(tài)F.79fs四、實驗體會,,回iJ1、實驗過程中遇到的問題及解決過程(1)本次試驗,思路設計不難,主要還是在利用指針處理時感覺很困難,實驗中設計了結構指針用來指向PCB計PC叫構中又有鏈表指針。為此必須時時防止出現野指針,程序崩潰。(2)在建立優(yōu)先數就緒隊列時主要運用,鏈表插入模型。但是由于本題是從建立、到完成一個就緒對列,所以必須分多種情況討論。2、實驗體會和收獲(1)本次試驗后對優(yōu)先數調度算法和時間片輪轉調度算法實現的過程,有了很清楚的認識、理解。設計計數器來對進程執(zhí)行狀態(tài)的時間分析, 使得進程調度這一抽象模型得到具體化。之后,便是對進程的插入(執(zhí)行完,插入到完成隊列,否則插入到就緒)和再次調度(當改進程再次滿足條件時,從就緒隊列調度到執(zhí)行隊列)重復過程。(2)通過設計PC叫構,模擬進程調度,加深了對進程的理解。(3)提高了C語言編程動手能力,在設計就緒隊列時,通過優(yōu)先數將新進程插入就緒隊列中的適當位置。要做多重判斷,但實際又是“鏈表插入”模型的運用,無論多復雜的問題,都可以分化成簡單的問題在已有的模型上處理。五、源代碼#include<>#include<>#include<>typedefstructnode{charname[20];/* 進程的名字*/intprio;/*進程的優(yōu)先級*/intround;/*分配CPU的時間片*/intcputime;/*CPU執(zhí)行時間*/intneedtime;/*進程執(zhí)行所需要的時間*/intcputime;/*CPU執(zhí)行時間*/intneedtime;/*進程執(zhí)行所需要的時間*/charstate;/*進程的狀態(tài),W--就緒態(tài),R——執(zhí)彳T態(tài),F——完成態(tài)*/intcount;/*記錄執(zhí)行的次數*/structnode*next;/*intcount;/*記錄執(zhí)行的次數*/structnode*next;/*鏈表指針*/}PCB;PCB*ready=NULL,*run=NULL,*finish=NULL;/*定義三個隊列,就緒隊列,執(zhí)行隊列和完成隊列*/執(zhí)行隊列和完成隊列*/intnum;voidGetFirst();/*從就緒隊列取得第一個節(jié)點*/voidOutput();/*輸出隊列信息*/voidInsertPrio(PCB*in);/*創(chuàng)建優(yōu)先級隊列,規(guī)定優(yōu)先數越小,優(yōu)先級越高*/voidInsertTime(PCB*in);/*時間片隊列*/voidInsertFinish(PCB*in);/*時間片隊列*/voidPrioCreate();/*優(yōu)先級輸入函數voidGetFirst();/*從就緒隊列取得第一個節(jié)點*/voidOutput();/*輸出隊列信息*/voidInsertPrio(PCB*in);/*創(chuàng)建優(yōu)先級隊列,規(guī)定優(yōu)先數越小,優(yōu)先級越高*/voidInsertTime(PCB*in);/*時間片隊列*/voidInsertFinish(PCB*in);/*時間片隊列*/voidPrioCreate();/*優(yōu)先級輸入函數*/voidTimeCreate();/*時間片輸入函數*/voidPriority。; voidPriority。; /*按照優(yōu)先級調度*/voidRoundRun();/*時間片輪轉調度voidRoundRun();/*時間片輪轉調度*/intmain(void)charchose;printf(” 請輸入要創(chuàng)建的進程數目:\n");scanf("%d”,&num);getchar();printf(" 輸入進程的調度方法:(P/R)\n");scanf("%c”,&chose);switch(chose){case'P':case'p':PrioCreate();Priority。;break;case'R':case'r':TimeCreate();RoundRun();break;default:break;}Output();printf("\n");printf("實驗人:9,孫婷\n");return0;}voidGetFirst()/* 取得第一個就緒隊列節(jié)點*/{run=ready;if(ready!=NULL){run->state='R';while(p!=NULL)while(p!=NULL)while(p!=NULL)while(p!=NULL)ready=ready->next;run->next=NULL;}}voidOutput()/*輸出隊列信息*/{PCB*p;p=ready;printf("進程名\t優(yōu)先級\t輪數\tcpu時間\t需要時間\t進程狀態(tài)\t計數器\n");while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p=p->next;}p=finish;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p=p->next;}p=run;{{{{printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p=p->next;}}voidInsertPrio(PCB*in)/* 創(chuàng)建優(yōu)先級隊列,規(guī)定優(yōu)先數越小,優(yōu)先級越低*/{PCB*fst,*nxt;fst=nxt=ready;if(ready==NULL)/* 如果隊列為空,則為第一個元素*/{in->next=ready;ready=in;}else/* 查到合適的位置進行插入*/{if(in->prio>=fst->prio)/* 比第一個還要大,則插入到隊頭*/{in->next=ready;ready=in;}elseif(ready==NULL)if(ready==NULL)if(ready==NULL)if(ready==NULL)while(fst->next!=NULL)/*移動指針查找第一個別它小的元素的while(fst->next位置進行插入*/{nxt=fst;fst=fst->next;}if(fst->next==NULL)/* 已經搜索到隊尾,則其優(yōu)先級數最小,將其插入到隊尾即可*/{in->next=fst->next;fst->next=in;}else/*插入到隊列中*/{nxt=in;in->next=fst;}}}}voidInsertTime(PCB*in)/* 將進程插入到就緒隊列尾部*/{PCB*fst;fst=ready;{{while(fst->next!=NULL)while(fst->next!=NULL){{while(fst->next!=NULL)while(fst->next!=NULL)in->next=ready;ready=in;}else{while(fst->next!=NULL){fst=fst->next;}in->next=fst->next;fst->next=in;}}voidInsertFinish(PCB*in)/* 將進程插入到完成隊列尾部*/{PCB*fst;fst=finish;if(finish==NULL){in->next=finish;finish=in;}else{{{{{fst=fst->next;}in->next=fst->next;fst->next=in;}}voidPrioCreate()/* 優(yōu)先級調度輸入函數*/{PCB*tmp;inti;printf("輸入進程名字和進程所需時間:\n");for(i=0;i<num;i++){if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL){perror("malloc");exit⑴;}scanf("%s",tmp->name);getchar();/*吸收回車符號*/scanf("%d”,&(tmp->needtime));tmp->cputime=0;tmp->state='W;tmp->prio=50-tmp->needtime;/* 設置其優(yōu)先級,需要的時間越多,優(yōu)先級越低*/tmp->round=0;tmp->count=0;InsertPrio(tmp);/* 按照優(yōu)先級從高到低,插入到就緒隊列*/}}voidTimeCreate()/* 時間片輸入函數*/{PCB*tmp;inti;printf(" 輸入進程名字和進程時間片所需時間:/n");for(i=0;i<num;i++){if((tmp=(PCB*)malloc(sizeof(PCB)))==NULL){perror("malloc");exit⑴;}scanf("%s",tmp->name);getchar();scanf("%d”,&(tmp->needtime));tmp->cputime=0;tmp->state='W;tmp->prio=0;tmp->round=2;/* 假設每個進程所分配的時間片是2*/tmp->count=0;InsertTime(tmp);}voidPriority。/* 按照優(yōu)先級調度,每次執(zhí)行一個時間片*/{intflag=1;GetFirst();while(run!=NULL)/*當就緒隊列不為空時,則調度進程如執(zhí)行隊列執(zhí)行*/{Output();/* 輸出每次調度過程中各個節(jié)點的狀態(tài)*/while(flag){run->prio-=3;/* 優(yōu)先級減去三*/run->cputime++;/*CPU 時間片加一*/run->needtime--;/* 進程執(zhí)行完成的剩余時間減一*/if(run->needtime==0)/* 如果進程執(zhí)行完畢,將進程狀態(tài)置為 F,將其插入到完成隊列*/{run->state='F';run->count++;/* 進程執(zhí)行的次數加一*/InsertFinish(run);flag=0;}else/* 將進程狀態(tài)置為W入就緒隊列*/run->state='W;run->count++;/*進程執(zhí)行的次數加一*/InsertTime(run);flag=0;}}flag=1;*/GetFirst();/* 繼續(xù)取就緒隊列隊頭進程進入執(zhí)行隊列*/}}voidRoundRun()/* 時間片輪轉調度算法*/{intflag=1;GetFirst();while(run!=NULL){Output();while(flag){run->count++;run->cputime++;進程執(zhí)行完畢*/進程執(zhí)行完畢*/if(run->needtime==0)/*{run->state='F';InsertFinish(run);flag=0;}elseif(run->count==run->round)/* 時間片用完*/{run->state='W;run->count=0;/* 計數器清零,為下次做準備*/InsertTime(run);flag=0;}}flag=1;GetFirst();}}實驗題目:實驗七存儲管理之動態(tài)鏈接庫完成人:XXX報告日期:2018年5月12日實驗內容簡要描述1)編寫動態(tài)鏈接庫實現如下功能:①求兩個數的最大值和最小值;②求1+2+3+4+-+n(n作為一個參數)。2)編寫程序,通過隱式鏈接和顯式鏈接調用動態(tài)鏈接庫。程序設計4、設計思路動態(tài)鏈接庫入口函數DllMain()函數是動態(tài)鏈接庫的入口函數,函數原型如下:BOOLAPIENTRYDllMain(HANDLEhModuleDWORDul_reason_for_call,LPVOIDlpReserved)hModule:動態(tài)鏈接庫的句柄;reason_for_call:指明系統調用該函數的原因;lpReserved:動態(tài)鏈接庫是否需要動態(tài)加載或卸載。動態(tài)鏈接庫的導入與導出在動態(tài)鏈接庫源程序中聲明導出函數的代碼如下:_declspec(dllexport)MyDllFunction(intx,inty);其中關鍵字_declspec(dllexport)表示要導出其后的函數MyDllFunction()。如果一個動態(tài)鏈接文件中的函數還需要調用其他動態(tài)鏈接庫,此時,動態(tài)鏈接庫文件除了導出函數外,還需要一個導入函數,聲明導入函數的代碼如下:_declspec(dllimport)DllFunction(intx,inty);動態(tài)鏈接庫的兩種鏈接方式:隱式鏈接和顯式鏈接。隱式鏈接應用程序的源代碼只引用動態(tài)鏈接庫中包含的符號,當應用程序運行時,加載程序隱式地將動態(tài)鏈接庫裝入到進程的地址空間中。顯式鏈接應用程序運行時使用LoadLibrary()顯式地加載所需要的動態(tài)鏈接庫,并顯式地鏈接需要的輸出符號表。5、主要數據結構BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){returnTRUE;}intMax(intx,inty); 求最大值intMin(intx,inty); 求最小值intSum(intn);求和實驗結果.測試結果分析四、實驗體會1、實驗體會和收獲一開始用編譯時頭 文件#include"”一直編譯不通過所以換成 MicrosoftVisualStudio2010編譯,實踐理解了動態(tài)鏈接庫的原理,學會使用動態(tài)庫編寫簡單程序,最終完成實驗。五、源代碼Dll:#include""#include""extern"C"_declspec(dllexport)intMax(intx,inty);/Debug/")extern"C"_declspec(dllexport)intMax(int,int);.+1=%d",Sum(100));getchar();}實驗題目:實驗八 存儲管理之內存分配完成人:XXX報告日期:2018年5月19日實驗內容簡要描述1)編寫一個程序,創(chuàng)建兩個線程,一個用于內存分配,另一個用于跟蹤內存的分配情況并打印信息。2)將VirtualAlloc函數的參數ftAllocahonType分別改為MEM_RES或MEM_TOP_DOWNnProtect參數分另改為PAGE_GUARPAGE_NOACCESSPAGE_NOCACHE進行本實驗的各項操作,以及查看內存分配的各個結果,分析原因。3)嘗試調換分配、回收、內存復位、加鎖、解鎖、提交、回收的次序,查看結果,并分析原因。程序設計6、設計思路1)查看系統信息2)查看系統內存信息3)虛擬內存分配4)釋放虛擬空間5)虛擬空間加鎖6)虛擬空間解鎖Windows進程的虛擬地址空間中也有三種狀態(tài)的頁面:空閑頁面、保留頁面和提交頁面。空閑(Free)頁面:空閑頁面是指那些可以保留或提交的可用頁面。保留(Reserved)頁面:保留頁面是邏輯頁面已分配但沒有分配物理存儲的頁面。設置這種狀態(tài)的效果是可以保留一部分虛擬地址,這樣,如果不預先釋放這些地址,就不能被其他應用程序(如Malloc,LocalAlloc等)的操作所使用。試圖讀或寫空閑頁面或保留頁面將導致頁面出錯異常。保留頁面可被釋放或提交。提交(Committed)頁面:提交頁面是物理存儲(在內存中或磁盤上)已被分配的頁面??蓪λ右员Wo,不許訪問或允許只讀訪問,或允許讀寫訪問。提交也可以被回收以釋放存儲空間,從而變成保留頁面。在本實驗中,首先創(chuàng)建工程makefile生成隨機輸入文件,其中包含對內存要求作的各種操作;然后創(chuàng)建工程MemoryAllocation,實現輸入文件所要求的各項內存管理操作。7、主要數據結構VOIDGetSystemInfo(LPSYSTEM_INFOIpSystemInfo);該函數返回當前系統的信息VOIDGlobalMemoryStatus(LPMEMORYSTATUSlpBuffer);該函數可以獲得計算機系統中當前使用的物理內存和虛擬內存的信息。LPVOIDVirtualAlloc(LPVOIDlpAddress,DWORDdwSize,DWORDflAllocationType,DWORDflProtect);該函數可以在調用進程的虛擬地址中保留或提交頁面。除非設置了MEM_RESET志,否則被這個函數分配的內存單元被自動初始化為00BOOLVirtualFree(LPVOlDlpAddress,DWORDdwSizeDWORDdwFreeType);可以釋放或注銷調用進程虛擬空間中的頁面。BOOlVirtualLocK(LPVOIDlpAddress,DWORDdwSize);該函數可以將進程虛擬空間中的內存加鎖。以確保后面的對該區(qū)域的存取操作不會產生頁面失敗。BOOlVirtualUnLock(LPVOIDlpAddress,DWORDdwSize);該函數可以將進程虛擬空間指定范圍內的頁面解鎖,從而系統在必要時可以將這些頁面換出到頁面文件中。三、實驗結果1、基本數據源程序代碼行數完成該實驗投入的時間(小時數)與其他同學討論次數231402、實驗結果文做^ 格式查注M*劭(H)TOC\o"1-5"\h\z0dwActiveProQ0&5QfMask 15dwAllocationGranularity 65536dwNumberOfProc6SSor& AdwOemld0dwPageSize4096dwProcesso<Type586ipMaximumApplicationAddress t)x7FFEFFFFIpMinimumApphcationAddress0x00010000wProcessorArchitecture0wProc&ssorLevel6wProGessorReviwn10759wReseived0*曹離****,曹*曹**青*河育*******前*,曹,哀喉曾曹曹河**河河河**才■清鴦'苒*再■、f*—,號*魯號曹書曹河*河,曹事長奇立力,—dwAvailPageFile 2377965568dwAvailPhys 900399104dwAvaiMrtual 21375344&4dwLength32dwMemorytoad 56dwTotaiPageFiie 418646960dwTotalPhys 2082324480dwTotafVirtual 2147352576&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&?&&&&&&&&&&&&&&&AlocaiionBase0x00010000AlocationProtect4BaseAddress 0x00010000Protect4RegionSize 65536State4096Type262144四、實驗體會1、實驗體會和收獲本次試驗讓我們從不同側面了解Windows系統對用戶進程的虛擬內存空間的管理和分配方法,同時了解跟蹤程序的編寫方法 (與被跟蹤程序保持同步,使用Windows提供的信號量),對Windows分配虛擬內存、改變內存狀態(tài),以及對物理內存和頁面文件狀態(tài)查詢的API函數的功能、參數限制、使用規(guī)則等有了進一步了解。五、源代碼1)tart=VirtualAlloc(NULL,*,MEM_RESERVE,PAGE_NOACCESS);traceArray[index++].size=*;cout<<"startingaddress:"<<traceArray[index-1].start<<"\t"<<"size:"<<traceArray[index-1].size<<endl;break;}case1:tart=VirtualAlloc(traceArray[index].start,traceArray[index].size,MEM_COMMIT,temp);index++;cout<<"startingaddress:"<<traceArray[index-1].start<<"\t"<<"size:"<<traceArray[index-1].size<<endl;break;}case2:tart<<"size:"<<traceArray[index].size<<endl;if(!VirtualLock(traceArray[index].start,traceArray[index++].size))cout<<GetLastError()<<endl;tart<<"\t"<<"size:<<traceArray[index].size<<endl;if(!VirtualUnlock(traceArray[index].start,traceArray[index++].size))cout<<GetLastError()<<endl;break;}tart<<"\t"<<"size:"<<traceArray[index].size<<endl;if (! VirtualFree(traceArray[index].start,traceArray[index++].size,MEM_DECOMMIT))cout<<GetLastError()<<endl;break;}tart<<"\t"<<"size:"<<traceArray[index].size<<endl;if (!VirtualFree(traceArray[index++].start,0,MEM_RELEASE))cout<<GetLastError()<<endl;break;}default:cout<<"error"<<endl;}ReleaseSemaphore(trac,1,NULL);n=i;pl[i].pfn=INVALID; 示該頁不在主存中pl[i].counter=0; ime=-1; ext=&pfc[i+1];fn=i; ext=NULL;pfc[total_pf-1].pfn=total_pf-1;freepf_head=&pfc[0]; fn==INVALID)

ime&&pl[j].pfn!=INVALID)MinT=pl[j].time;MinPn=j;}}freepf_head=&pfc〔pl[MinPn].pfn];fn=INVALID;ime=-1;fn=freepf_head->pfn;ime=CurrentTime;ime=CurrentTime;fn==INVALID)fn!=INVALID)fn!=INVALID&&pl[page[j]].counter==0)dist[page[j]]==100000)ounter=1;fn=INVALID;fn!=INVALIDounter=0;ime&&pl[j].pfn!=INVALID)MinT=pl[j].time;MinPn=j;}}freepf_head=&pfc〔pl[MinPn].pfn];fn=INVALID;ime=-1;fn=freepf_head->pfn;ime=CurrentTime;ime=CurrentTime;fn==INVALID)fn!=INVALID)fn!=INVALID&&pl[page[j]].counter==0)dist[page[j]]==100000)ounter=1;fn=INVALID;fn!=INVALIDounter=0;&&fn];}pl[page[i]].pfn=freepf_head->pfn;fn==lNVALID)fn=INVALID;swap=1;if(use[pnext->pfn]==0){fn=pnext->pfn;fn]=1;fn==lNVALID)fn=INVALID;fn=pnext->pfn;swap=1;fn=pnext->pfn;if(use[pnext->pfn]==0){?C:\Users\jsj\Desktop\test\bin\Debug\test.exeI::Winders=121601.rackspercylinder=255ectopspertrack=63iytespersector■512I:I)1000202273280CBytes>=95386?Cttb>I)processreturned1C0xl> executiontime;0.013sIg>essanykeytocontinue.IgrleaseSelectReadorUritefInput'R'roread..fU*toUrlXfj.'Q'tocult9PleAseEoputtheSecCorNumberCoReadPorR:;or>tcnt:TextContent:>NTLDR<$130 0r摩foffi^confirsf饒of麼rof詵&fnuafd-,dfwwofmof^jrnornQf?師ormef.nROfm0r鳧 r6<^J王?x睪 fm司益 c赴?af?ef<TO? 8"f蛤Ag,B+9fCr^8Fnb6,fffTOfDfOArff3^|2$fOfOf??八OfOf?2O?r?<>s4肋鴕▲&(uF?Fer?aT]Qr岫btoo彳卓9raF?:b?4F?bt?re柚f盧*frDffHexTextContcot2,bb54sqe0di092010240?l9e33030?0fffffffOb63。86OHffffFffeb12fffrff90fffffff9M00H?HH0RRRRflffffFfF8cFffffffcSffffFffSoffFfff£d8fFffffFclfffFfffed4FfffFffaffFfff&btretft^nettetffh””門??俛r”*"。"rfttrefh76b046frtfettbiioIa66fffffff7ffffffe366fffffffa34e266ffffff8be4R0ffffff80fffffff?BfrrffFfsr。erFrprrr6rfrrrrd9frrrm>eiaee66rfrrffd3fFf/rFoafrrrrcb8ffffff9B66ffffff<il4c266fffffff7ffffffcl66ffffffa352266ffffffiebh6633frrrff<i26Grffffpf?rpfffrrajrrFfrf?32rrrrr/es714ggffffffllb04G266ffffff8?e222663o52266fffffffVV。262663o5226,FfffffS9e2a2663?S2266fffrfff89e3a2663eS2266ffffff89e422,6ffffFfb8ffffFf9BB0R66ffffff8bo222FfffrfoS966bffffffedffFffFB457fffffffs66ffffff2e266ffFffFb8FFFffffaH00066Ffffff8be262:”手“?846946 322“fff/ffbfi 000“ e2a2F”Ffe834966ffffffa336266ffffffal2e266bfffffffcMfffrfff8424fffffffff6.7frrrrfee78 8rfffrrrfesibturrtfe67*rrrfffedsaiot7342 4 s ggfffffFfb6-18c 66FfffffB? e62Z6766ffrfff8b -18866ffffff87cSo 2 66 ffTffal5e266fftfCffbVebO33ffffffd2GGfffffFffIffFL“,6266ffffffAl 4WZ6636 5?266fffffff?3462 66ffffffr833c322B f fffffH4IdH66ffTfffB33e362 Rrfffffr84ffrCFfcS fFfffrfd66rfffff8l>Le 36 2s766fffffff9b3。46266ffffff0l2?2fffFff99ffffffbeX“fffffFfb?。9I66ffffffM22R0fffffFfeSffFfffffe766bfffffFc0fFFfFfff84fffffFfa896.766.tttfttth0le766 3。3a2tttfffoA31666 3a2tffttt>b2B0a066ffffffb??HHH66ffffffbaBB0Bffffffc8ffffffd6B66ffffffasftfFftcQtfrrrrres23aerffff^ia?2“ffffffbbfrrrrrea0。0“ffrrfb???00,loatoSelec1Recd01*UriCef1nouC'R'a*o 'U'CoUrifg.'Q'to<1uil?50 954-44S5294g24649(I33B3。00ffffffeU?80??000008060000?00?00(10000000000?80?0()00000080080000ffffFfeb12rffffF90£”「"900000000000000000fffffffScffffffcSffffffSe(FFTffd8fffffFelffFFffeO4fffffffaFFfFff8bffffffcBffffffffbffffffc83fffffffc66f 6b066fffffffb61cd0 66ffffff^4e266tftfHQbe4。。0fFfffffSfeQffFffffGffFfffd966FfFFffb810B066fFffffd3fffffFe0JFffffeb8fffFff9866ffffFfal4e266(ffffff?ffffffel66ffffffa352266fffffffb7leb06633ffffffd266fffffff? 66f£fff£s3562ffffffeS71466£fFPfF8be4a266fFFfff89e222663e52266£F「ff£89e262663e52268fFffff89e2a26€3eS2266Ffffff89e3a2663e52266fFffffS9e42266ffffffb8ffffff908a066ffffff8be222ffffffeS5f966bffffffcBffffff;8457fFfffffe66ffffffa32e266ffffffb8ffffffafl00066ffffff8be262ffffffcB46.966fffffF&332266FfffffbSfffFffhB00HffffFfSbe2a2ffffffe834966fFffffa336266ffffffal2。266bffffffcBfffffff8424fffffffB67ffffff8078 8Bfffffff85lbffffFffe6766ffffff8d501067342 4 67 66fFfffffM.48e 66fFFfff89 e6226766fffFFFSb 48866ffffff89? 2 66 fffffFal50266fffffFFb?eb06633ffffffd266fffffff?fffffffl66FffffFa366266ffffffal 4226636 Sc266ffffff?3勺62 66fffffff&33e3228 f ffffff84Id。66ffffrf833o362 RfFffffr84ffffFfcS FFfffffd66fffffffible 36 2le766ffffff8b3c46266FffffFal2a2ffffffe8ffffffbc166fffffFfb?e0266ffffffbfi220Bffffffc8ffffffffe?66bffffffc?fffffff84ffffffaS267£6rff/ffftb0le766fffrffflb3e3a2Pffr/feft31666"ffff"3a266ffffffbb2000066Ffffffb9000066fffffFba0000FrffffeSffffffdG866ffffff85ffffffcBfffffff8523066ffffffal3a266fffffffbbffffff8B00066fffffff)906。。PleaseSelectReadorUritcfInput1R1roreA<lr9U1toUrite.'Q'to(£uit9JleaseInputtheSectorHunbertoWriteto:ontent:>lea5eInputtheContenttoUnitetoDiskA:1ENGJIleaseSelectReadorUriteMnput'R'ro to toleaseInputtheSectorMwnbertoReadFoe:TextContentZ澇澇澇澇?例HoxTextContent;:d454。474a-490ffffffccffffffccffffrFccffffffccffffffccffffffccffFFffcffffffccffffffccffffffccffffffccffffffccffffffccffffffccffffffccfffffccffffffccffffffccffffffccffffffccffffffccffffffccffffffccffffffccfffffeeffffffccfrffffccrFffffccffffFFccfrffffccffffffccffffffccffPFffccFffffecffffffFceffffffccFfffffccffffffccffffffccffffffccffffffccffffffccfffffeeffffffccffffffccffffffccffffffccffffffccffffffccffffffccffffffccfffff”fffffffc

溫馨提示

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

評論

0/150

提交評論