![2025年操作系統(tǒng)實(shí)驗(yàn)報(bào)告攻略河北工業(yè)大學(xué)深度解析與實(shí)踐心得_第1頁(yè)](http://file4.renrendoc.com/view14/M03/15/01/wKhkGWdgxpOATFmCAAA0MHi56Y0686.jpg)
![2025年操作系統(tǒng)實(shí)驗(yàn)報(bào)告攻略河北工業(yè)大學(xué)深度解析與實(shí)踐心得_第2頁(yè)](http://file4.renrendoc.com/view14/M03/15/01/wKhkGWdgxpOATFmCAAA0MHi56Y06862.jpg)
![2025年操作系統(tǒng)實(shí)驗(yàn)報(bào)告攻略河北工業(yè)大學(xué)深度解析與實(shí)踐心得_第3頁(yè)](http://file4.renrendoc.com/view14/M03/15/01/wKhkGWdgxpOATFmCAAA0MHi56Y06863.jpg)
![2025年操作系統(tǒng)實(shí)驗(yàn)報(bào)告攻略河北工業(yè)大學(xué)深度解析與實(shí)踐心得_第4頁(yè)](http://file4.renrendoc.com/view14/M03/15/01/wKhkGWdgxpOATFmCAAA0MHi56Y06864.jpg)
![2025年操作系統(tǒng)實(shí)驗(yàn)報(bào)告攻略河北工業(yè)大學(xué)深度解析與實(shí)踐心得_第5頁(yè)](http://file4.renrendoc.com/view14/M03/15/01/wKhkGWdgxpOATFmCAAA0MHi56Y06865.jpg)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
試驗(yàn)一進(jìn)程控制與描述WindowsXP進(jìn)程的"畢生"。二、試驗(yàn)環(huán)境三、試驗(yàn)內(nèi)容和環(huán)節(jié)WindowsXP可以識(shí)別的程序包括控制臺(tái)應(yīng)用程序、GUI應(yīng)用程序和服務(wù)應(yīng)用程序。1、簡(jiǎn)樸的控制臺(tái)應(yīng)用程序[}2、GUI應(yīng)用程序}也可以運(yùn)用任何其他文本編輯器鍵入程序代碼,假如這樣,例如使用WORD來(lái)鍵入和編輯程序,則應(yīng)當(dāng)注意什么問(wèn)題?在“命令提醒符”窗口運(yùn)行CLEXE,產(chǎn)生1-2.EXE文獻(xiàn):在程序1-2的GUT應(yīng)用程序中,首先需要Windows.h頭文獻(xiàn),以便獲得傳送給WinMainO和MessageBox)API函數(shù)的數(shù)據(jù)類(lèi)型定義。接著的pragma指令指示編譯器連接器找到User32.LIB庫(kù)文獻(xiàn)并將其與產(chǎn)生的EXE文獻(xiàn)連接起來(lái)。這樣就可以運(yùn)行簡(jiǎn)樸的命令行命令CLMsgBox.CPP來(lái)創(chuàng)立這一應(yīng)用程序,假如沒(méi)有pragma指令,則MessageBox)API函數(shù)就成為未定義的了。這一指令是VisualStudioC++編譯器特有的。接下來(lái)是WinMainO措施。其中有四個(gè)由實(shí)際的低級(jí)入口點(diǎn)傳遞來(lái)的參數(shù)。hlnstance參數(shù)用來(lái)裝入與代碼相連的圖標(biāo)或位圖一類(lèi)的資源,無(wú)論何時(shí),都可用GetModuleHandleOAPI函數(shù)將這些資源提取出來(lái)。系統(tǒng)運(yùn)用實(shí)例句柄來(lái)指明代碼和初始的數(shù)據(jù)裝在內(nèi)存的何處。句柄的數(shù)值實(shí)際上是EXE文獻(xiàn)映像的基地址,一般為0x00400000。下一種參數(shù)hPrevInstance是為向后兼容而設(shè)的,目前系統(tǒng)將其設(shè)為NULL。應(yīng)用程序的命令行(不包括程序的名稱(chēng))是IpCmdLine參數(shù)。此外,系統(tǒng)運(yùn)用nCmdShow參數(shù)告訴應(yīng)用程序怎樣顯示它的主窗口(選項(xiàng)包括最小化、最大化和正常)。最終,程序調(diào)用MessageBox0)API函數(shù)并退出。假如在進(jìn)入消息循環(huán)之前就結(jié)束運(yùn)行的話(huà),最終必須返回0。運(yùn)行成果(試將其中的信息與程序1-1.EXE的運(yùn)行成果進(jìn)行比較):彈出一種消息框,標(biāo)題為Greetings,內(nèi)容為Hello,Windows,中間有一種確認(rèn)按鈕3、進(jìn)程對(duì)象操作系統(tǒng)將目前運(yùn)行的應(yīng)用程序看作是進(jìn)程對(duì)象。運(yùn)用系統(tǒng)提供的惟一的稱(chēng)為句柄(HANDLE)的號(hào)碼,就可與進(jìn)程對(duì)象交互。這一號(hào)碼只對(duì)目前進(jìn)程有效。本試驗(yàn)表達(dá)了一種簡(jiǎn)樸的進(jìn)程句柄的應(yīng)用。在系統(tǒng)中運(yùn)行的任何進(jìn)程都可調(diào)用GetCurrentProcessOAPI函數(shù),此函數(shù)可返回標(biāo)識(shí)進(jìn)程自身的句柄。然后就可在Windows需要該進(jìn)程的有關(guān)狀況時(shí),運(yùn)用這一句柄來(lái)提供。程序1-3:獲得和使用進(jìn)程的句柄(std:cout<<"Currentproces{程序1-3中列出的是一種獲得進(jìn)程句柄的措施。對(duì)于進(jìn)程句柄可進(jìn)行的惟一有用的操作是在API調(diào)用時(shí),將其作為參數(shù)傳送給系統(tǒng),正如程序1-3中對(duì)GetPriorityClassOAPI函數(shù)的調(diào)用那樣。在這種狀況下,系統(tǒng)向進(jìn)程對(duì)象內(nèi)“窺視”,以決定其優(yōu)先級(jí),然后將此優(yōu)先級(jí)返回給應(yīng)用程序。OpenProcessO和CreateProcessOAPI函數(shù)也可以用于提取進(jìn)程句柄。前者提取的是已經(jīng)存在的進(jìn)程的句柄,而后者創(chuàng)立一種新進(jìn)程,并將其句柄提供出來(lái)。在“命令提醒符”窗口運(yùn)行CLEXE,產(chǎn)生1-3.EXE文獻(xiàn):將程序1-4.cpp程序鍵入記事本中,并把代碼保留為1-4.cpp。程序1-4顯示怎樣找出系統(tǒng)中正在運(yùn)行的所有進(jìn)程,怎樣運(yùn)用OpenProcessOAPI函數(shù)來(lái)獲得每一種訪問(wèn)進(jìn)程的深入信息。程序1-4運(yùn)用句柄查出進(jìn)程的詳細(xì)信息//proclist項(xiàng)目DWORDGetKemelModePerc(/將構(gòu)造轉(zhuǎn)化為64位整數(shù)(((ULONGLONG)ftKerneldwHighDate(((ULONGLONG)ftUser.dwHighDateULONGLONGqwTotal=qwKernel+qwU(DWORD)((ULONGLONG)100*qwKernel(/對(duì)目前系統(tǒng)中運(yùn)行的進(jìn)程拍取“快照”HANDLEhSnapshot=::CreateToolhelp32SnTH32CS-SNAPPROCESS,//提取目前進(jìn)程BOOLbMore=::Process32First(hSnapshoHANDLEhProcess=::OpenPrpe.th32ProcessID);//要打開(kāi)的{ftCreation,ftExit,ftKemelMode,hProcess,/所感愛(ài)好的進(jìn)程&ftCreation,//進(jìn)&ftExit,/結(jié)束時(shí)間(假如有的話(huà))&ftKernelMode,/在內(nèi)核模DWORDdwPctKernel=::GetKernelModePerstd::cout<<"ProcessID:"<<p<<",EXEfile:"<<pe.sz<<",%inkernelmode:"<</消除句柄}bMore=::Process32Next(hSnapshot,&p}}程序1-4程序首先運(yùn)用WindowsXP的新特性,即工具協(xié)助庫(kù)來(lái)獲得目前運(yùn)行的所有進(jìn)程的快照。然后應(yīng)用程序進(jìn)入快照中的每一種進(jìn)程,得到其以PROCESSENTRY32構(gòu)造表達(dá)的屬性。這一構(gòu)造用來(lái)向OpenProcessOAPI函數(shù)提供進(jìn)程的ID。Windows跟蹤每一進(jìn)程的有關(guān)時(shí)間,示例中是通過(guò)打開(kāi)的進(jìn)程句柄和GetProcessTimesOAPI來(lái)直詢(xún)得到有關(guān)時(shí)間的。接下來(lái),一種定制的協(xié)助函數(shù)獲得了幾種返回的數(shù)值,然后計(jì)算進(jìn)程在內(nèi)核模式下消耗的時(shí)間占總時(shí)間的比例。程序的其他部分比較簡(jiǎn)樸,只是將有關(guān)信息顯示給顧客,清除進(jìn)程句柄,然后繼續(xù)循環(huán),直到所有進(jìn)程都計(jì)算過(guò)為止。在“命令提醒符”窗口運(yùn)行CLEXE,產(chǎn)生1-4.EXE文獻(xiàn):運(yùn)行成果:西C:\Docuents運(yùn)行成果:西C:\DocuentsandSettinga\AdiniatrProceoID:768.EXEfile:GmGE.oxe.*inkernelProceGID:900.EXEfile:vinlogon·oxe.*nkernelID:956:EXE_fle:LSAs1136.EXEfile:svohoot.exe.*inID:ID:4972EXEFID:6132.EXE*inkernel努部第二部分:進(jìn)程的“畢生”Windows所創(chuàng)立的每個(gè)進(jìn)程都從調(diào)用CreateProcessOAPI函數(shù)開(kāi)始,該函數(shù)的任務(wù)是在對(duì)象管理器子系統(tǒng)內(nèi)初始化進(jìn)程對(duì)象。每一進(jìn)程都以調(diào)用ExitProcess(或TerminatePocess()API函數(shù)終止。一般應(yīng)用程序的框架負(fù)責(zé)調(diào)用ExitProcessO函數(shù)。對(duì)于C++運(yùn)行庫(kù)來(lái)說(shuō),這一調(diào)用發(fā)生在應(yīng)用程序的mainO函數(shù)返回之后。本試驗(yàn)顯示了創(chuàng)立子進(jìn)程的基本框架。該程序創(chuàng)立的子進(jìn)程仍然執(zhí)行父進(jìn)程的程序代碼,顯示它的系統(tǒng)進(jìn)程ID和它在進(jìn)程列表中的位置。創(chuàng)立子進(jìn)程//proccreate項(xiàng)目(:sprintf(szCmdLine,"\"%s'//用于子進(jìn)程的STARTUPINFO構(gòu)造:ZeroMemory(reinterpret_cast<void*>(&si)si.cb=sizeof(si);BOOLbCreateOK=::CreatePNULL,/缺省的進(jìn)程安全性NULL,NULL,/不繼承句柄/使用新的控制臺(tái){)ntmainintargc,char*a/確定進(jìn)程在列表中的位置(std::cout<<"ProcessID:"<<::GetCurrentProcessId0/檢查與否有創(chuàng)立子進(jìn)程的需要(std;cout<<"I'mgone...Bye-bye";)本程序展示的是一種簡(jiǎn)樸的使用CreateProcessOAPI函數(shù)的例子。首先形成簡(jiǎn)樸的命令行,提供目前的EXE文獻(xiàn)的指定文獻(xiàn)名和代表生成克隆進(jìn)程的號(hào)碼。大多數(shù)參數(shù)都可取缺省值,不過(guò)創(chuàng)立標(biāo)志參數(shù)使用了:行為像一種子進(jìn)程標(biāo)志,指示新進(jìn)程分派它自己的控制臺(tái),這使得運(yùn)行示例程序時(shí),在任務(wù)欄上產(chǎn)生許多活動(dòng)標(biāo)識(shí)。然后該克隆進(jìn)程的創(chuàng)立措施關(guān)閉傳遞過(guò)來(lái)的句柄并返回mainO函數(shù)。在關(guān)閉程序之前,每一進(jìn)程的執(zhí)行主線(xiàn)程都會(huì)暫停等待輸入字符,以便讓顧客觀測(cè)子進(jìn)程的行為。CreateProcess)函數(shù)有5個(gè)關(guān)鍵參數(shù)?本試驗(yàn)程序中設(shè)置的各個(gè)參數(shù)的值的含義是:a.(LPCTSTRIpApplicatic.(BOOLblnheritHandles)FALSE,//不繼承句柄:e.(LPPROCESS_INFORMATONIpProcessInformation)&pi);//返回的進(jìn)程信息程序運(yùn)行時(shí)屏幕顯示的信息是:ProcessID:3344,CloneProcessID:3344,CloneI'ngone…Bye-byePre本試驗(yàn)的程序中列出了用于進(jìn)程信息查詢(xún)的API函數(shù)GetProcessVersion(與GetVersionEx(的共同作用,可確定運(yùn)行進(jìn)程的操作系統(tǒng)的版本號(hào)。{/提取這個(gè)進(jìn)程的ID號(hào)DWORDdwdThis=::GetCurreWORDwMajorReq=(WORD)dwVerRWORDwMinorReq=(WORD)dwVerReq&0xfff);std::cout<<"Process<<",requiresOS"<<wMajorReq<<wMinorReq<<std//設(shè)置版本信息的數(shù)據(jù)構(gòu)造,以便保留操作系統(tǒng)的版本信息osvix.dwOSVersionInfoSize=sizeoGetVersionEx(reinterpret_cast<LPOSVERSIONINFOstd::cout<<"RunningonOS:"<<osvix.dwMajorVersion<<"."<<osvix.dwMinorVersion<<std::eif(osvix.dwPlatformld==VER_PLATFORM_W(:GetCurrentProcess(),/運(yùn)用這一進(jìn)程/匯報(bào)給顧客std::cout<<"TaskManagershouldnownowindicat"processishighpriority."<<std:eProcessID:5436,requiresProcessID:5436,requires目前PID信息:5436目前操作系統(tǒng)版本:5.1系統(tǒng)提醒信息:TaskManagershouldnownowindicatethisprocessishighpriority程序向讀者表明了怎樣獲得目前的PID和所需的進(jìn)程版本信息。為了運(yùn)行這一程序,系統(tǒng)處理了所有的版本不兼容問(wèn)題。接著,程序演示了怎樣使用GetVersionExOAPI函數(shù)來(lái)提取OSVERSIONINFOEX構(gòu)造。這一數(shù)據(jù)塊中包括了操作系統(tǒng)的版本信息。其中,“OS:5.1”表達(dá)目前運(yùn)行的操作系統(tǒng)是:最終一段程序運(yùn)用了操作系統(tǒng)的版本信息,以確認(rèn)運(yùn)行的是WindowsXP。代碼接著將目前進(jìn)程的優(yōu)先級(jí)提高到比正常級(jí)別高。單擊Crl+Alt+Del鍵,進(jìn)入“Windows任務(wù)管理器”,在“應(yīng)用程序”選項(xiàng)卡中右鍵單擊本任務(wù),在快捷菜單中選擇“轉(zhuǎn)到進(jìn)程”命令。在“Windows任務(wù)管理器”的“進(jìn)程”選項(xiàng)卡中,與本任務(wù)對(duì)應(yīng)的進(jìn)程映像名稱(chēng)是(為何?):右鍵單擊該進(jìn)程名,在快捷菜單中選擇“設(shè)置優(yōu)先級(jí)”命令,可以調(diào)整該進(jìn)程的優(yōu)先級(jí),如設(shè)置為“高”后重新運(yùn)行程序,屏幕顯示有變化嗎?沒(méi)有指令其父進(jìn)程來(lái)“殺掉”自己的子進(jìn)程(//格式化用于子進(jìn)程的命令行,指明它是一種EXE文獻(xiàn)和子進(jìn)程::sprintf(szCmdLine,//子進(jìn)程的啟動(dòng)信息構(gòu)造::ZeroMemory(reinterpret_cast<void*si.cb=sizeof(si);//應(yīng)當(dāng)是此構(gòu)造的大小//返回的用于子進(jìn)程的進(jìn)程信息//用同樣的可執(zhí)行文獻(xiàn)名和命令行創(chuàng)立進(jìn)程,并指明它是一種子進(jìn)程BOOLbCreateOK=::CreateProcess(NULL,NULL,NULL,NULL,//釋放指向子進(jìn)程的引用{{/創(chuàng)立“自殺”互斥程序體//產(chǎn)生的應(yīng)用程序名稱(chēng)(本EXE文獻(xiàn))/告訴我們這是一種子進(jìn)程的標(biāo)志//用于進(jìn)程的缺省的安全性/用于線(xiàn)程的缺省安全性/不繼承句柄//創(chuàng)立新窗口,使輸出更直觀//新環(huán)境//目前目錄/啟動(dòng)信息構(gòu)造/1返回的進(jìn)程信息HANDLEhMutexSuicide=::CreatNULL,{/缺省的安全性//最初擁有的/為其命名std::cout<<"Creatingthechildproc//指令子進(jìn)程“殺”掉自身std::cout<<"Tellingthechildprocesstoquit."<<std::endl;//消除句柄}{/打開(kāi)“自殺”互斥體HANDLEhMutexSuicide=::OpeSYNCHRONIZE,/打開(kāi)用于同步FALSE,/不需要向下傳遞g_szMutexName);//名稱(chēng){/匯報(bào)正在等待指令std::cout<<"Childwaitingforsuicideinst::WaitForSingleObject(hMutex//準(zhǔn)備好終正,清除句柄std::cout<<"Childquiting."<<std::end;{//決定其行為是父進(jìn)程還是子進(jìn)程if(argc>1&&::strcmp(argv[l],"ch{{1程序闡明了一種進(jìn)程從“生”到“死”的整個(gè)畢生。第一次執(zhí)行時(shí),它創(chuàng)立一種子進(jìn)程,其行為如同“父親”。在創(chuàng)立子進(jìn)程之前,先創(chuàng)立一種互斥的內(nèi)查對(duì)象,其行為對(duì)于子進(jìn)程來(lái)說(shuō),如同一種“自殺彈”。當(dāng)創(chuàng)立子進(jìn)程時(shí),就打開(kāi)了互斥體并在其他線(xiàn)程中進(jìn)行別的處理工作,同步等待著父進(jìn)程使用ReleaseMutex)API發(fā)出“死亡”信號(hào)。然后用SleepOAPI調(diào)用來(lái)模擬父進(jìn)程處理其他工作,等完畢時(shí),指令子進(jìn)程終止。當(dāng)調(diào)用ExitProcessO時(shí)要小心,進(jìn)程中的所有線(xiàn)程都被立即告知停止。在設(shè)計(jì)應(yīng)用程序時(shí),必須讓主線(xiàn)程在正常的C++運(yùn)行期關(guān)閉(這是由編譯器提供的缺省行為)之后來(lái)調(diào)用這一函數(shù)。當(dāng)它轉(zhuǎn)向受信狀態(tài)時(shí),一般可創(chuàng)立一種每個(gè)活動(dòng)線(xiàn)程都可等待和停止的終止事件。在正常的終止操作中,進(jìn)程的每個(gè)工作線(xiàn)程都要終止,由主線(xiàn)程調(diào)用ExitProcesso。接著,管理層對(duì)進(jìn)程增長(zhǎng)的所有對(duì)象釋放引用,并將用GetExitCodeProcess(建立的退出代碼從STILL_ACTIVE變化為在ExitProcess(調(diào)用中返回的值。最終,主線(xiàn)程對(duì)象也如同進(jìn)程對(duì)象同樣轉(zhuǎn)變?yōu)槭苄艩顟B(tài)。等到所有打開(kāi)的句柄都關(guān)閉之后,管理層的對(duì)象管理器才銷(xiāo)毀進(jìn)程對(duì)象自身。還沒(méi)有一種函數(shù)可獲得終止后的進(jìn)程對(duì)象為其參數(shù),從而使其“復(fù)活”。當(dāng)進(jìn)程對(duì)象引用一種終止了的對(duì)象時(shí),有好幾種API函數(shù)仍然是有用的。進(jìn)程可使用退出代碼將終止方式告知給調(diào)用GetExitCodeProcess0的其他進(jìn)程。同步,GetProcessTimesOAPIGetProcessTimesOAPI函數(shù)可向主調(diào)者顯示進(jìn)程的終止時(shí)間。CreatingthechildproTellingthechildprocess請(qǐng)總結(jié)一下本次試驗(yàn)的收獲、教訓(xùn)和感受,結(jié)合書(shū)本內(nèi)容談一下你對(duì)進(jìn)程的理解。試驗(yàn)二并發(fā)與調(diào)度在本試驗(yàn)中,通過(guò)對(duì)事件和互斥體對(duì)象的理解,來(lái)加深對(duì)WindowsXP線(xiàn)程同步的理解。通過(guò)度析試驗(yàn)程序,理解管理事件對(duì)象的API。理解在進(jìn)程中怎樣使用事件對(duì)象,在進(jìn)程中怎樣使用互斥體對(duì)象,線(xiàn)程怎樣通過(guò)文獻(xiàn)映射對(duì)象發(fā)送數(shù)據(jù)。二、試驗(yàn)環(huán)境硬件環(huán)境:計(jì)算機(jī)一臺(tái),局域網(wǎng)環(huán)境;軟件環(huán)境:WindowsXPProfessional,VisualC++6.0專(zhuān)業(yè)版或企業(yè)版。第一部分:互斥體對(duì)象本程序中顯示的類(lèi)CCountUpDown使用了一種互斥體來(lái)保證對(duì)兩個(gè)線(xiàn)程間單一數(shù)值的訪問(wèn)。每個(gè)線(xiàn)程都企圖獲得控制權(quán)來(lái)變化該數(shù)值,然后將該數(shù)值寫(xiě)入輸出流中。創(chuàng)立者實(shí)際上創(chuàng)立的是互斥體對(duì)象,計(jì)數(shù)措施執(zhí)行等待并釋放,為的是共同使用互斥體所需的資源(因而也就是共享資源)。1、運(yùn)用互斥體保護(hù)共享資源//mutex項(xiàng)目{{m_hMutexValue=::CreateMNULL,//缺省的安全性TRUE,m_hThreadlnc=::CreateThNULL,//缺省的安全性IncThreadProc,//類(lèi)線(xiàn)程進(jìn)程reinterpret_cast<LPVOID>(this),//線(xiàn)程參數(shù)0,/無(wú)特殊的標(biāo)志NULL);/忽視返回的idm_hThreadDec=::CreateThNULL,//缺省的安全性0,/缺省堆棧reinterpret_cast<LPVOID>(this),/線(xiàn)程參數(shù)0,NULL);//忽視返回的id}{}{{/等待兩者完畢(次序并不重要)::WaitForSingleObject(m_h:WaitForSingleObject(m_hTvirtualvoidDoCount(/循環(huán),直到所有的訪問(wèn)都結(jié)束為止{:WaitForSingleObject(m_hMu/變化并顯示該值std:cout<<"thread:"<<::GetCur<<"access:"<<m_nAccess<<st_/釋放對(duì)數(shù)值的訪問(wèn)}reinterpret_cast<CCountUpDown*>(lpPa}{reinterpret_cast<CCountUpDown*>(lpPaud.WaitForCompletio分析程序的運(yùn)行成果,可以看到線(xiàn)程(加和減線(xiàn)程)的交替執(zhí)行(由于SleepOAPI容許Windows切換線(xiàn)程)。在每次運(yùn)行之后,數(shù)值應(yīng)當(dāng)返回初始值(0),由于在每次運(yùn)行之后寫(xiě)入線(xiàn)程在等待隊(duì)列中變成最終一種,內(nèi)核保證它在其他線(xiàn)程工作時(shí)不會(huì)再運(yùn)行。1)請(qǐng)描述運(yùn)行成果(假如運(yùn)行不成功,則也許的原因是什么?):兩個(gè)線(xiàn)程交替運(yùn)行,不停變化value兩個(gè)線(xiàn)程交替運(yùn)行,不停變化value的值。兩個(gè)線(xiàn)程互斥訪問(wèn)Value的值hread:3820value:laccethread:5588value:Saccethread:3828value:1accethread:5588value:Baccethread:382ualue:1accethread:550lvalue:Saccethread:3028value:1accethread:558value:Raccthread:5588value:Saccethread:3828value:1accechread:5588value:Bathread:3828value:laccethread:55Bavalue:Baccetheread:3828value:1accethread:550lvalue:faccthread:3829value:laccthread:5508value:Bacthread:5508value:laccthread:5508value:Bathread:3828value:1acthread:550avalue:Baccthread:382lvalue:1acc線(xiàn)程1(5296)先運(yùn)行,將value值增1,變?yōu)?。然后,線(xiàn)程2(6016)運(yùn)行,將value值減1,變?yōu)?.獻(xiàn)、文獻(xiàn)映射、郵件位和命名管道等,其中最常用的是文獻(xiàn)和文獻(xiàn)映射。此類(lèi)對(duì)象容許一種線(xiàn)程很輕易地向同一進(jìn)程或其他進(jìn)程中的另一線(xiàn)程發(fā)送信息。下邊程序代碼展示了線(xiàn)程怎樣通過(guò)文獻(xiàn)對(duì)象在永久存儲(chǔ)介質(zhì)上互相發(fā)送數(shù)據(jù)。程序只是激活并啟動(dòng)了一種線(xiàn)程接著一種線(xiàn)程的創(chuàng)立線(xiàn)程。每個(gè)線(xiàn)程從指定的文獻(xiàn)中讀取數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行修改,其修改增量是以創(chuàng)立時(shí)發(fā)送給它的數(shù)量進(jìn)行的,然后將新數(shù)值寫(xiě)回文獻(xiàn)。//要使用的文獻(xiàn)名staticLPCTSTRg_sx="w//在數(shù)據(jù)文獻(xiàn)中讀取目前數(shù)據(jù)的簡(jiǎn)樸線(xiàn)程時(shí)將傳遞來(lái)的該數(shù)據(jù)增長(zhǎng),并寫(xiě)回?cái)?shù)據(jù)文獻(xiàn)中staticDWORDWINAPIThreadProc(LPVOIDlpParam){//將參數(shù)翻譯為長(zhǎng)整數(shù)LONGnAdd=reinterpret_cast<LONG>(p//建立完全的指定文獻(xiàn)名(包括途徑信息)::GetTempPath(MAX_PATH,szFllName);//獲得途徑//打開(kāi)文獻(xiàn)對(duì)象HANDLEhFile=::CreatszFulIName,//文獻(xiàn)的完全名稱(chēng)GENERIC-READ|GENERIC_WRITE//具有所有的訪問(wèn)權(quán)/容許其他線(xiàn)程讀取NULL./一般文獻(xiàn)NULL);(/讀取目前數(shù)據(jù)reinterpet_cast<LPVOID>(&nVa//缺省的安全性//創(chuàng)立或打開(kāi)文獻(xiàn)//無(wú)模板文獻(xiàn)//要讀取的文獻(xiàn)//緩沖區(qū)NULL);//緩沖區(qū)容量//無(wú)重疊I/Ostd::cout<<"read:"<<nVal/增長(zhǎng)數(shù)值/寫(xiě)回永久存儲(chǔ)介質(zhì)reinterpret_cast<LPCVOID>(&nVaNULL);if(dwXfer==sizeof(n{std::cout<<"write:"<<nVal/要寫(xiě)入的文獻(xiàn)/寫(xiě)入的字節(jié)數(shù)/無(wú)重疊I/O/創(chuàng)立100個(gè)線(xiàn)程從文獻(xiàn)中進(jìn)行讀寫(xiě)for(intnTotal=100;nTotal{/啟動(dòng)線(xiàn)程HANDLEhThread=::CreateNULL,reinterpret_cast<LPVOID>NULL);::WaitForSingleObje/缺省的堆棧/無(wú)特殊的創(chuàng)立標(biāo)志/忽視線(xiàn)程id閱讀和分析程序,請(qǐng)回答問(wèn)題:1)程序中啟動(dòng)了多少個(gè)單獨(dú)的讀寫(xiě)線(xiàn)程?2)使用了哪個(gè)系統(tǒng)API函數(shù)來(lái)創(chuàng)立線(xiàn)程例程?3)文獻(xiàn)的讀和寫(xiě)操作分別使用了哪個(gè)API函數(shù)?每次運(yùn)行進(jìn)程時(shí),都可看到程序中的每個(gè)線(xiàn)程從前面的線(xiàn)程中讀取數(shù)據(jù)并將數(shù)據(jù)增長(zhǎng),文獻(xiàn)中的數(shù)值持續(xù)增長(zhǎng)。這個(gè)示例是很簡(jiǎn)樸的通訊機(jī)制??蓪⑦@一示例用作編寫(xiě)自己的文獻(xiàn)讀/寫(xiě)代碼的模板。請(qǐng)注意程序中寫(xiě)入之前文獻(xiàn)指針的重置。重置文獻(xiàn)指針是必要的,由于該指針在讀取結(jié)束時(shí)將處在前四個(gè)字節(jié)之后,同一指針還要用于向文獻(xiàn)寫(xiě)入數(shù)據(jù)。假如函數(shù)向該處寫(xiě)入新數(shù)值,則下次進(jìn)程運(yùn)行時(shí),只能讀到本來(lái)的數(shù)值。那么:4)在程序中,重置文獻(xiàn)指針使用了哪一種函數(shù)?5)從輸出成果,對(duì)照分析程序,可以看出程序運(yùn)行的流程嗎?請(qǐng)簡(jiǎn)樸描述:首先創(chuàng)立一種線(xiàn)程,讀nValue的值,然后nValue值加一后,將nValue值重新寫(xiě)入文獻(xiàn)。反復(fù)上述過(guò)程1002、演示使用映射文獻(xiàn)的內(nèi)存互換數(shù)據(jù)的線(xiàn)程/仲裁訪問(wèn)的互斥體(HANDLEhMapping=reintarpret_cast<HANDLE>(I/等待對(duì)文獻(xiàn)的訪問(wèn):WaitForSingleObject(g_hMutexMLPVOIDpFile=:MapViewOfFile(0.//在文獻(xiàn)的開(kāi)頭處(高32位開(kāi)始{LONG*pnData=reinterpret_cast<LON/顯示新數(shù)值std::cout<<“thread”<<::GetCu<<"value:"<<(*pnData)<<std釋放文獻(xiàn)視圖(NULL,NULL);(LPVOIDpData=::MapView,//獲得讀寫(xiě)權(quán)數(shù)據(jù)文獻(xiàn)//最大容量(高32位)HANDLEhMapping=::MakeSharedFileO);{0,/缺省堆棧{std::cout<<“allthreadscreated,waiting.”<<std:end;/關(guān)閉對(duì)象閱讀和分析程序,請(qǐng)回答:1)程序中用來(lái)創(chuàng)立一種文獻(xiàn)映射對(duì)象的系統(tǒng)API函數(shù)是哪個(gè)?2)在文獻(xiàn)映射上創(chuàng)立和關(guān)閉文獻(xiàn)視圖分別使用了哪一種系統(tǒng)函數(shù)?3)運(yùn)行時(shí),程序首先通過(guò)(MakeSharedFileO;)函數(shù)創(chuàng)立一種小型的文獻(xiàn)映射對(duì)象(hMapping),接著,使用系統(tǒng)API函數(shù)(CreateMutex();)再創(chuàng)立一種保護(hù)其應(yīng)用的互斥體(g_hMutexMapping)。然后,應(yīng)用程序創(chuàng)立100個(gè)線(xiàn)程,每個(gè)都容許進(jìn)行同樣的進(jìn)程,即:通過(guò)互斥體獲得訪問(wèn)權(quán),這個(gè)操作是由語(yǔ)句:_WaitForSingleObject(g_hMutexMapping,INFINITE);實(shí)現(xiàn)的。再通過(guò)函數(shù)(MapVewOfFile(;)操作將視圖映射到文獻(xiàn),將高32位看作有符號(hào)整數(shù),將該數(shù)值增長(zhǎng)(即命令:++(pnData);),再將新數(shù)值顯示在控制臺(tái)上。每個(gè)線(xiàn)程清除文獻(xiàn)的視圖并在退出之前釋放互斥體的語(yǔ)句是ReleaseMutex(g_hMutexMapping);。當(dāng)線(xiàn)程完畢時(shí),應(yīng)用程序關(guān)閉并退出。4)將程序中的語(yǔ)句::Sleep(500);刪除(例如在語(yǔ)句前面加上“/”)后,重新編譯運(yùn)行,結(jié)變化嗎?為何?有變化。100個(gè)線(xiàn)程一閃而過(guò),不能看清成果。由于Sleep(500)是為了放慢速度,以便觀測(cè)。請(qǐng)總結(jié)一下本次試驗(yàn)的收獲、教訓(xùn)和感受,結(jié)合書(shū)本內(nèi)容談一下你對(duì)進(jìn)程間控制的理解。通過(guò)這次試驗(yàn),我對(duì)操作系統(tǒng)中的事件和互斥體對(duì)象,以及線(xiàn)程同步的概念有了更清晰的理解。當(dāng)多種進(jìn)程并發(fā)執(zhí)行時(shí),若我們不指定進(jìn)程之間并發(fā)的次序,則他們可以任意并發(fā),多種進(jìn)程訪問(wèn)同一種互斥資源時(shí),會(huì)出現(xiàn)錯(cuò)誤,或者計(jì)算成果不唯一,這時(shí)我們必須通過(guò)某種手段來(lái)同步進(jìn)程間并發(fā)的次序,這便是進(jìn)程間的同步問(wèn)題。并且,并發(fā)執(zhí)行的進(jìn)程或線(xiàn)程間,有時(shí)為了需要,會(huì)互相之間進(jìn)行數(shù)據(jù)的互換,即進(jìn)程間通信,Windows中,可以通過(guò)文獻(xiàn)對(duì)象在線(xiàn)程間發(fā)送數(shù)據(jù)。還可以使用映射文獻(xiàn)的內(nèi)存互換數(shù)據(jù)。試驗(yàn)三存儲(chǔ)管理一、試驗(yàn)?zāi)康耐ㄟ^(guò)試驗(yàn)理解WindowsXP內(nèi)存的使用,學(xué)習(xí)怎樣在應(yīng)用程序中管理內(nèi)存,體會(huì)Windows應(yīng)用程序內(nèi)存的簡(jiǎn)樸性和自我防護(hù)能力。學(xué)習(xí)檢查虛擬內(nèi)存空間或?qū)ζ溥M(jìn)行操作;理解WindowsXP的內(nèi)存構(gòu)造和虛擬內(nèi)存的管理,進(jìn)而理解進(jìn)程堆和Windows為使用內(nèi)存而提供的某些擴(kuò)展功能。本試驗(yàn)中還以一種Linux實(shí)例程序闡明應(yīng)用程序怎樣通過(guò)系統(tǒng)調(diào)用來(lái)管理自己用的空閑內(nèi)存,目的在于加深同學(xué)對(duì)操作系統(tǒng)存儲(chǔ)管理內(nèi)容的理解。二、試驗(yàn)環(huán)境硬件環(huán)境:計(jì)算機(jī)一臺(tái),局域網(wǎng)環(huán)境;軟件環(huán)境:WindowsXPProfessional,LinuxRedhat9.0或Ubumtu,VisualC++6.0專(zhuān)業(yè)版或企業(yè)版。三、試驗(yàn)內(nèi)容和環(huán)節(jié)在WindowsXP環(huán)境下,4GB的虛擬地址空間被劃提成兩個(gè)部分:低端2GB提供應(yīng)進(jìn)程使用,高端2GB提供應(yīng)系統(tǒng)使用。這意味著顧客的應(yīng)用程序代碼,包括DLL以及進(jìn)程使用的多種數(shù)據(jù)等,都裝在顧客進(jìn)程地址空間內(nèi)(低端2GB)。//工程vmwalker#pragmacomment(lib,{return((dwTarget&dwMask)==dwMa#defineSHOWMASK(dwTarget,if(TestSet(dwTarget,PAGEvoidShowProtetion(DWORDdwTa{{/首先,獲得系統(tǒng)信息{//緩沖區(qū)/大小確實(shí)認(rèn){LPCVOIDpEnd=(PBYTE)pBlock+mbi.Reg:StrFormatByteSize(mbi.RegionSi<<std:hex<<std::setw(8)<<(DWORD)pB<<std:hex<<std::setw(8)<<(DWO<<(::strlen(szSize)==7?"(":"(")<<szSi/顯示塊的狀態(tài)if(mbi.Protect==0&&mbi.Sate!=1/除去途徑并顯示)/完全指定的文獻(xiàn)名稱(chēng)一}C:\PrograxFilea\lierosoC:\PrograxFilea\lieroso77fcf090-77fd1880(8.00K77fd1800-7c880000(72.1MB>FreeHOAZc884088-7c887888<12.8KB>Comnitted.READVRITE.2c887808-7c889889(8.00KR>Comnittad.VRITECOPy.InageZc889000-7c91d?e?(592KB)Co2c?1de?0-7c?20008(127c9288e-7c?218ea(4.38KB)Comsitted,READONLY.Inage.Hodule:ntd11.d117c9218N?-7c99c888<588KB>Conmitt2c996888-7c9a1889(12.8KB>Connitted.REA209a1000-7c9.3880(8.00KB>Comitted.WRITECOPy.Inage2e943008-7e?b6808(76.0KB>Connitted,HEADONLY,Inage7c9b?0N?-76F0899(45.2HB716F88B?-7F6F788a<28.8KB>Committed.EXECUTE16f?800-7F7F00en(996KB)Renerved.READONLY.HappZff0000-7fd3009(204KB>ConmittedREADONLY,HappedZFFd3888-7TFdc888(36.8KZKfdc098-7Efdd?e?(4.88KB)Comnitted.READVRITE,2ffdd?80-7ffdf889(8.00KB>Freo.NOACZffdf?00-7Ffo?009(4.00KB>Comnftted.READVRITE.PelvateZffeB?08-7FF=1080(4.00KB>Connitted.HEADONLY.rfe188-7Tffuen(68.0KB>Reserved,NOACCENs,Private內(nèi)存的特性。虛擬內(nèi)存中的塊由VirtualQueryExOAPI定義成持續(xù)快或具有相似狀態(tài)(自由區(qū)、已調(diào)配區(qū)等等)的內(nèi)存,并分派以一組統(tǒng)一的保護(hù)標(biāo)志(只讀、可執(zhí)行等等)。分析運(yùn)行成果按committed、reserved、free等三種虛擬地址空間分別記錄試驗(yàn)數(shù)據(jù)。其中“描述”是指對(duì)該組數(shù)據(jù)的簡(jiǎn)樸描述,例如,對(duì)下列一組數(shù)據(jù):00010000-0001<8.00KB>Committed,READWRI可描述為:具有READWRITE權(quán)限的已調(diào)配私有內(nèi)存區(qū)。將系統(tǒng)目前的自由區(qū)(free)虛擬地址空間填入表中。大小空間類(lèi)型將系統(tǒng)目前的已調(diào)配區(qū)(committed)大小空間類(lèi)型將系統(tǒng)目前的保留區(qū)(reserved)虛擬地址空間填入表5-8大小空間類(lèi)型2.虛擬內(nèi)存操作使用。{BYTE*arFill=(BYTE*)for(DWORDdwFill=0;dwFill<dwSiz{std:cout<<"Memoryzeroadl"<<std:endl;std:cout<<"Couldnotzerom}/使用內(nèi)存分派來(lái)獲得1GB塊{LPVOIDpBlock=:malloc(c_dwGiNULL,c_dwGigabyte,/規(guī)定IGBMEM_COMMIT,/調(diào)配物理存儲(chǔ)PAGE_READWRITE);/對(duì)此的讀寫(xiě)1 LPVOIDpBlock=::VrtuaNULL,/不指定起始地址c_dwGigabyte,//規(guī)定1GBMEM_RESERVE,/不調(diào)配物理存儲(chǔ)PAGE_READWRITE);/對(duì)此的讀寫(xiě)LPVOIDpBlock=:VrtuaNULL,MEM_RESERVE,/不調(diào)配物理存儲(chǔ)PAGE_READWRITE);/對(duì)此的讀寫(xiě)操作C:VProerFilcs\WicrosoftYisuslStudio\yProjceta\IIWebug\11.exoemoryzeroed對(duì)照運(yùn)行成果,分析程序。為了給數(shù)據(jù)庫(kù)保留1GB的段地址空間,程序給出了內(nèi)存分派的四種措施。即程序中闡明為使用內(nèi)存分派來(lái)獲得1GB塊的程序段,該段程序試圖運(yùn)用原則C中的malloc0函數(shù),從已經(jīng)已調(diào)配的小內(nèi)存區(qū)獲得內(nèi)存。從運(yùn)行成果看,這種技術(shù)成功了嗎?沒(méi)有成功·第二種技術(shù)即程序中闡明為使用虛擬分派來(lái)獲取物理1GB塊的程序段,該段程序試圖通過(guò)VirtualAllocO,然后運(yùn)用物理備用內(nèi)存將整個(gè)塊分派到虛擬內(nèi)存空間的任何位置。這種技術(shù)只對(duì)擁有1GB以上的RAM且均有換頁(yè)文獻(xiàn)的計(jì)算機(jī)可行。從運(yùn)行成果看,這種技術(shù)成功了嗎?沒(méi)有成功·第三種技術(shù)即程序中闡明為使用虛擬分派來(lái)獲取虛擬1GB塊的程序段,該段程序運(yùn)用VirtualAllocO,假如函數(shù)成功,則獲得大塊內(nèi)存,但不將任何物理內(nèi)存調(diào)配到此塊中。從運(yùn)行成果看,這種技術(shù)成功了嗎?沒(méi)有成功·第四種技術(shù)即程序中闡明為使用虛擬分派調(diào)配來(lái)獲取虛擬1GB塊,再為其調(diào)配1MB物理存儲(chǔ)的程序段,該段程序保留IGB的內(nèi)存區(qū),然后將物理內(nèi)存調(diào)配給其中的很小一部分(1MB)。這就是程序簡(jiǎn)介的處理一種假想的數(shù)據(jù)庫(kù)應(yīng)用程序的措施:保留整個(gè)塊,然后按規(guī)定在其一小部分內(nèi)進(jìn)行讀操作,讓系統(tǒng)將用過(guò)的區(qū)域換頁(yè)到磁盤(pán)中。運(yùn)用VirtualLock0API,Windows可用來(lái)在自己的進(jìn)程空間中控制虛擬內(nèi)存的行為。這個(gè)函數(shù)與其成對(duì)的VirtualUnlockO制止或容許一塊內(nèi)存從物理RAM中換頁(yè)和換頁(yè)到頁(yè)面文獻(xiàn)中。這樣就會(huì)告知系統(tǒng)有一段特定的內(nèi)存區(qū)規(guī)定對(duì)顧客作出強(qiáng)烈的響應(yīng),因此系統(tǒng)不應(yīng)將其移出RAM。當(dāng)然,假如要將整個(gè)虛擬內(nèi)存空間鎖定,系統(tǒng)就會(huì)停留于試圖將系統(tǒng)中工作內(nèi)存的每一小塊換頁(yè)到磁盤(pán)3.虛擬內(nèi)存的分派與釋放能對(duì)的使用系統(tǒng)函數(shù)GetMeoryStatus0和數(shù)據(jù)構(gòu)造MEMORY_STATUS理解系統(tǒng)內(nèi)存和虛擬存儲(chǔ)空間使用狀況,會(huì)使用VirsualAlloc()函數(shù)和VirsualFree()函數(shù)分派和釋放虛擬內(nèi)存空間。//GetMemoryStatus.cpp:Definestheentrypointforthe#include"GetMemorySt#endifint_tmain(intargc,TCHAR*argv).TCHAR{printf("NowAllocate32MVrsualMemoryaBaseAddr=:VirtualAlloc(NULL,1024*1024*32,MEM_RESERVEMEM_COMMIT,PAGE;//分派虛擬內(nèi)存if(BaseAddr==NULL)printf("VirsualAllocateFail.\n");str=(char*)malloc(1printf("NowRelease32MVirsif(:VirtualFree(BaseAddr,0,MEM_RELEASE)==0)/printf("ReleaseAllocateFail\n");free(str);}{printf("\tTotalPhysicalMemoryis%dMB\n",Memlnfoprintf("\tAvailablePhysicalMemoryis%dMB\n",Memlnfo.dprintf("\tTotalPage%dMB\n",Memlnfo.dwTotalPaprintf("\tAvailablePage%dMB\n",Memlnfo.dwAvailPageFile/(1024*1024));printf("\tTotalVirtualMemoryis%dMB\n",Memlnfo.dwprintf("\tAvailableVirsualmemoryis%dMB\n",Memlnfo.dwAvailVirtprintf("\tMemoryLoadis%d%%\n\n"}環(huán)節(jié)1:在VC6.0環(huán)境下選擇Wn32ConsoleApplication建立一種控制臺(tái)工程文獻(xiàn),選擇Anapplication環(huán)節(jié)2:編輯并編譯完畢后,單擊“Build”菜單中的“BuildGetMemoryStatus.exe”命令,建立GetMemoryStatus.exe可執(zhí)行文獻(xiàn)。操作能否正常進(jìn)行?假如不行,則也許的原因是什么?可以正常運(yùn)行環(huán)節(jié)3:在工具欄單擊“ExecuteProgram”按鈕,執(zhí)行GetMemoryStatus.cpp.exe程序。分析程序GetMemoryStatus.cpp的運(yùn)行成果1)請(qǐng)描述運(yùn)行成果(假如運(yùn)行不成功,則也許的原因是什么?):AvailablePhysicalHenoTotalUirtualHemoryHouRelease32MVirsualMemoryand2MPhysiTotalUirtualHemory2)根據(jù)運(yùn)行輸出成果,若要變化分派和回收的虛擬內(nèi)存和物理內(nèi)存的大小,要變化程序代碼的語(yǔ)句,分別為BaseAddr=:VirtualAlloc(NULL,1024*1024*32,MEM_RESERVEMEM_COMMIWRITE);//分派虛擬內(nèi)存if(BaseAddr==NULL)printf("VirsualAllocateFail.\n");printf("NowRelease32MVif(::VirtualFree(BaseAddr,0,MEM_RELEASE)==0)printf("ReleaseAllocateFail.\n");free(str);3)根據(jù)運(yùn)行輸出成果,對(duì)照分析4-2程序,可以看出程序運(yùn)行的流程嗎?請(qǐng)簡(jiǎn)樸描述:第二部分Linux顧客程序的內(nèi)存管理現(xiàn)代操作系統(tǒng)容許多種程序同步運(yùn)行,因此,內(nèi)存中需要同步寄存這些程序。操作系統(tǒng)采用的存儲(chǔ)管理方案重要有分區(qū)式存儲(chǔ)管理、分頁(yè)式存儲(chǔ)管理、分段式存儲(chǔ)管理和段頁(yè)式存儲(chǔ)管理等。本試驗(yàn)以一種Linux實(shí)例程序闡明應(yīng)用程序怎樣通過(guò)系統(tǒng)調(diào)用來(lái)管理自己用的空閑內(nèi)存,目的在于理解顧客程序分派內(nèi)存以及回收所用內(nèi)存的程序過(guò)程,加深對(duì)操作系統(tǒng)存儲(chǔ)管理機(jī)制的理解。本試驗(yàn)實(shí)例由my-malloc.h、my-malloc.c和test.c三個(gè)文獻(xiàn)構(gòu)成。為閱讀程序以便,對(duì)其中的重要函數(shù)作了闡明,同學(xué)們可結(jié)合程序注釋理解該程序。本試驗(yàn)程序重要定義了一種描述自由存儲(chǔ)塊的構(gòu)造,每一種自由塊都包括塊的大小、指向下一塊的指針以及塊區(qū)自身,所有的自由塊以地址增長(zhǎng)次序排列,并用鏈表鏈接起來(lái)。這一鏈表是本程序維護(hù)的一種空閑區(qū)域,對(duì)于操作系統(tǒng)的目前記錄來(lái)說(shuō)是已分出去的區(qū)域。由于本程序是運(yùn)行在顧客態(tài)的程序。環(huán)節(jié)1:單擊紅帽子,在“GNOME協(xié)助”菜單中單擊“附件”-“文本編輯器”命令,在文本編輯中鍵入清單5-4程序并保留為my-malloc.h。清單5-4my-malloc.h文獻(xiàn)/*foralignmenttolongboundar/*nextblockifonFreelist*//*sizeofthisblock*//*forcealignmentofblocks*/#defineNALLOC10/*minimum#unitstorequestaticHeader*morecore(unsvoid*Malloc(unsignedstaticHeaderbase;/#empylistaticHeader*free_list=NULL;/*startoffr/*Malloc:general-purposestorageallocator*/void*Malloc(unsignedintnbytes){nunits=(nbytes+sizeof(Header)-1)/sizeof(Headif((prev=free_list)==NULL){/*nofreelistyet*/base.s.next=free_list=prev=&b}for(p=prev->s.next;;prev=p,pif(p->s.size>=nunits){/*bigenough*/if(p>s.size==nunits)prev->s.next=p>s.neif((p=morecore(nunits}staticHeader*morecore(unprintf("sbrk:%X-%X\n",cp,cp+nu*sizof(Header));if(cp==(char*)-1)}bp=(Header*)ap-1;/*pointtoblockheader*/for(p=free_list;!(bp>p&&bp<p>s.nextif(p>=p->s.next&&(bp>plbp<pbreak;if(bp+bp->s.size==p->s.next){/*jointouppernbr*/bp->s.size+=p>s.next->s.sbp->s.next=p->s.next->s.neif(p+p>s.size==bp){}}printf("base:%X,base.next:%X,base.next,next:%X,free:%x\n",&base.s.next,base.s.next->s.next,free_lifor(p=&base;p->s.next!=free_lprintf("block%d,size=%d",I,p->s.si}p[i]=(char*)Malloc(printf(“malloc%d,%X\n”,i,p[i}printf("free%d\n",i}環(huán)節(jié)4:編譯。成功解。試驗(yàn)四輸入輸出管理程序中捕捉鼠標(biāo),從而加深理解WindowsXP輸入/輸出處理技術(shù)。在本試驗(yàn)中,著重理解磁盤(pán)的物理組織,以及怎樣通過(guò)顧客態(tài)的程序直接調(diào)用磁盤(pán)VOAPI函數(shù)(DeviceloControl)根據(jù)輸入的驅(qū)動(dòng)器號(hào)讀取驅(qū)動(dòng)器中磁盤(pán)的基本信息。硬件環(huán)境:計(jì)算機(jī)一臺(tái),局域網(wǎng)環(huán)境:軟件環(huán)境:WindowsXPProfessional,LinuxRedhat9.0或Ubumtu,VisualC++6.0專(zhuān)業(yè)版或企業(yè)版。三、試驗(yàn)內(nèi)容和環(huán)節(jié)一臺(tái)計(jì)算機(jī)擁有大量的輸入設(shè)備,而鼠標(biāo)和鍵盤(pán)是其中最常用的輸入設(shè)備盤(pán)處理就像使用VisualC++的ClassWizard在MFC程序中添加一兩個(gè)消息響應(yīng)函數(shù)同樣簡(jiǎn)樸。在本試驗(yàn)中,我們通過(guò)一種應(yīng)用程序示例來(lái)討論鼠標(biāo)編程技巧,理解怎樣響應(yīng)鼠標(biāo)程序中捕捉鼠標(biāo)。該程序的實(shí)例代碼在試驗(yàn)指導(dǎo)書(shū)外另附。環(huán)節(jié)2:在“開(kāi)始”菜單中單擊“程序”“MicrosoftVisualStudio6.0”-“MicrosoftVisualC++6.0”環(huán)節(jié)3:在File菜單單擊OpenWorkspace.…命令,在“OpenWorkspace”對(duì)話(huà)框中找到試驗(yàn)代碼文獻(xiàn)夾并打開(kāi)試驗(yàn)文獻(xiàn)Mouse.dsw。環(huán)節(jié)4:單擊Build菜單中的BuildMouse.exe命令,系統(tǒng)對(duì)程序進(jìn)行編譯并建立可執(zhí)行文獻(xiàn)。操作能否正常進(jìn)行?假如不行,則也許的原因是什么?可以正常運(yùn)行環(huán)節(jié)5:在工具欄單擊“ExecuteProgram”按鈕,執(zhí)行Mouse.exe程序,響應(yīng)鼠標(biāo)消息。Mouse示例程序演示了怎樣截取和響應(yīng)鼠標(biāo)消息。運(yùn)行這個(gè)程序,就會(huì)顯示一種主窗口。最初窗口是在鼠標(biāo)通過(guò)窗口時(shí)單擊鼠標(biāo)左鍵,窗口中不僅出現(xiàn)WM_LBUTTONDOWN和WM_LBUTTONUP消息,并且顯示事件發(fā)生的坐標(biāo)。單擊鼠標(biāo)右鍵,再次出現(xiàn)上述狀況。請(qǐng)記錄:Y:164:鼠標(biāo)移動(dòng)到指定位置:單擊鼠標(biāo)左鍵:釋放鼠標(biāo)左鍵:單擊鼠標(biāo)右鍵:釋放鼠標(biāo)右鍵Mouse應(yīng)用程序也舉例闡明了鼠標(biāo)捕捉的技巧。有些時(shí)候需要應(yīng)用程序接受鼠標(biāo)消息,甚至鼠標(biāo)不在應(yīng)用程序客戶(hù)區(qū)時(shí),也有這個(gè)規(guī)定。例如在一種畫(huà)圖程序中,顧客在窗口中畫(huà)線(xiàn)時(shí)一直接住鼠標(biāo)左鍵。假如一種顧客碰巧把鼠標(biāo)指針移到畫(huà)圖應(yīng)用程序的窗口之外,應(yīng)用程序必須繼續(xù)接受鼠標(biāo)消息。否則顧客在窗口之外釋放鼠標(biāo)按鈕,應(yīng)用程序?qū)o(wú)法懂得顧客與否仍舊在畫(huà)圖。為理解鼠標(biāo)捕捉的工作狀況,可把指針移動(dòng)到Mouse應(yīng)用程序的客戶(hù)區(qū),然后一直按住鼠標(biāo)右鍵,在屏幕上任意移動(dòng)鼠標(biāo)。雖然鼠標(biāo)移動(dòng)到窗口外,窗口繼續(xù)接受鼠標(biāo)消息。在不按住鼠標(biāo)右鍵移動(dòng)鼠標(biāo)時(shí),鼠標(biāo)指針離開(kāi)了應(yīng)用程序的客戶(hù)區(qū)的狀況下,應(yīng)用程序停止接受鼠標(biāo)消息。注意到,在按住鼠標(biāo)右鍵移動(dòng)到客戶(hù)區(qū)外面左側(cè)時(shí),WM_MOUSEMOVE的坐標(biāo)值目前為負(fù)的。這是由于何?超過(guò)客戶(hù)區(qū)域后為負(fù)值環(huán)節(jié)7:測(cè)試Mouse應(yīng)用程序由于在窗口的視圖類(lèi)CMouseView中定義了消息響應(yīng)函數(shù),Mouse應(yīng)用程序會(huì)響應(yīng)鼠標(biāo)消息。作為MFC編程的一條規(guī)則,CMouseVew使用消息映射把消息和消息響應(yīng)函數(shù)聯(lián)絡(luò)起來(lái)。下面的代碼顯示CMouseVew類(lèi)怎樣定義它的消息映射。每一種包括消息映射體的宏把鼠標(biāo)消息和合適的消息處理程序有關(guān)聯(lián)。例如,當(dāng)窗口接受WM_MOUSEMOVE消息時(shí),ON_WMMOUSEMOVE宏告知MFC調(diào)用OnMouseMove(O函數(shù)。同樣,當(dāng)窗口接受WM_LBUTTONDOWN消息時(shí),消息映射告知MFC調(diào)用OnLButtonDownO函數(shù)。出目前Mouse應(yīng)用程序窗口的文本由視圖類(lèi)消息響應(yīng)函數(shù)來(lái)顯示。例如,下列代碼顯示了OnMouseMove()函數(shù):(wsprintf(str,"X:%dY:%d",!在鼠標(biāo)指針移動(dòng)到應(yīng)用程序窗口時(shí),Mouse應(yīng)用程序接受這些消息流。作為函數(shù)的第二個(gè)參數(shù)傳送的CPoint對(duì)象包括了在事件發(fā)生時(shí)鼠標(biāo)指針?biāo)谖恢玫男畔ⅰnMouseMove從CPoint對(duì)象中建立一種顯示的字符串,并且在應(yīng)用程序的窗口中顯示這個(gè)字符串。OnLButtonDownO、OnLButtonUpO、OnLButtonDbIClkO和OnRButtonDbIClkO函數(shù)工作狀況相似,把CPoint對(duì)象轉(zhuǎn)變?yōu)樵趹?yīng)用程序窗口中顯示的顯示字符串。環(huán)節(jié)8:讀懂WindowsXP獲取鼠標(biāo)消息的函數(shù)以及對(duì)事件處理的代碼,在此基礎(chǔ)上修改原程序段,產(chǎn)生新的響應(yīng)事件:1)修改鼠標(biāo)左鍵單擊后的事件,使在單擊鼠標(biāo)后,在單擊的位置上出現(xiàn)“你好”字樣。2)修改鼠標(biāo)右鍵單擊釋放的事件,使在單擊鼠標(biāo)按下的位置出現(xiàn)“再”字,在釋放右鍵的位置上出現(xiàn)“見(jiàn)”字。操作與否成功?假如不行,則也許的原因是什么?可運(yùn)行成功見(jiàn)再環(huán)節(jié)9:單擊窗口右上角的“關(guān)閉”按鈕,結(jié)束第二部分磁盤(pán)I/0API函數(shù)應(yīng)用背景知識(shí)有關(guān)的API簡(jiǎn)介L(zhǎng)PVOIDlplnBuffer,DWORDnlnBufferSize,LPVOID1pOutBuffer,DWORDnOutBufferSiz.nInBufferSize:指定1pInBustructDISK_GEOMETRY(unsignedbytesPerSector;unsignedsectorsPerTrack;unsignedheads;unsignedcylindHANDLECreateFile(LPCTSDWORDdwShareMode,LPSECURITY_ATTRIBUTDWORDdwCreationDisposition,此參數(shù)可認(rèn)為下列值的任意一種組合值:.0:指定對(duì)象的查詢(xún)?cè)L問(wèn)權(quán)限,一種應(yīng)用程序可以不通過(guò)訪問(wèn)設(shè)備來(lái)查詢(xún)?cè)O(shè)備屬性。.dwCreationDisposition:指定對(duì)存在的文獻(xiàn)采用哪種措施,且當(dāng)文獻(xiàn)不存在時(shí)采用哪種措施,此函數(shù)必須是下列值中的一種:.CREAT_NEW:創(chuàng)立一種新文獻(xiàn),假如文獻(xiàn)存在,則函數(shù)調(diào)用失敗。.OPEN_EXISTING:打開(kāi)文獻(xiàn),假如文獻(xiàn)不.TRUNCATE_EXISTING:打開(kāi)文獻(xiàn),一旦文獻(xiàn)打開(kāi),就被刪截掉,從而使文.dwFlagsAndAttributes:指定文獻(xiàn)屬性和標(biāo)志,該參數(shù)可取諸多種組合,如下示三種:指定事件被設(shè)置為發(fā)信號(hào)狀態(tài)。.:引導(dǎo)系統(tǒng)打開(kāi)沒(méi)有瞬間緩沖或緩存的文獻(xiàn),當(dāng)與結(jié)合時(shí),標(biāo)志給出最大的準(zhǔn)時(shí)間次序的操作,由于I/0不依托內(nèi)存管理器的時(shí)間次序的操作,不過(guò),由于數(shù)據(jù)沒(méi)有在緩存中,某些I/0操作將長(zhǎng)某些。.:表明文獻(xiàn)從開(kāi)頭到結(jié)尾按次序被訪問(wèn)。使用它,系統(tǒng)可優(yōu)化文獻(xiàn)緩存。訪問(wèn)方式讀大文獻(xiàn)的應(yīng)用程序,指定此標(biāo)志可以增長(zhǎng)它的性能。返回值:假如函數(shù)調(diào)用成功,返回值為指向指定文獻(xiàn)的打開(kāi)句柄:假如函數(shù)調(diào)用失敗,返回值為試驗(yàn)?zāi)康谋驹囼?yàn)著重于理解磁盤(pán)的物理組織,以及怎樣通過(guò)顧客態(tài)的程序直接調(diào)用磁盤(pán)VOAPI函數(shù)(DeviceIoControl)根據(jù)輸入的驅(qū)動(dòng)器號(hào)讀取驅(qū)動(dòng)器中磁盤(pán)的基本信息,在WindowsXP環(huán)境進(jìn)行。structDisk//有關(guān)Dis{voidmain(void){disk=physicDisk(Driv}{I,//共享的權(quán)限{}Result=DeviceloControl(NULL{}程序的成果aa盤(pán)所在磁盤(pán)總共有2880個(gè)扇區(qū)f盤(pán)有:如輸入磁盤(pán)號(hào)為c,顯示的磁盤(pán)信息是整個(gè)硬盤(pán)信息,而不是c盤(pán)分區(qū)的信息。如輸入磁盤(pán)號(hào)為d,顯示的磁盤(pán)信息與如輸入磁盤(pán)號(hào)為c顯示的磁盤(pán)信息相似。用磁盤(pán)I/0API函數(shù)讀出的磁盤(pán)信息是從硬盤(pán)的主引導(dǎo)區(qū)得到。讓揚(yáng)聲器按指定的長(zhǎng)度和音頻發(fā)聲#defineDEFAULT_LEN/默認(rèn)不反復(fù)發(fā)聲/同樣以微秒為單位/發(fā)聲長(zhǎng)度,以微秒為單位反復(fù)的次數(shù)/打印協(xié)助信息并退出{printfcUsage:nt%s[-ffrequency][-Ilength][-rreps][-ddelay]\n",executable_}{(intfreq=atoi((++if((freq<=0)|(freq>fprintf(stderr,"Badparameter:frequ/發(fā)聲的時(shí)間長(zhǎng)度f(wàn)printf(stderr,"Badparameterlengthmustbe>=0'n");if((console_fd=open("/dev/console",0_WRON[fprintf(stderr,"Failedtoopenconsole.n");/真正開(kāi)始讓揚(yáng)聲器發(fā)聲(usleep(1000*parms.length);Ⅱ等ioctl(console_fd,KIOCSOUND,0);停止發(fā)聲usleep(1000*pams.delay);/等待…/反復(fù)播放)運(yùn)行成果(假如運(yùn)行不成功,則也許的原因是什么?):發(fā)出了一種MI音,發(fā)音時(shí)長(zhǎng)1秒,發(fā)了一次,隔了5秒發(fā)出的合適調(diào)整參數(shù)的值,看看聲音有何變化。把-1的參數(shù)翻了一倍,-r的參數(shù)翻了2倍,發(fā)出了一種mi音,發(fā)音時(shí)長(zhǎng)為2秒,發(fā)了4次,每隔5秒四、試驗(yàn)總結(jié)試驗(yàn)五文獻(xiàn)系統(tǒng)錄。三、試驗(yàn)內(nèi)容和環(huán)節(jié)1.文獻(xiàn)信息命令環(huán)節(jié)1:開(kāi)機(jī),登錄進(jìn)入GNOME。環(huán)節(jié)2:訪問(wèn)命令行。環(huán)節(jié)3:使用控制字符執(zhí)行特殊功能。Crl+D:表達(dá)文獻(xiàn)的末尾或者退出。Crl+D用于退出某些Linux工具程序(be、write等),退出一1)在shell提醒符下鍵入be,啟動(dòng)基本的計(jì)算器工具程序。2)把兩個(gè)數(shù)字相乘(鍵入:458*594,然后按回車(chē)鍵)。當(dāng)使用計(jì)算器的時(shí)候,你的提醒符是什么?Copyright1991-1994,1997,1998,,,FreeSoftwareFounda·一種擦除決定不執(zhí)行的命令行的快捷方式?!ぜ偃绲卿浀揭环N遠(yuǎn)程系統(tǒng),退格鍵不起作用。·它可以保證在登錄的時(shí)候,從一種“空”的顧客帳號(hào)和口令輸入開(kāi)始?!び捎谠诳诹钶斎氲臅r(shí)候看不見(jiàn)它們,當(dāng)懂得自己鍵入了錯(cuò)誤字符的時(shí)候,使用Crl+U擦除密碼,重新開(kāi)始輸入。假如輸入一種命令,如Is-R/,有時(shí)候,會(huì)在按下回車(chē)鍵之前想擦除命令行。輸入一種命令,在接下回車(chē)鍵執(zhí)行命令之前按下Crl+U。成果是什么?輸入的命令被消除了環(huán)節(jié)4:使用file命令確定文獻(xiàn)類(lèi)型。在Linux系統(tǒng)中可以找到許多類(lèi)型的文獻(xiàn)。文獻(xiàn)類(lèi)型可以通過(guò)使用file命令來(lái)確定。當(dāng)一種顧客試圖打開(kāi)或閱讀一種文獻(xiàn)的時(shí)候,這個(gè)信息很重要。確定文獻(xiàn)類(lèi)型可以協(xié)助一種顧客決定使用哪個(gè)程序或命令來(lái)打開(kāi)這個(gè)文獻(xiàn)。這個(gè)命令的輸出最常見(jiàn)的是如下幾種:文本文獻(xiàn)、可執(zhí)行文獻(xiàn)或數(shù)據(jù)文獻(xiàn)。1)文本文獻(xiàn):包括ASCII或英語(yǔ)文本、命令文本和可執(zhí)行的shell腳本。這種類(lèi)型的文獻(xiàn)可以使用cat或more命令讀取,可以使用vi或其他文本編輯器編輯。單擊紅帽子,在“GNOME協(xié)助”菜單中單擊“輔助設(shè)施”-“TextEditor”命
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)公司融資合同范本
- 艙口蓋系統(tǒng)行業(yè)深度研究報(bào)告
- 化肥長(zhǎng)期供貨合同范本
- 場(chǎng)地使用出租合同范本
- 事業(yè)單位聘用合同范本
- 共享叉車(chē)租賃合同范例
- 副食購(gòu)買(mǎi)合同范本
- 充電樁維修合同范本
- 勞務(wù)法合同范本
- 加盟合同范本
- 戰(zhàn)略管理與倫理
- 如何構(gòu)建高效課堂課件
- 虛擬化與云計(jì)算技術(shù)應(yīng)用實(shí)踐項(xiàng)目化教程 教案全套 第1-14周 虛擬化與云計(jì)算導(dǎo)論-騰訊云服務(wù)
- 甲基丙烯酸甲酯生產(chǎn)工藝畢業(yè)設(shè)計(jì)設(shè)備選型與布置模板
- 徐金桂行政法與行政訴訟法新講義
- 瀝青拌合設(shè)備結(jié)構(gòu)認(rèn)知
- 2023年北京高考政治真題試題及答案
- 復(fù)旦中華傳統(tǒng)體育課程講義05木蘭拳基本技術(shù)
- 北師大版五年級(jí)上冊(cè)數(shù)學(xué)教學(xué)課件第5課時(shí) 人民幣兌換
- 工程回訪記錄單
- 住房公積金投訴申請(qǐng)書(shū)
評(píng)論
0/150
提交評(píng)論