操作系统课设之内存管理
前言
課程設計開始了,實驗很有意思,寫博客總結學到的知識
白嫖容易,創(chuàng)作不易,學到東西才是真
本文原創(chuàng),創(chuàng)作不易,轉載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/archives/179
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/118308841
為了美觀,實驗源代碼在結尾處,整合版見下
鏈接:https://pan.baidu.com/s/1rXj1QJGuw-BVc5sQWret9w
提取碼:Lin2
操作系統(tǒng)課程設計源代碼
本次操作系統(tǒng)課程設計合集
操作系統(tǒng)課設之Windows 進程管理
操作系統(tǒng)課設之Linux 進程管理
操作系統(tǒng)課設之Linux 進程間通信
操作系統(tǒng)課設之Windows 的互斥與同步
操作系統(tǒng)課設之內存管理
操作系統(tǒng)課設之虛擬內存頁面置換算法的模擬與實現
操作系統(tǒng)課設之基于信號量機制的并發(fā)程序設計
操作系統(tǒng)課設之簡單 shell 命令行解釋器的設計與實現
僅用于學習,如有侵權,請聯(lián)系我刪除
實驗題目
內存管理
實驗目的
了解 Windows 的內存結構和虛擬內存的管理,理解進程的虛擬內存空間和物理內存的映射關
系。加深對操作系統(tǒng)內存管理、虛擬存儲管理等理論知識的理解。
實驗內容
實驗步驟:
在Windows下用codeblocks創(chuàng)建一個project,將指導書的源碼copy到main.cpp下,編譯運行,查看結果。
報錯1:StrFormatByteSize()不可用
因為沒鏈接庫
在左側點擊工程文件夾 – 右鍵 – bulid options…,
在彈出的窗口選擇–linker settings – other linker options中
添加-lshlwapi
程序正常運行。
有同學還遇到了類型錯誤的報錯,(相對于codeblocks20.03版本,本人是17.12)
需要把報錯位置的(DWORD)改成(DWORD64)即可
結果如下
虛擬內存每頁容量為:4.00 KB__________
最小應用地址:0x00010000__________
最大應用地址:______0x7ffeffff ___________
當前可供應用程序使用的內存空間為:___1.99 GB _____
當前計算機的實際內存大小為:16G
理論上每個 Windows 應用程序可以獨占的最大存儲空間是:17.99G
實驗結果與分析
因為程序輸出是格式化輸出,所以寫了一個C++程序,用來格式化處理數據,格式化處理有刪除,字符,然后在按照虛存地址類型排序輸出。
整理好的結果如下(部分)
由于實在太多,截圖不方便,這里只列出部分。
Windows Xp 是 32 位的操作系統(tǒng),它使計算機 CPU 可以用 32 位地址對 32 位內存塊進行操作。
內存中的每一個字節(jié)都可以用一個 32 位的指針來尋址。這樣,最大的存儲空間就是2^32字節(jié)或 4000兆字節(jié) (4GB) 。這樣,在 Windows 下運行的每一個應用程序最大可能占有 4GB 大小的空間。然而,實際上每個進程一般不會占有 4GB 內存。Windows 在幕后將虛擬內存 (virtual memory,VM) 地址映射到了各進程的物理內存地址上。而所謂物理內存是指計算機的 RAM 和由 Windows分配到用戶驅動器根目錄上的換頁文件。物理內存完全由系統(tǒng)管理。在 Windows 環(huán)境下,4GB 的虛擬地址空間被劃分成兩個部分:低端 2GB 提供給進程使用,高端 2GB 提供給系統(tǒng)使用。這意味著用戶的應用程序代碼,包括 DLL 以及進程使用的各種數據等,都裝在用戶進程地址空間內 (低端 2GB) 。用戶進程的虛擬地址空間也被分成三部分:
與虛擬內存區(qū)相關的訪問權限告知系統(tǒng)進程可在內存中進行何種類型的操作。例如,用戶不能在只有 PAGE_READONLY 權限的區(qū)域上進行寫操作或執(zhí)行程序;也不能在只有 PAGE_EXECUTE權限的區(qū)域里進行讀、寫操作。而具有 PAGE_ NOACCESS 權限的特殊區(qū)域,則意味著不允許進程
對其地址進行任何操作。在進程裝入之前,整個虛擬內存的地址空間都被設置為只有 PAGE_NOACCESS 權限的自由區(qū)域。當系統(tǒng)裝入進程代碼和數據后,才將內存地址的空間標記為已調配區(qū)或保留區(qū),并將諸如EXECUTE、READWRITE 和 READONLY 的權限與這些區(qū)域相關聯(lián)。
小結與心得體會
對于Windows我們每天都在使用,但是對于其的內存管理倒是沒怎么關注過,本次實驗了解了Windows的內存管理機制。
源代碼
// 工程 vmwalker #include <windows.h> #include <iostream> #include <shlwapi.h> #include <iomanip> #pragma comment(lib, "Shlwapi.lib") // 以可讀方式對用戶顯示保護的輔助方法。 // 保護標記表示允許應用程序對內存進行訪問的類型 // 以及操作系統(tǒng)強制訪問的類型inline bool TestSet(DWORD dwTarget, DWORD dwMask) {return ((dwTarget &dwMask) == dwMask) ; } # define SHOWMASK(dwTarget, type) \ if (TestSet(dwTarget, PAGE_##type) ) \{std :: cout << ", " << #type; } void ShowProtection(DWORD dwTarget) {SHOWMASK(dwTarget, READONLY) ;SHOWMASK(dwTarget, GUARD) ;SHOWMASK(dwTarget, NOCACHE) ;SHOWMASK(dwTarget, READWRITE) ;SHOWMASK(dwTarget, WRITECOPY) ;SHOWMASK(dwTarget, EXECUTE) ;SHOWMASK(dwTarget, EXECUTE_READ) ;SHOWMASK(dwTarget, EXECUTE_READWRITE) ;SHOWMASK(dwTarget, EXECUTE_WRITECOPY) ;SHOWMASK(dwTarget, NOACCESS) ; } // 遍歷整個虛擬內存并對用戶顯示其屬性的工作程序的方法 void WalkVM(HANDLE hProcess) { // 首先,獲得系統(tǒng)信息SYSTEM_INFO si;:: ZeroMemory(&si, sizeof(si) ) ;:: GetSystemInfo(&si) ; // 分配要存放信息的緩沖區(qū)MEMORY_BASIC_INFORMATION mbi;:: ZeroMemory(&mbi, sizeof(mbi) ) ; // 循環(huán)整個應用程序地址空間LPCVOID pBlock = (LPVOID) si.lpMinimumApplicationAddress;while (pBlock < si.lpMaximumApplicationAddress){ // 獲得下一個虛擬內存塊的信息if (:: VirtualQueryEx(hProcess, // 相關的進程pBlock, // 開始位置&mbi, // 緩沖區(qū)sizeof(mbi))==sizeof(mbi) ) // 大小的確認{ // 計算塊的結尾及其大小LPCVOID pEnd = (PBYTE) pBlock + mbi.RegionSize;TCHAR szSize[MAX_PATH];:: StrFormatByteSize(mbi.RegionSize, szSize, MAX_PATH) ; // 顯示塊地址和大小std :: cout.fill ('0') ;std :: cout<< std :: hex << std :: setw(8) << (DWORD) pBlock<< "-"<< std :: hex << std :: setw(8) << (DWORD) pEnd<< (:: strlen(szSize)==7? " (" : " (") << szSize<< ") " ; // 顯示塊的狀態(tài)switch(mbi.State){case MEM_COMMIT :std :: cout << "Committed" ;break;case MEM_FREE :std :: cout << "Free" ;break;case MEM_RESERVE :std :: cout << "Reserved" ;break;} // 顯示保護if(mbi.Protect==0 && mbi.State!=MEM_FREE){mbi.Protect=PAGE_READONLY;}ShowProtection(mbi.Protect); // 顯示類型switch(mbi.Type){case MEM_IMAGE :std :: cout << ", Image" ;break;case MEM_MAPPED:std :: cout << ", Mapped";break;case MEM_PRIVATE :std :: cout << ", Private" ;break;} // 檢驗可執(zhí)行的影像TCHAR szFilename [MAX_PATH] ;if (:: GetModuleFileName ((HMODULE) pBlock, // 實際虛擬內存的模塊句柄szFilename, //完全指定的文件名稱MAX_PATH)>0) //實際使用的緩沖區(qū)大小{ // 除去路徑并顯示:: PathStripPath(szFilename) ;std :: cout << ", Module: " << szFilename;}std :: cout << std :: endl; // 移動塊指針以獲得下一下個塊pBlock = pEnd;}} } void ShowVirtualMemory() { // 首先,讓我們獲得系統(tǒng)信息SYSTEM_INFO si;:: ZeroMemory(&si, sizeof(si) ) ;:: GetSystemInfo(&si) ; // 使用外殼輔助程序對一些尺寸進行格式化TCHAR szPageSize[MAX_PATH];::StrFormatByteSize(si.dwPageSize, szPageSize, MAX_PATH) ;DWORD dwMemSize = (DWORD)si.lpMaximumApplicationAddress -(DWORD) si.lpMinimumApplicationAddress;TCHAR szMemSize [MAX_PATH] ;:: StrFormatByteSize(dwMemSize, szMemSize, MAX_PATH) ; // 將內存信息顯示出來std :: cout << "Virtual memory page size: " << szPageSize << std :: endl;std :: cout.fill ('0') ;std :: cout << "Minimum application address: 0x"<< std :: hex << std :: setw(8)<< (DWORD) si.lpMinimumApplicationAddress<< std :: endl;std :: cout << "Maximum application address: 0x"<< std :: hex << std :: setw(8)<< (DWORD) si.lpMaximumApplicationAddress<< std :: endl;std :: cout << "Total available virtual memory: "<< szMemSize << std :: endl ; }int main() { //顯示虛擬內存的基本信息ShowVirtualMemory(); // 遍歷當前進程的虛擬內存::WalkVM(::GetCurrentProcess());return 0; }總結
以上是生活随笔為你收集整理的操作系统课设之内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RTX5 | 事件标志组04 - 线程同
- 下一篇: sql配置管理器服务是空的_Postgr