




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 操作系統 實驗報告實驗名稱:操作系統的存儲管理方式班 級:姓 名:學 號:類 型:實驗地點:日 期:一、實驗目的:1. 動態測試WINDOWS2000/XP系統內存二、實驗環境:1. PC機一臺(VC、C、VB等編程環境)三、實驗內容和要求:1了解WINDOWS 用戶進程地址空間分布、系統地址空間分布、WINDOWS中用戶空間內存分配方式(以頁為單位的虛擬內存分配方法)、WINDOWS的內存保護機制。四、實驗步驟:#include#include#include#includeusing namespace std;const int MM_SIZE=100; /內存塊數const int
2、ROW=10; /繪制內存行數const int COL=10; /繪制內存列數const int NEME_LEN=10; /名字長度const int WAITTIME=2000; /等待時間int UsedNum=0; /當前已占用的內存塊數int FreeNum=MM_SIZE; /當前空閑的內存塊數int ProCnt=0; /當前用戶進程數int NowID=1; /當前分配的進程編號int MMMM_SIZE; /Main Memony/0 - 內存塊未被使用/-1 - 內存塊在初始化時已被系統占用/k - 內存塊已被分配給pID=k 的用戶進程/*進程Obj*/class PR
3、OCESSpublic:PROCESS():next(0) /構造函數重載,用于構造隊列隊頭PROCESS(char* Name,int pN):PageNum(pN),next(0)pName=new charNEME_LEN;strcpy(pName,Name);PageTable=new intMM_SIZE;for(int i=0;iMM_SIZE;i+)PageTablei=-1;pID=NowID+;PROCESS()delete pName;delete PageTable;PROCESS* next; /指向下一個進程char* GetpName(void)const retu
4、rn pName; /獲取進程名int GetpID(void)const return pID; /獲取進程編號int GetPageNum(void)const return PageNum; /獲取進程所需頁數void UnionTable(int i,int j); /關聯頁號i 與塊號j(創建頁表)void PrintPageTable(void); /打印頁表protected:char* pName; /進程名int pID; /進程編號int PageNum; /進程所需頁數int* PageTable; /頁表;PROCESS* ProLinkHead=new PROCESS
5、; /申請進程隊列隊頭空間void PROCESS:UnionTable(int i,int j)PageTablei=j;return;void PROCESS:PrintPageTable(void)cout PAGETABLE (頁表)endl;cout 頁號ID 塊號ID#endl;for(int i=0;iMM_SIZE;i+)if(PageTablei!=-1)printf( %-2d %-2dn,i,PageTablei);coutendl;return;void Initial_MM(void); /初始化void Menu(void); /菜單void CheckMM(voi
6、d); /查看內存狀態void PrintProList(void); /打印當前用戶進程列表void CheckPro(void); /查看進程狀態void CreatePro(void); /創建新用戶進程void DelPro(void); /刪除用戶進程/*主函數*/int main(void)srand(time(0);Initial_MM();Menu();return 0;/*初始化內存狀態*/void Initial_MM(void)memset(MM,0,sizeof(int)*MM_SIZE); /缺省所有內存塊空閑(0)int USE=rand()%4+2; /初始內存占
7、用系數int UsedMM=MM_SIZE/USE; /初始內存占用數 (占用率=USEMM/MM_SIZE)for(int i=0;iUsedMM;i+) /隨機分配UsedMM 個內存塊給系統(-1)int id;doid=rand()%MM_SIZE;while(MMid=-1); /檢查編號為id 的內存塊是否已分配給系統MMid=-1;UsedNum+=UsedMM;FreeNum-=UsedMM;return;/*菜單*/void Menu(void)int select;while(true)system(cls);coutendl;coutendl;cout 1. 檢查內存的狀
8、態endl;coutendl;cout 2. 檢查進程的狀態endl;coutendl;cout 3. 創建新進程endl;coutendl;cout 4. 刪除進程endl;coutendl;cout 5.退出endl;coutendl;coutselect;if(select=5)break;switch(select)case 1:CheckMM();break;case 2:CheckPro();break;case 3:CreatePro();break;case 4:DelPro();break;default:cout出現錯誤,請重新輸入!endl;Sleep(WAITTIME/
9、2);break;return;/*查看內存狀態*/void CheckMM(void)system(cls);coutendl;cout 主內存 (塊號)ID#=ROW*iR+jCendl;cout 0C 1C 2C 3C 4C 5C 6C 7C 8C 9Cendl;for(int i=0;iROW;i+)printf(%dR ,i);for(int j=0;jCOL;j+)printf(%2d ,MMROW*i+j);coutendl;cout -1 : 系統使用的內存endl;cout 0 : 釋放內存endl;cout n : PROCESS_n使用內存endl;coutendl;co
10、ut返回菜單? (Y/N)Key;if(Key=Y | Key=y)break;cout請輸入 Y.endl;cout你現在只能返回菜單endl;return;/*創建新用戶進程*/void CreatePro(void)system(cls);coutendl;cout 創建新的進程endl;/*輸入新進程參數*/char nameNEME_LEN; /新進程名字int pN; /新進程所需占用的頁數coutname;coutpN;if(pNFreeNum) /檢查空閑塊數是否足夠分配給新進程coutendl;cout內存不足! 無法創建該進程,請清理內存再重試endl;cout自動返回菜單
11、next=ProLinkHead-next;ProLinkHead-next=tmp;/*為進程分配內存*/int j=0;for(int i=0;ipN;i+) /枚舉進程頁號,為其分配內存塊for(;jGetpID();tmp-UnionTable(i,j);break;coutendl;cout創建進程 name 成功!endl;cout自動返回菜單endl;Sleep(WAITTIME);return;/*打印當前用戶進程列表*/void PrintProList(void)coutendl;cout 進程狀態endl;coutPID PAGENUM名稱next)p=p-next;pr
12、intf( %-10s %2d %4dn,p-GetpName(),p-GetpID(),p-GetPageNum();return;/*查看進程狀態*/void CheckPro(void)system(cls);PrintProList();if(ProCnt=0)cout當前不存在任何用戶進程endl;cout自動返回菜單endl;Sleep(WAITTIME);return;cout輸入PID 查看指定進程的詳細信息: pid;bool flag=false; /標記是否找到編號為pid 的進程PROCESS* p=ProLinkHead-next;while(p)if(p-GetpI
13、D()!=pid)p=p-next;elseflag=true;break;if(!flag)cout輸入錯誤! 不存在的進程!endl;elsesystem(cls);coutendl;cout PROCESS_GetpName()_GetpID()endl;cout PAGENUM(頁數) : GetPageNum()endl;coutPrintPageTable(); /打印pid 進程的頁表coutBack to Menu? (Y/N)Key;if(Key=Y | Key=y)break;cout請輸入 Yendl;cout你現在只能返回菜單endl;return;/*刪除用戶進程*/
14、void DelPro(void)system(cls);PrintProList(); /先打印用戶進程列表int select;cout (1) 刪除指定進程.endl;cout (2) 刪除所有進程.endl;coutselect)if(select=1 | select=2)break;cout錯誤!endl;coutendl;if(select=1) /刪除指定用戶進程int pid;coutpid;bool flag=false; /標記是否找到編號為pid 的進程PROCESS* p1=ProLinkHead;PROCESS* p2=ProLinkHead-next;while(
15、p2)if(p2-GetpID()!=pid)p1=p1-next;p2=p2-next;elseflag=true;p1-next=p2-next;delete p2; /釋放pid 進程對象占用的空間break;if(flag)ProCnt-;for(int i=0;iMM_SIZE;i+) /釋放被pid 進程占用的內存塊if(MMi=pid)MMi=0;UsedNum-;FreeNum+;cout刪除成功!endl;elsecout刪除失敗! 編號為PID 的進程不存在!next;while(p)PROCESS* tmp=p;p=p-next;delete tmp;ProLinkHead-next=0;for(int i=0;i0)MMi=0;UsedNum-;FreeNum+;c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 佛山統一租房合同范例
- 保險醫療合同范例
- 醫療行業師德師風培訓計劃
- 包工建筑施工合同標準文本
- 加拿大航空合同樣本
- 四年級上冊數學期中測試計劃
- 醫美運營合同標準文本
- 賣場合作合同樣本
- 語文課外興趣小組活動計劃
- 一年級閱讀障礙干預計劃
- 2024綠色工業園區評價通則
- Pep 新版小學英語六年級下冊一般過去時復習課教案
- 082023年青島西海岸新區中考自主招生化學模擬題
- 2024年3月濟南市2024屆高三模擬考試(一模)英語試卷(含答案)
- 第五章 TIA博途軟件及使用
- 全國廣播電視技術能手調頻與電視廣播組題庫
- 2023年江蘇省常州市統招專升本管理學自考真題(含答案)
- 新人教版八下英語過去式過去分詞表格
- cimatron紫藤教程系列gpp2由零開始
- 公安機關業務技術用房建設標準
- CAT3606 中文說明書-3600基礎
評論
0/150
提交評論