操作系統實驗報告windows部分原創_第1頁
操作系統實驗報告windows部分原創_第2頁
操作系統實驗報告windows部分原創_第3頁
操作系統實驗報告windows部分原創_第4頁
操作系統實驗報告windows部分原創_第5頁
已閱讀5頁,還剩26頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

(windows3.1Windows“任務管理器”的進程管理CPUCPU的句柄、線程和進程的總數,物理、核心和認可的內存總數(KB)等。MicrosoftWindow20005.00.2195ServicePack43.1Windows“任務管理器”的進程管理,Windows部分(系統(SYSTEM)進程有__13___個,填入表3-1中。表3-1實驗記錄 用戶名 CPU Systemidleprocess服務(SERVICE)進程有__3__個,填入表3-2中。表3-2實驗記錄 用戶名 CPU

表3-3實驗記錄 用戶名 CPU 注意:終止進程時要小心。終止進程有可能導致不希望發生的結果,包括數據丟失和系統定等。因為在被終止前,進程將沒有機會保存其狀態和數據。如果結束應用程序,您將丟存的數據。如果結束系統服務,系統的某些部分可能無法正常工作。()CPU3.1提高Windows2000內存性能WindowsWindowsNT4中的限制為128MB)。根據系統中的物理內存數量,復雜的算法在啟動時動態確定頁文件。2)Windows2000使用內存數量的1.5倍作為分頁文件的最小容量,這個最小容量的兩倍作為最大容量。它減少了系統因為錯誤配置的分頁文件而崩潰的可能性。系統在崩潰之后能夠將1當Windows2000求助于硬盤以獲得虛擬內存時,這個過程被稱為分頁(paging)。分3)在“Windows任務管理器”對話框中選定“進程”選項卡。表5-1實驗記錄 PID CPU 0:00:10 總數(K):56552未分頁(K):107241)單擊“Windows任務管理器”的“進程”選項卡,然后從“查看”菜單中選擇“選表5-2實驗記錄 PID 頁面緩沖池 32276K 241K 256MB在Windows2000的安裝過程中,將使用連續的磁盤空間自動創建分頁文件1)在“開始”菜單中單擊“設置”–“控制面板”命令,雙擊“管理工具”圖標,再表5-3實驗記錄

3232

.52G3M.29G所選驅動器(C:)的頁面文件大小:初始大小(MB):384MB最大值(MB):768MB(

3.2Windows2000編程GUIWindows2000是以NT的技術構建的,它提供了創建控制臺應用程序的能力,使用戶em接庫(DLL)代碼塊,在其中包含應用程序所使用的機器代碼和應用程序的數據。1)一臺運行Windows2000Professional操作系統的計算機。2)計算機中需安裝VisualC++6.0專業版或企業版。2.GUI應用程序Hello.cpp清單3-1一個簡單的Windows2000控制臺應用程序//hello項目#include<iostream>voidmain()std::cout<<“Hello,Windows2000”<<std::endl;C:\>CLHello.cpp運行結果(如果運行不成功,則可能的原因是什么?):3-2.cpp清單3-2Windows2000的GUI應用程序//msgbox項目#include<windows.h> //標準的include//告訴連接器與包括MessageBoxAPI函數的user32庫進行連接#pragmacomment(lib,“user32.lib”)//這是一個可以彈出信息框然后退出的筒單的應用程序intAPIENTRYWinMain(HINSTANCE /*hInstance*/, /*hPrevInstance*/, /*lpCmdLine*/,int /*nCmdShow*/)::MessageBox(L,

