freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

天津科技大學操作系統(tǒng)實驗(已修改)

2025-07-08 21:29 本頁面
 

【正文】 20122013學年第一學期計算機操作系統(tǒng)實驗報告專 業(yè):軟件工程班 級:111033學 號:11103325姓 名:趙孟翔提交日期:2013年11月27日 目 錄實驗一 Windows多線程..................................................1實驗二 Windows線程同步機制 ...........................................5實驗三 Windows線程通信................................................9實驗四 銀行家算法模擬.................................................15實驗五 頁面置換算法模擬...............................................22實驗一 Windows多線程【開發(fā)語言及實現平臺或實驗環(huán)境】C++/CMicrosoft Visual Studio 【實驗目的】(1) 進一步理解操作系統(tǒng)的并發(fā)性;(2) 了解Windows線程創(chuàng)建方法,并通過查閱資料理解各參數的含義;(3) 了解多線程程序設計方法,并進行簡單應用。【實驗要求】(1) 逐程序進行簡要分析、運行各程序并仔細閱讀注釋;(2) 查閱MSDN或其他資料,掌握相關系統(tǒng)調用使用方法和參數含義;(3) 完成實驗報告?!鞠嚓P知識】一、內核對象(一) 內核對象的概念內核對象是內核分配的一個內存塊,這種內存塊是一個數據結構,表示內核對象的各種特征。并且只能由內核來訪問。應用程序若需要訪問內核對象,需要通過操作系統(tǒng)提供的函數來進行,不能直接訪問內核對象(Windows從安全性方面來考慮的)。內核對象通過Create*來創(chuàng)建,返回一個用于標識內核對象的句柄,這些句柄(而不是內核對象)可在創(chuàng)建進程范圍內使用,不能夠被傳遞到其他進程中被使用。(二) 內核對象使用的計數因為內核對象的所有者是內核,而不是進程,所以何時撤銷內核對象由內核決定,而內核做這個決定的依據就是該內核對象是否仍然被使用。那么如何判斷內核對象是否被使用呢?可以通過內核對象的“使用計數”屬性,一旦這個值變成0了,內核就可以釋放該對象了。(三) 創(chuàng)建內核對象進程與句柄表每個進程在初始化的時候,將被分配一個句柄表,該句柄表中只存儲內核對象的句柄,不存儲用戶對象的句柄。句柄表的詳細結構微軟沒有公布,但是大致包含三個內容:內核對象句柄,內核對象地址,訪問屏蔽標志。創(chuàng)建內核對象及操作系統(tǒng)內部機制利用CreateSomeObject的函數來創(chuàng)建內核對象。調用該函數的時候內核就為該對象分配一個內存塊,并進行初始化,然后內核再掃描該進程的句柄表,初始化一條記錄并放在句柄表中。進程中使用內核對象的內部機制假設函數F使用某個內核對象,其參數為Handle1,則該函數內部需要查找該進程的句柄表,找出參數句柄對應的記錄,然后才能使用該內核對象。(四) 關閉內核對象無論進程怎樣創(chuàng)建內核對象,在不使用該對象的時候都應當通過bool CloseHandle(HANDLE hobj)來向操作系統(tǒng)聲明結束對該對象的訪問。為什么叫聲明呢?是因為此時也許還有其他進程對該對象的訪問,操作系統(tǒng)可能并不立即釋放該對象。操作系統(tǒng)需要做的是:從進程的句柄表中刪除該內核對象的記錄,另外再考察該內核對象的使用計數以決定是否需要釋放該對象。(五)內核對象的共享說到共享,與之孿生的就是共享權限。Windows內核對象的共享有三種方式:繼承式共享(父子進程間)只有當進程是父子關系的時候,才能使用此種方式的共享。特別要注意的是繼承的是內核對象的句柄,內核對象本身是不具備繼承性。要達到這種繼承的效果需要做以下幾件事:在進程創(chuàng)建內核對象的時候,需要一個安全結構sa(SECURITY_ATTRIBUTES類型,以向OS聲明對象的訪問方式)作為參數。繼承式共享需要將結構的成員設置為TRUE此時OS內部的處理式將進程的句柄表中的該對象的訪問屏蔽字段設置成“可繼承”。在創(chuàng)建子進程(CreateProcess函數)時,設置創(chuàng)建參數bInheritHandles為TRUE表示被創(chuàng)建的子進程可以繼承父進程中的所有可繼承內核對象。OS內部的處理是:復制父進程句柄表中的記錄到子進程的句柄表中,并使用相同的句柄值;為內核對象的使用計數器加1特別說明:子進程能夠繼承的的內核對象僅局限于父進程創(chuàng)建它的時候所擁有的可繼承內核對象。子進程誕生后,父進程再搞出什么可繼承的東西,子進程是不能用的。這就需要在子進程中使用繼承的內核對象的時候需要慎重,以確定內核對象是否已被繼承了。利用SetHandleinformation方法可以隨時修改內核對象句柄的一些屬性,目前公開的句柄屬性有兩種,一種是該句柄是否能被繼承,另一種是該句柄是否能被關閉。同名共享同名共享,不需要共享進程之間存在父子關系。但局限于內核對象是否支持這種共享方式。創(chuàng)建內核對象的Create函數中是否包含pszName是該內核對象是否支持同名共享的標志。l方法一:當Process1通過CreateObject(…”someName”)創(chuàng)建了一個名字為someName的內核對象后,Process2也調用了CreateObject(…”someName”),此時內核的動作是:在全局中查詢發(fā)現已經存在someName1的對象;為Process2的句柄表添加一條Ojbect的記錄,使用的句柄不確定;為someName這個Object的引用計數器加1方法二:Process2使用OpenObject(…”someName”)的方式來獲得對名someName的Object的句柄。用這種Open方法的時候,需要提供一個參數讓OS鑒權,以判定是否能夠以參數指定的方式來訪問內核對象。復制內核對象的句柄的方式共享跨進程邊界的內核對象共享的另外一個方法是通過DuplicateHandle來復制內核對象句柄。如果要將ProcessS中的對象拷貝到ProcessT中則調用DuplicateHandle的進程一定要有對這兩個進程的訪問權,即句柄表中擁有這兩個進程內核對象的句柄記錄。二、線程的一般概念進程只是線程的容器,從來不執(zhí)行任何東西;線程總是在某個進程中被創(chuàng)建;線程在進程的地址空間中執(zhí)行代碼;線程們共享進程中的所有內核對象。三、線程的創(chuàng)建HANDLE CreateThread(PSECURITY_ATTRIBUTES psa,DWORD cbStack,PTHREAD_START_ROUTINE pfnStartAddr,PVOID pvParam,DWORD fdwCreate,PDWORD pdwThreadID)。調用CreateThread后,OS進行如下幾個動作:生成一個線程內核對象;在進程空間內為線程分配堆棧空間。因為線程的環(huán)境同于其所在進程的環(huán)境,所以創(chuàng)建的線程可以訪問進程中的所有資源,包括線程中所有的內核對象。四、線程銷亡(一)終止線程的方式l線程函數返回(最好使用這個方式,可以保證:線程中創(chuàng)建的C++對象正常析構;OS釋放線程堆棧內存;OS將線程的退出碼設置為線程函數的返回值;系統(tǒng)將遞減該線程內核對象的的使用計數器【如果此時還有其他引用……,見下面說明】。)l調用ExitThread(不能釋放C++對象,所以最好不要使用這個方式。另外,如果非要調用也應當調用編譯器推薦的,如_endThread【Windows核心編程P127】)l同進程內的其他線程(包括主線程)調用TerminateThread(被撤銷線程得不到通知,不能釋放資源,盡量避免這種方式。另外這個函數是個異步函數,返回時,線程不保證已經被撤銷,如果要觀察線程是否被撤銷,應當使用WaitForSingleObject)包含線程的進程終止(應當避免這種方式)(二)線程退出時OS的行為l線程內的所有用戶對象被釋放。l線程的退出碼從STILL_ACTIVE改為傳遞給ExitThread或TerminateThread的代碼l線程內核對象的狀態(tài)改為“已通知”如果線程為進程中的最后一個線程,則OS將進程當作已終止運行l(wèi)線程內核對象的引用計數器減1(一旦線程終止了,其他引用改線程內核對象將不能夠處理改線程的句柄,但是可以通過調用GetExitcodeThread來檢查hThread代表的線程是否已經終止運行了。)【實驗步驟】(1) ,認真觀察結果。然后將main函數中注釋掉的Sleep語句讓其可用,即將其前面的注釋號刪掉,再多次運行,認真觀察結果。比較修改程序前后運行結果發(fā)生的變化,并分析其原因。(2) ,認真觀察結果。(3) ,認真觀察結果。然后將main函數中注釋掉的Sleep語句讓其可用,即將其前面的注釋號刪掉,再多次運行,認真觀察結果。再將兩個子函數中注釋掉的Sleep語句讓其可用,再多次運行,認真觀察結果,可能會出現銷售出0號票的情況。比較修改程序前后運行結果發(fā)生的變化,并分析其原因?!緦嶒灲Y果與分析】(1) ::將main函數中注釋掉的Sleep語句讓其可用,運行結果為:分析原因:Sleep(0)的作用為語句可觀察線程1和主線程并發(fā)執(zhí)行。輸出結果“main thread is running /thread1 is running”。沒有添加的線程1運行結束只輸出“main thread is running”(2) ::分析原因:、線程因為在兩個線程中存在共享變量,因此執(zhí)行結果出現不可再現性。(3) :將主進程的sleep可用,運行結果為:將兩個子函數中注釋掉的Sleep語句讓其可用,再多次運行:多次運行修改后的程序結果為:分析原因:子函數添加sleep語句后會在之前結果上多出銷售0號票的情況,這是因為程序中只要票號大于0便繼續(xù)執(zhí)行線程。實驗二 Windows線程同步機制【開發(fā)語言及實現平臺或實驗環(huán)境】C++/CMicrosoft Visual Studio 【實驗目的】(1) 了
點擊復制文檔內容
教學教案相關推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1