大三-下學期os實驗windows_第1頁
大三-下學期os實驗windows_第2頁
大三-下學期os實驗windows_第3頁
大三-下學期os實驗windows_第4頁
大三-下學期os實驗windows_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Win32系統(tǒng)進程控線程控制與同器管文件系

實驗二、三、實驗實驗實驗五、實驗1

進程地址空線線每個 創(chuàng)建一個主程主線程執(zhí)行“main”函 線線程可以創(chuàng)建其他線系統(tǒng)范圍地址空2支持多線程進程:創(chuàng)建一個應(yīng)用程序,將其必須完成的工作劃分為多個邏輯小塊,由線程來完成。相關(guān)的系統(tǒng)調(diào)用比3多線程應(yīng)在與用戶交互的同時執(zhí) 任Word 打印的同時我們?nèi)钥梢跃幊浞掷枚嗵幚碓谝粋€有n個處理器的系統(tǒng)中理論n個多線程增加了系統(tǒng)的復(fù)雜需在不同線程之間同系統(tǒng)的伸縮性也是一個問4進程的數(shù)進程的所有線程共享進程所擁有的數(shù)虛地址空頁面工作權(quán)限控內(nèi)核對象環(huán)境字符命令5線程的數(shù)每個線程擁有自己的數(shù)用戶態(tài)堆態(tài)堆線程的局 調(diào)度狀態(tài)和優(yōu)先硬件上下程序計數(shù)器,棧指針,通用寄存權(quán)6一、進程控7進程控相關(guān)API說進程控制創(chuàng)建/結(jié)獲得當前進程標識掛同步等88相關(guān)API函數(shù)說返回當前進程的句HANDLE獲得進程的基準優(yōu)先DWORD分 空間,并將其清VOIDZeroMemory(Destination,9獲得系統(tǒng)中進程的快照,以枚舉所有進CreateToolhelp32Snapshot(dwFlags, 獲得快照中第一個進程的信息,存放LPPROCESSENTRY32結(jié)構(gòu)中BOOLProcess32First(HANDLEhSnapshot,LPPROCESSENTRY32lppe)獲得快照中下一個進程的信BOOLProcess32Next(HANDLEhSnapshot,LPPROCESSENTRY32lppe)獲得一個已經(jīng)存在的 象的句HANDLEOpenProcess(dwDesiredAccess,bInheritHandle,dwProce 象的 BOOLGetProcessTimes(hProcess,lpCreationTime,lpExitTime,lpKernelTime,lpUserTime);BOOLCloseHandle(HANDLE①一個對象的句柄數(shù)就是該對象的使用計數(shù)。o使指定的對象句柄無效,減少對象的句柄數(shù)。當一個對象的最后一個句柄被關(guān)閉后,就被刪除掉。②每個進 的句柄表,由本進程內(nèi)的所有線程使用{TH32CS_SNAPPROCESS,0);PROCESSENTRY32pe;ZeroMemory(&pe,sizeof(pe));bMore=Process32First(hSnapshot,&pe);{//利用句柄獲得進程信息ORMATION,FALSE,pe.th32Proce GetProcessTimes bMore=Process32Next(hSnapshot,&pe);}}進程控制進程控制系統(tǒng)調(diào)用函數(shù)CreatProcess()創(chuàng)建進程TerminateProcess終止進程。通常應(yīng)用BOOL

指定新進程將使的可執(zhí)行文LPCSTR

進程、主 象句柄從此返DWORDDWORD一個調(diào)用實BOOL szCmdLine=“notepad” //默認的線程 CREAT_NEW_CONSOLE,//使用新的控制臺 //當 //啟動信息,P234有說明,指向新進程主窗口外&pi //返回進程和主線程句typedefstruct_PROCESS_INFORMATION{HANDLEhProcess; //新進程句柄HANDLEhThread; DWORDdwProce ;//新進程標識符DWORDdwThreadId;//新線程標識符在CreateProcess()返回之前,會將進 句柄說①創(chuàng)建一個新進程,系統(tǒng)會創(chuàng)建一個進程內(nèi)核對象和一個線程內(nèi)核對象,它們的初始使用計數(shù)為1②在CreateProcess()返回時,又將新進 hThread中,因此新對象的使用計數(shù)就為2③為了斷絕與新進程的所有聯(lián)系,接著調(diào)用 獲得當前進程標識符的函DWORD VOIDSleep(DWORDdwMilliseconds);檢索含有給定模塊的可執(zhí)行文件路徑DWORDGetModuleFileName(HMODULEhModule,LPTSTRlpFilename,DWORDhModule為NULL時,則返回當前可執(zhí)行文件的lpFilename返回給定模塊的可執(zhí)行路徑和文件名;DWORDHANDLEhHandle, DWORDdwMilliseconds);//超時間隔當下列情況之一發(fā)生時該函數(shù)返(1)指定對象處于信號態(tài);(2)超DWORDWaitForMultipleObjects( 變?yōu)橛行盘枲顟B(tài),否則,有一個變?yōu)橛刑枲顟B(tài)就結(jié)束等待dwtimeout);//等待的時實例:創(chuàng)建進程實例:創(chuàng)建進程intmain(intargc,char*argv[ if(argc>1&&strcmp(argv[1Child”)==0 Child(主程序主程序代Parent(}voidParent()hchild=StartClone();//創(chuàng)建一個子進程WaitForSingleObject(hchild,INFINITE);}voidChild()printf(“Childisquiting.\n”); }voidStartClone(){//創(chuàng)建當前進程的克隆進程 LL,szFilename, STARTUPINFOsisi.cb=sizeof(si);//存子進程啟sprintf(szCmdLine,“\”%s\”Child”,szFilename);szCmdLine,...,CREATE_NEW_CONSOLE,...,&si,&pi);CloseHandle(pi.hThread);returnpi.hProcess;}二、線程控制與同線程控創(chuàng)建線程的進程通過對象句柄 線程相關(guān)的HANDLECreateThread{ dwCreationFlags,lpThreadID);lpStartAddress:指定線程所執(zhí)行函數(shù)的入口地址GetCurrentThreadId():獲得當前線程的ExitThread():終止一個線程。當線程的最后一 TerminateThread:通常由父進程調(diào)用來終止獲得指定線程的退出BOOLGetExitCodeThread(HANDLEhThread,LPWORDlpwdExitCode);SuspendThread(hTread):掛起線ResumeThread(hTread):恢復(fù)線系統(tǒng)為每個 建立一個掛起計數(shù)每掛起一次計數(shù)加,每恢復(fù)一次計數(shù)減當計數(shù)為時,掛起線程就變?yōu)榫途w線程,準備運行。系統(tǒng)采用可變動態(tài)優(yōu)先級線程調(diào)度策略線程優(yōu)先級可由0~31的整數(shù)來表示,31示最高。共32個線程就緒隊列獲得指定線程的優(yōu)先int設(shè)置指定線程的優(yōu)先BOOLSetThreadPriority(hThread,實例:創(chuàng)建新線程classHANDLEm_hThread;//線 LPCTSTRm_szName;//顯示此線程的名稱CWorkerThread(m_szName){m_hThread=CreateThread(NULL,ThreadProc,this,0,}//把對象指針this作為參數(shù)傳 pThis->DoStuff();return(0);}printf(m_szName,n);m_hThread,}//endclassCWorkerThreadwtA(“A創(chuàng)建線程 pletion();//暫停,直到A完}線程同同步對象主要有:進象、線象、事件對活動 CreateEvent():在內(nèi)核中創(chuàng)建一個新事件對OpenEvent():打開事件對象并獲得對象SetEvent():置人工重置事件為有信號狀ResetEvent():置人工重置事件為無信號狀PulseEvent():置自動重置事件為有信號狀態(tài)//創(chuàng)建一個事件對HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,//安全屬性,包 權(quán)和繼承權(quán)BOOLbManualReset,//為TRUE表示創(chuàng)建人工重BOOLbInitialState, LPCTSTR //事件對象實例:實例:intmain(intargc,char*argv[if(argc>1&&strcmp(argv[1],//子進程將父進程創(chuàng)建的事件置為有信號狀態(tài)SignalParent();}else//父進程創(chuàng)建一個事件并等待子進程發(fā)信號printf(“Parentprocessreleased.\n”);}//創(chuàng)建事 進程,等待子進程發(fā)信voidWaitForChild()

父進程代HANDLEhEventContinue=CreateEvent(NULL,TRUE,FALSE,//初始無信號CreateChild//創(chuàng)建子進WaitForSingleObject(hEventContinue,INFINITE);}BOOLCreateChild()

父進程代 LL,szFilename,MAX_PATH);//提取當前可執(zhí)行文件名sprintf(szCmdLines\”childszFilename);BOOLbCreateOK=CreateProcess(szFilename,szCmdLine,,&pi);}//在子進程中被調(diào)用,向父進程發(fā)出終止信voidSignalParent()

子進程代HANDLEhEventContinue=OpenEvent( g_szContinueEvent);//事件名稱SetEvent(hEventContinue);//置為有信號狀printf(“Childprocessbegining...\n”);CloseHandle(hEventContinue);//清除句柄}線程同步主要目的:控制 臨界資源的互擁有互 資源的線程創(chuàng)建互斥 結(jié)束時立即釋放bInitialOwner,HANDLEOpenMutex(dwDesiredAccess,bInheritHandle,lpName)釋放對資源的權(quán),使互斥體變?yōu)橛行艑嵗豪没コ怏w保main()CCountUpDownud(10);pletion();}classintm_nValue0;共享變//構(gòu)造函數(shù)創(chuàng)建兩 共享變量的線{//創(chuàng)建互斥體,初始時擁有無信號,IncThreadProc,this,0,NULL);DecThreadProc,this,0,NULL);ReleaseMutex(m_hMutexValue//釋放互斥體}IncThreadProc(pThis){ }DecThreadProc(pThis){ DoCountnStep//改變共享資源的方while(m_nAccess>0){//等 共享資WaitForSingleObject(m_nValue+=nStep;--m_nAccess;Sleep(500);ReleaseMutex(m_hMutexValue);}}}~CCountUpDown({CloseHandle(m_hThreadInc);CloseHandle(m_hMutexValue);}pletion(){INFINITE);};//end線程同步 每當一個線程要 資源時,線程就調(diào)用數(shù)WaitorSingleObjet,信號量對象再次檢查其計數(shù),如果有空閑資源就處于有信號狀態(tài)。HANDLECreateSemaphore(//創(chuàng)建信號量lpSemaphoreAttributes,//NULL表示默認屬性 umCount,//信號量的最大值 信號量使用計數(shù)器實現(xiàn)同步。每次取信號量時,數(shù)器遞減;每次釋放信號量時,計數(shù)器遞釋放信號量,來增加信號BOOLReleaseSemaphore( lpPreviousCount);//返回信號量原來打開一個已經(jīng)存 名信號量對HANDLEOpenSemaphore(dwDesiredAccess,bInheritHandle,lpName);實例:用信號量來void g_hSemThreads=CreateSemaphore(NULL,5,5, //創(chuàng)建100個線程,但僅允許5個線程同時活 otal=100;nTotal>0;--{//等待,直到有空位可以創(chuàng)建一個新線程WaitForSingleObject(g_hSemThreadsINFINITE);HANDLEhThread=CreateThread(NULL,0,ThreadProc,nTotal*5,0,NULL); }//endCloseHandle(g_hSemThreads);//關(guān)閉信號}//end//線程過程,可暫停,釋放信號量并通知操作ThreadProc(lpParam){nPauseMs=lpParam;//新線程的暫停時間 LONG//信號量計數(shù)增加1&nPrevCt返回信號量原來的值ReleaseSemaphore(g_hSemThreads1return}三 器管獲得系統(tǒng)與內(nèi)存信息的獲得系統(tǒng)與內(nèi)存信息的獲得系統(tǒng)相關(guān)信獲得指定進程的虛擬地址獲得系統(tǒng)性能信獲得系統(tǒng)內(nèi)存信VOIDGetSystemInfo(LPSYSTEM_INFO操作系統(tǒng)中有許多值是由系統(tǒng)所運行的主機決定的,如頁面大小和分配粒度等。這些值不應(yīng)在代碼中被寫死,可以動態(tài)獲取。structSYSTEM_INFO{ 頁面大

lpMinimumApplicationAddress;最小地址 dwActiveProcessorMask;系統(tǒng)配備的CPU掩碼dwNumberOfProcessors;處理機數(shù)量 dwAllocationGranularity;分配粒度,如64KBwProcessorLevel;CPU級別,3代表80386 SYSTEM_INFO中字dgeSize:頁面的大小。在x86中,該值為地址空間的最小內(nèi)存地址。在WindowsNT下,檢查進程虛存DWORDVirtualQueryEx( 檢查指定進程的虛擬內(nèi)存信息,填充由lpBuffer針指向的MEMORY_BASIC_INFORMATION結(jié)構(gòu)struct{ 包 址的最小頁AllocationBase;實際起始地

AllocationProtect;該區(qū)域初始設(shè)置的方RegionSize;虛存區(qū)的大 空閑、預(yù)留、提Protect;該區(qū)域設(shè)置的方式(讀寫執(zhí)行)Type;頁面類型:可執(zhí)行映像、內(nèi)存文實例:檢測進程的虛擬地址空void{}WalkVM(hProcess){SYSTEM_INFOsi;ZeroMemory(&si,sizeof(si));MEMORY_BASIC_INFORMATIONZeroMemory(&mbi,sizeof(mbi)); //循環(huán)整個私有地址空szFilename,MAX_PATH); 虛存區(qū)模塊獲得系統(tǒng)性能獲得系統(tǒng)性能信息DWORDstruct{ 當前線程 獲得系統(tǒng)內(nèi)獲得系統(tǒng)內(nèi)存信息MEMORYSTATUSEX結(jié)構(gòu)體struct{DWORDdwLength; DWORDdwMemoryLoad; DWORDLONGullTotalPhys; DWORDLONG DWORDLONGullTotalPageFile;總頁面大DWORDLONGullAvailPageFile;當前進程能獲取的最大內(nèi)存DWORDLONG 當前進程最大內(nèi)存尋址地DWORDLONG DWORDLONG}VirtualQueryEx():檢查進程VirtualAlloc():為進程分配虛VirtualFree():釋放進程虛VirtualProtect():改變虛存區(qū)的保VirtualLock():將虛存區(qū)鎖在主例例LPVOIDVirtualAlloc(lpAddress, flAllocationType,flProtect);//待分配區(qū)域的起始地址,通常為區(qū)域大?。槐A艋蛱峤?;保護屬性,讀//執(zhí)例1:pBlock=VirtualAlloc(NULL,99*1024, pBlock=VirtualAlloc(NULL,c_dwGigabyte,MEM_RESERVE,VirtualAlloc(pBlock,c_dwMegabyte,FillZero(pBlock,VirtualFree(pBlock,0,創(chuàng)建或打開文HANDLECreateFile( 類型,如讀/ lpSecurityAttributes,//安全屬性dwCreationDisposition,//如何創(chuàng)建文件dwFlagsAndAttributes,//屬性和標志 CREATE_NE:創(chuàng)建一個新文件,若文件存在則失敗OPEN_EXISTING:打開一個已存在的文TRUNCATE_EXITING:用 來開文件,一旦打開文件,就使文件長度為0BReadFile(//從文件指針指示的位置讀數(shù)據(jù)hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,//指向 量的指lpOverlapped); 屬 WriteFile(hFile,lpBuffer,lpNumberOfBytesWriten,lpOverlapped);//設(shè)置讀/寫指針的位SetFilePointer(hFile,lDistanceToMove//移動距離的低32位lpDistanceToMoveHigh,//移動距離高32dwMoveMethod);//起始位置指實例:創(chuàng)建12個線程讀寫文main()for(nTotal=12;nTotal>0;-- ThreadProc10NULL);//創(chuàng)建線WaitForSingleObject(hThreadINFINITE);CloseHandle(hThread);//釋放線程句柄}ThreadProc(lpParam){FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);ReadFile(hFile,&nValue,sizeof(nValue),&dwXfer,NULL);//&dwXfer nValue+=nAdd;//增加數(shù)據(jù)//寫之前要重置文件指針,指向文件開頭SetFilePointer(hFile,0,NULL,WriteFile(hFile,&nValue,sizeof(nValue),&dwXfer,NULL);} 文 操創(chuàng) :CreateDirectory(lpszPath,刪 獲得當 GetCurrentDirectory(ccCurDir,改變當 SetCurrentDirectory獲得系 GetSystemDirectory(lpszSysPath,HANDLEFindFirstFile(lpFileName,lpFindFileData); “..\\abc\\*.*”在abc 返回值:如果成功,則返回找到文件 的句柄 typedefstruct_WIN32_FIND_DATA{ FILETIMEftCreationTime;FILETIMEftLastAccessTime;FILETIMEftLastWriteTime; cFileName[MAX_PATH]; cAlternateFileName[14];}BOOLFindNextFile(hFindFile,//hFindFile為FindFirstFile函數(shù)返回的BOOLFindClose(hFindFile功能:關(guān)閉FindFirstFile創(chuàng)建的搜索句 操作的示利用文 對象實現(xiàn)通 。 實現(xiàn)文 的過用CreateFile()創(chuàng)建或打開一個磁盤文 就可以 主存一 文件完成,用UnMapViewOfFile()解 打開或創(chuàng)建一個文 對HANDLE 文對象的最大長都為0,就用磁盤文件的實際長HANDLEhFile, LPSECURITY_ATTRIBUTESlpAttributes,DWORDflProtect,//讀/寫保護參數(shù)DWORDdw umSizeHigh,文對象的最大長都為0,就用磁盤文件的實際長文件對象的另一個應(yīng)用是請求系統(tǒng)創(chuàng)在CreateFileMap INVALID_HANDLE_VALUE來代替真的文件句柄,就可以創(chuàng)建一個臨時的文打開一個文 對HANDLE DWORDdwDesiredAccess,//存取 BOOLbInheritHandle,//繼承標記LPCTSTRlpName); 把文件 LPVOIDHANDLEhFileMap Object,//對象句柄DWORDdwDesiredAccess,//指定 DWORDdwFileOffsetHigh,//文件內(nèi) DWORDdwFileOffsetLow,//文件內(nèi) SIZE_TdwNumberOfBytesToMap);//文件中要的字節(jié)數(shù)。用 整個文 對返回值:文 的起始地在當前進程的地址空間中解除對一個文件BOOLLPCVOID返回值:成功返回非零實例:共享內(nèi)存void{//線程間使用內(nèi) 文件交換數(shù) =MakeSharedFile();//創(chuàng)建共享內(nèi)存文件 =CreateMutex(NULL,FALSE, otal=100;nTotal>0;-- //創(chuàng)建100個線程來讀HANDLEhThread=CreateThread(NULL,0,ThreadProc,hMap ,0,NULL);if(nTotal==1){//等待最后的線程釋放WaitForSingleObject(hThread,INFINITE);}CloseHandle(hThread);//釋放線程的句柄}//end }//endHANDLEMakeSharedFile//創(chuàng)建共享內(nèi){//創(chuàng)建一個臨時文 對HANDLE INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(LONG),NULL); LPVOIDpData=MapViewOfFile(hMap FILE_MAP_ALL_ACCESS,0,0,0); 整個文ZeroMemory(pData,sizeof(LONG));//初始化UnmapViewOfFile(pData); }ThreadProc(lpVOIDlpParam)//線程函{hMap =lpParam; ,INFINITE);//在文 上創(chuàng)建視LPVOIDpFile=MapViewOfFile(hMap FILE_MAP_ALL_ACCESS,0,0,0);LONG*pnData=++(*pnData);//對共享內(nèi)存中的數(shù)增值UnmapViewOfFile(pFile);//釋放視圖 );//釋放互斥}分運行時,程序先創(chuàng)建一個小型的文問權(quán),在文 上創(chuàng)建視圖,將其中異步讀寫文指定讀操作完成時所執(zhí)行的結(jié)束函數(shù)(線程的 LPOVERLAPPEDlpOverlapped,//指向 pletionRoutine回調(diào)函指定寫操作完成時所執(zhí)行的結(jié)束函WriteFileEx(hFile,lpBuffer,nNumberOfBytesToWrite,

溫馨提示

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

評論

0/150

提交評論