//沒有父窗口“Hello,Windows2000”, //消息框中的文本 //消息框標題MB_OK); //其中只有一個OK按鈕//返回0以便通知系統不進入消息循環return(0)WORDC:\>CL3-2.cpp接下來是WinMain()方法。其中有四個由實際的低級入口點傳遞來的參數。hInstance處。句柄的數值實際上是EXE文件映像的基地址,通常為0x00400000。下一個參數(程序的名稱)是lpCmdLine參數。另外,系統利用nCmdShow參數告訴應用程序如何顯示它的主窗口(選項包括最小化、最大化和正常)。API)Hello,Windows2000GreetingsAPI清單3-3獲得和使用進程的句柄//prochandle項目#include<windows.h>#include<iostream>//確定自己的優先權的簡單應用程序voidmain()//從當前進程中提取句柄HANDLEhProcessThis=::GetCurrentProcess();//請求內核提供該進程所屬的優先權類DWORDdwPriority=::GetPriorityClass(hProcessThis);//發出消息,為用戶描述該類std::cout<<“Currentprocesspriority:”;itch(dwPriority)caseHIGH_PRIORITY_CLASS:std::cout<<“High”;eak;caseNORMAL_PRIORITY_CLASS:std::cout<<“Normal”;eak;caseIDLE_PRIORITY_CLASS:std::cout<<“Idle”;eak;caseREALTIME_PRIORITY_CLASS:std::cout<<“Realtime”;eak;fault:std::cout<<“<unknown>”;eak;std::cout<<std::endl;3-3C:\>CL3-3.cpp運行結果:HighMormalIdleRealtimeunknown清單3-4利用句柄查出進程的詳細信息//proclist項目#include<windows.h>#include<tlhelp32.h>#include<iostream>DWORDGetKernelModePercentage(constFILETIME&ftKernel,constFILETIME&ftUser)//將FILETIME結構轉化為64位整數ULONGLONGqwKernel=(((ULONGLONG)ftKernel.dwHighDateTime)<<32)+Kernel.dwLowDateTime;ULONGLONGqwUser=(((ULONGLONG)ftUser.dwHighDateTime)<<32)+User.dwLowDateTime;//將消耗時間相加,然后計算消耗在內核模式下的時間百分比ULONGLONGqwTotal=qwKernel+qwUser;DWORDdwPct=(DWORD)(((ULONGLONG)100*qwKernel)/qwTotal);return(dwPct)//以下是將當前運行進程名和消耗在內核模式下的時間百分數都顯示出來的應用程序voidmain()//對當前系統中運行的進程拍取“快照”HANDLEhSnapshot=::CreateToolhelp32Snapshot(TH32CS–SNAPPROCESS, //提取當前進程0); //如果是當前進程,就將其忽略//初始化進程入口PROCESSENTRY32::ZeroMemory(&pe,sizeof(pe));pe.dwSize=sizeof(pe);//按所有進程循環BOOLbMore=::Process32First(hSnapshot,&pe);ile(bMore)//打開用于讀取的進程HANDLEhProcess=::OpenProcess(N,

//指明要得到信息 //不必繼承這一句柄pe.th32ProcessID); //要打開的進程if(hProcess!=NULL)//找出進程的時間FILETIMEftCreation,ftExit,ftKernelMode,ftUserMode;::GetProcessTimes( //所感興趣的進程&ftCreation, //進程的啟動時間(絕對的)&ftExit, //結束時間(如果有的話)&ftKernelMode, //在內核模式下消耗的時間&ftUserMode); //在用戶模式下消耗的時間//計算內核模式消耗的時間百分比DWORDdwPctKernel=::GetKernelModePercentage(ftKernelMode, //在內核模式上消耗的時間ftUserMode); //在用戶模式下消耗的時間//向用戶顯示進程的某些信息std::cout<<“ProcessID:”<<pe.th32ProcessID<<“,EXEfile:”<<pe.szExeFile<<“,%inkernelmode:”<<dwPctKernel<<std::endl;//消除句柄::CloseHandle(hProcess);//轉向下一個進程bMore=::Process32Next(hSnapshot,&pe);C:\>CL3-4.cpp,EXEfile:,%inkemelmode:3.2Windows2000內存結構1)通過實驗了解Windows2000內存的使用,學習如何在應用程序中管理內存,體會2)了解Windows2000的內存結構和虛擬內存的管理,進而了解進程堆和Windows為1)一臺運行Windows2000Professional操作系統的計算機。2)計算機中需安裝VisualC++6.0專業版或企業版。清單5-1獲取有關系統的內存設置的信息//工程vmeminfo#include<windows.h>#include<iostream>#include<shlwapi.h>#include<iomanip>#pragmacomment(lib,“shlwapi.lib”)voidmain()//首先獲得系統信息SYSTEM_INFO::ZeroMemory(&si,sizeof(si));::GetSystemInfo(&si);//使用外殼輔助程序對一些尺寸進行格式化TCHARszPageSize[MAX_PATH];::StrFormatByteSize(si.dwPageSize,szPageSize,MAX_PATH);DWORDdwMemSize=(DWORD)si.lpMaximumApplicationAddress-(DWORD)si.lpMinimumApplicationAddress;TCHARszMemSize[MAX_PATH];::StrFormatByteSize(dwMemSize,szMemSize,MAX_PATH);//將內存信息顯示出來std::cout<<“Virtualmemorypagesize:”<<szPageSize<<std::endl;std::cout.fill(?0?);std::cout<<“Minimumapplicationaddress:0x”<<std::hex<<std::setw(8)<<(DWORD)si.lpMinimumApplicationAddress<<std::endl;std::cout<<“Maximumapplicationaddress:0x”<<std::hex<<std::setw(8)<<(DWORD)si.lpMaximumApplicationAddress<<std::endl;std::cout<<“Totalavailablevirtualmemory:”<<szMemSize<<std::endl;運行結果(如果運行不成功,則可能的原因是什么?):1)虛擬內存每頁容量為:4.00kb2)最小應用地址:0x000100003)最大應用地址:0x7ffeffff4)當前可供應用程序使用的內存空間為:1.99GB

提示:可供應用程序使用的內存空間實際上已經減去了開頭與結尾兩個64KB的保護區。虛擬內存空)都將引發一個錯誤陷井,從而導致錯誤并終止程序的執行。也就是說,假如用戶有一個NULL指針(地址外錯誤并終止程序的執行。3.3Windows2000進程的“一生”API函數終止。通常應用程序的框架負責調用ExitProcess()函數。對于C++運行庫來說,表3-4CreateProcess()函數的參數參數名稱LPCTSTRlpApplivationNameLPCTSTRlpCommandLinelpProcessAttributesThreadAttributesBOOLbInheritHandleDWORDdwCreationFlageLPVOIDlpEnvironmentLPCTSTRlpCurrentDirectorySTARTUPINFOProcessInformation目的EXE執行文件發送的參數進程句柄的安全屬性。主要指明這一句柄是否應該由其他程所繼承進程的主線程的句柄的安全屬性標志,告訴系統允許新進程繼承創建者進程的句柄特殊的創建標志(如CREATE_SUSPENDED)的位標記的啟動目錄STARTUPINFO結構,包括新進程的輸入和輸出配置的詳情ID接著是CreateProcess()函數調用所需要的三個通常使用缺省值的參數。第一個參數是向主創進程發送與缺省目錄不同的新進程使用的特殊的當前目錄;第三個參數是首先可查看的進程特性是系統進程標識符(PID),可利用GetCurrentProcessId()API函數來查看,與GetCurrentProcess()相似,對該函數的調用不能失敗,但返回的PID在整個系統中都可使用。其他的可顯示當前進程信息的API函數還有GetStartupInfo()和通常,一個進程需要它的運行期環境的信息。例如API函數GetModuleFileName()和GetCommandLine(),可以給出用在CreateProcess()中的參數以啟動應用程序。在創建應用性能信息可通過GetProcessIoCounters()、GetProcessPriorityBoost()、GetProcessTimes()和GetProcessWorkingSetSize()API得到。以上這幾個API函數都只需要具有另一個可用于進程信息查詢的API函數是GetProcessVersion()。此函數只需感興趣進程的PID(進程標識號)。本實驗程序清單3-6中列出了這一API函數與GetVersionEx()的1)一臺運行Windows2000Professional操作系統的計算機。2)計算機中需安裝VisualC++6.0專業版或企業版。 函數開始和以調用 ExitProcess()或TerminateProcess()清單3-5創建子進程//proccreate項目#include<windows.h>#include<iostream>#include<stdio.h>//創建傳遞過來的進程的克隆過程并賦于其ID值voidStartClone(intnCloneID)//提取用于當前可執行文件的文件名::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進程的命令行并通知其EXE文件名和克隆ID;::sprintf(szCmdLine,“\”%s\”%d”,szFilename,nCloneID);//用于子進程的STARTUPINFO結構STARTUPINFO::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));si.cb=sizeof(si); //必須是本結構的大小//TION//利用同樣的可執行文件和命令行創建進程,并賦于其子進程的性質BOOLbCreateOK=::CreateProcess(szFilename, //產生這個EXE的應用程序的名稱szCmdLine, //告訴其行為像一個子進程的標志 //缺省的進程安全性 //缺省的線程安全性 //不繼承句柄 //使用新的控制臺 //新的環境 //當前目錄&si, //啟動信息&pi); //返回的進程信息//對子進程釋放引用if(bCreateOK)::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);intmain(intargc,char*argv[])//確定進程在列表中的位置intnClone(0);if(argc>1)//從第二個參數中提取克隆ID::sscanf(argv[1],“%d”,&nClone);//顯示進程位置std::cout<<“ProcessID:“<<::GetCurrentProcessId()<<“,CloneID:“<<nClone<<std::endl;//檢查是否有創建子進程的需要constintc_nCloneMax=25;if(nClone<C_nCloneMax)//發送新進程的命令行和克隆號StartClone(++nClone)//在終止之前暫停一下(l/2秒)::Sleep(500);returnThisbuildcommandrequiresanactiveprojectworkspace.Wouldyouliketocreateadefaultprojectworkspace?main() //產生這個EXE的應用程序的名稱 //告訴其行為像一個子進程的標志 //缺省的進程安全性 //缺省的線程安全性 //不繼承句柄 //使用新的控制臺 //新的環境 //當前目錄 //啟動信息&pi); //返回的進程信息程序運行時屏幕顯示程序運行時屏幕顯示的信息是:ProcessID:2384,CloneID:0符”狀態下嘗試執行該程序,看看與在可視化界面下運行的結果有沒有不同?為什么?本實驗的程序中列出了用于進程信息查詢的API函數GetProcessVersion()與步驟8:在VisualC++窗口的工具欄中單擊“打開”按鈕,在“打開”對話框中找到清單3-6使用進程和操作系統的版本信息//version項目#include<windows.h>#include<iostream>//利用進程和操作系統的版本信息的簡單示例voidmain()//提取這個進程的ID號DWORDdwIdThis=::GetCurrentProcessId();//獲得這一進程和報告所需的版本,也可以發送0以便指明這一進程DWORDdwVerReq=::GetProcessVersion(dwIdThis);WORDwMajorReq=(WORD)dwVerReq>16);WORDwMinorReq=(WORD)dwVerReq&0xffff);std::cout<<“ProcessID:“<<dwIdThis<<“,requiresOS:“<<wMajorReq<<wMinorReq<<std::endl;//設置版本信息的數據結構,以便保存操作系統的版本信息OSVERSIONINFOEXosvix;::ZeroMemory(&osvix,sizeof(osvix));osvix.dwOSVersionInfoSize=sizeof(osvix);//提取版本信息和報告::GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvix));std::cout<<“RunningonOS:“<<osvix.dwMajorVersion<<“.”<<osvix.dwMinorVersion<<std::endl;//如果是NTS(Windows2000)系統,則提高其優先權if(osvix.dwPlatformld==VER_PLATFORM_WIN32_NT&&osvix.dwMajorVersion>=5)//改變優先級::SetPriorityClass(::GetCurrentProcess(), //利用這一進程HIGH_PRIORITY_CLASS); //改變為high//報告給用戶std::cout<<“TaskManagershouldnownowindicatethis”“processishighpriority.”<<std::endl;ProcessID:1492,requiresOS:00RunningonOS:5.1TaskManagershouldnownowindicatethisprocessishighpriority.是(為什么?): API可調節進程可用的非頁面RAM的容量;還有一個只對當前進程可用的API函數,即清單3-7指令其子進程來“殺掉”自己的父進程//procterm項目#include<windows.h>#include<iostream>#include<stdio.h>staticLPCTSTRg_szMutexName=“w2kdg.ProcTerm.mutex.Suicide”;//創建當前進程的克隆進程的簡單方法voidStartClone()//提取當前可執行文件的文件名;::GetModuleFileName(NULL,szFilename,MAX_PATH);//格式化用于子進程的命令行,指明它是一個EXE文件和子進程::sprintf(szCmdLine,“\”%s\“child”,szFilename);//子進程的啟動信息結構STARTUPINFO::ZeroMemory(reinterpret_cast<void*>(&si),sizeof(si));si.cb=sizeof(si); //應當是此結構的大小//TION//用同樣的可執行文件名和命令行創建進程,并指明它是一個子進程BOOLbCreateOK=::CreateProcess(szFilename, //產生的應用程序名稱(本EXE文件)szCmdLine, //告訴我們這是一個子進程的標志 //用于進程的缺省的安全性 //用于線程的缺省安全性 //不繼承句柄 //創建新窗口,使輸出更直觀 //新環境 //當前目錄&si, //啟動信息結構&pi); //返回的進程信息//釋放指向子進程的引用if(bCreateOK)::

溫馨提示

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

評論

0/150

提交評論