![C語言基本分頁存儲管理_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/95790232-2bed-46c6-b0c1-40263f31da83/95790232-2bed-46c6-b0c1-40263f31da831.gif)
![C語言基本分頁存儲管理_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/95790232-2bed-46c6-b0c1-40263f31da83/95790232-2bed-46c6-b0c1-40263f31da832.gif)
![C語言基本分頁存儲管理_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/95790232-2bed-46c6-b0c1-40263f31da83/95790232-2bed-46c6-b0c1-40263f31da833.gif)
![C語言基本分頁存儲管理_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/95790232-2bed-46c6-b0c1-40263f31da83/95790232-2bed-46c6-b0c1-40263f31da834.gif)
![C語言基本分頁存儲管理_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/95790232-2bed-46c6-b0c1-40263f31da83/95790232-2bed-46c6-b0c1-40263f31da835.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、操作系統(tǒng)實驗報告姓名:盧一一 學號:201607010209 學校:清華大學 專業(yè):計算機科學與技術 班級:2008級2班基本分頁存儲管理實驗目的連續(xù)內存分配方式會形成許多“碎片”,雖然可以通過“緊湊”方法將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。如果允許將一個進程直接分散地裝入到許多不相鄰接的分區(qū)中,則無需再進行“緊湊”?;谶@一思想而產生了離散分配方式。如果離散分配的基本單位是頁,則稱為分頁存儲管理方式;如果離散分配的基本單位是段,則稱為分段存儲管理方式。在分頁存儲管理方式中,如果不具備頁面兌換功能,則稱為基本的分頁存儲管理方式,或稱為純分頁存儲管理方式,它不具備支持虛擬存儲器
2、的功能,它要求把每個作業(yè)全部裝入內存后方能運行。本實驗通過程序模擬操作系統(tǒng)的基本分頁存儲管理方式,進一步理解這一內存分配方式的原理和特點,加深對理論知識的掌握。實驗要求1、用C語言或Java語言編寫程序模擬操作系統(tǒng)對內存的基本分頁存儲管理方式2、程序要能正確對“內存”進行“分配”和“回收”,能接受用戶的輸入,顯示內存的分配情況,并有一定的容錯能力。3、每個人獨立按時完成實驗內容。實驗內容本實驗假定內存空間已經按塊劃分,目標程序無需關心內存塊大小等底層細節(jié),只需按算法對內存塊進行分配即可。程序應該實現以下功能:1、內存初始化。假定內存塊共有N個,初始化后的內存空間應該有一部分已經被使用,這可以用
3、隨機數或程序內部的其他算法完成。2、程序應該能接受用戶輸入的進程信息,并為之分配內存,返回分配結果(成功或失敗),注意,此處應該考慮到不合法的輸入并進行相應處理。3、程序能回收用戶指定的進程所占用的內存空間,因此,程序可能需要為每個進程分配一個唯一的進程號并給出詳細的提示信息。4、能直觀合理地顯示內存分配情況。5、程序界面友好,便于操作和查看運行結果。實驗結果實驗總結基本分頁的思想是比較簡單的,而且實驗前老師已經給出了一種可行的數據結構來存儲程序中需要用到的數據,因此這個實驗在構思上是沒有多少難度的。由于程序中主要使用的是數組,操作起來比較方便,不像前兩個實驗需要用到大量的鏈表操作。在這次試驗
4、中,我主要遇到了以下一些問題:1、程序剛寫完時,記錄“內存”中的進程數的變量和當前剩余總內存的變量的值不正確,經檢查后發(fā)現是在結束進程時沒有同時更新這些數據。2、內存使用情況應該以哪種形式輸出以及輸出哪些信息。最終我選擇了盡可能詳細地輸出有用信息,通過空格、空行、對齊等手段盡力使輸出格式簡潔美觀。比如,在輸出每個進程的內存使用情況時,首先輸出該進程占用的總內存,然后以統(tǒng)一的對齊方式依次輸出各個內存塊編號。當然,對于不同的模塊輸出的信息也應該不一樣,比如,內存初始化結束后應該輸出哪個內存塊被占用了,否則無法判斷后續(xù)的內存分配是否正確,但在以后查看內存使用情況時則不必把所有已占用的內存塊輸出,因為
5、每個進程都會單獨把自己占用的內存塊顯示出來。為了達到這種效果,我使用了一個全局變量作為判斷依據,詳細情況見附錄中代碼。3、程序的容錯性。這是一個容易被忽略的問題。這個程序起初基本沒考慮這個問題,但在后來的調試過程中,逐漸加上了一些基本的容錯功能,比如用戶在結束某進程時,其輸入的進程號可能根本不存在,這時應該給出用戶出錯提示,并要求用戶重新輸入,但這里用了一個編程中不太推薦的方式:goto 語句。總體而言,這次實驗還是比較順利的,沒有遇到什么特別難解決的問題。通過自己編程模擬內存分配,我不僅加深了對這種內存管理方式的理解,也增強了C語言的編程能力。通過這幾次的實驗,我感覺手工寫一個幾百行的程序不
6、像以前那么困難了。附錄#include <stdio.h>#include <windows.h>#define N 100 / 共有100個內存塊int processNN+1; / 存放每個進程的頁表int blockN; / 內存塊狀態(tài)標志數組,0:空閑,1:使用int blockCount; / 記錄當前內存剩余空間int processCount; / 記錄當前進程數bool flag = true;void init();void output();bool createProcess();bool endProcess();void init()int i
7、, j;/ 初始化內存狀態(tài)標志數組for (i=0; i<N; i+)blocki = 0;for (i=0; i<20; i+)blockrand()%(N-1) = 1;blockCount = 0;for (i=0; i<N; i+)if (blocki = 0)blockCount+;/ 初始化存放進程的數組for (i=0; i<N; i+)processi0 = 0;for (j=1; j<N; j+)processij = -1;processCount = 0;printf("初始化結果如下:");output();flag =
8、 false;void output()printf("n內存總量:%d 塊, 已用空間:%d 塊, 剩余空間:%d 塊, 進程總數:%d 個n", N, N-blockCount, blockCount, processCount);if (flag && blockCount < N)printf("已使用的內存塊(%d):n", N-blockCount);for (int k=0,count=0; k<N; k+)if (blockk = 1)printf("%2d ", k, +count);if
9、 (count = 15)putchar('n');count = 0;putchar('n');/ 輸出各進程占用內存詳細情況if (processCount > 0)printf("內存詳細使用情況如下:n");for (int i=0; i<N; i+)if (processi0 > 0)printf("進程號:%d n占用內存塊(%2d):", i, processi0);for (int j=1,count=0; j<=processi0; j+)printf("%2d &quo
10、t;, processij, count+);if (count = 15)putchar('n');printf(" ");count = 0;putchar('n');elseprintf("當前內存無進程!n");/*/ 輸出空閑內存塊if (blockCount > 0)printf("空閑內存塊(%d):n", blockCount);for (int k=0,count=0; k<N; k+)if (blockk = 0)printf("%2d ", k, +
11、count);if (count = 15)putchar('n');count = 0;putchar('n');*/putchar('n');bool createProcess()int pid, pages, k = 0;loop:printf("請輸入進程號(小于%d)和所需頁面數:", N);scanf("%d%d", &pid, &pages);if (pid > 99)printf("錯誤!進程號過大!n");goto loop;if (pages
12、> blockCount)return false;blockCount -= pages;processpid0 = pages;for (int i=1; i<=pages; i+) while (blockk=1 && k<100)k+;processpidi = k;blockk = 1;k+;processCount+;return true;bool endProcess()int pid, pages;if (processCount < 1)printf("當前內存沒有進程!nn");return false;prin
13、tf("當前內存中的進程有 %d 個, 進程號為:", processCount);for (int i=0; i<N; i+)if (processi0 > 0)printf("%2d ", i);putchar('n');printf("請輸入您要結束的進程號(小于%d):", N);scanf("%d", &pid);pages = processpid0;if (pages = 0)printf("對不起!該進程不存在!n");return false
14、;for (int j=1; j<pages; j+)blockprocesspidj = 0;processpidj = -1;processpid0 = 0;processCount-;blockCount += pages;return true;void menu()int choice;while (true)printf("操作菜單:n");printf(" 1 -> 創(chuàng)建進程n 2 -> 結束進程n 3 -> 查看內存n 0 -> 退出程序n");printf("請輸入您要進行的操作:");scanf("%d", &choice);switch (choice)case 1: if (createProcess() printf("創(chuàng)建新進程成功!nn");elseprintf("抱歉!內存空間不足,創(chuàng)建新
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025嶺南文化創(chuàng)意產業(yè)園項目啟動儀式籌辦服務合同協(xié)議書
- 2025含破碎錘挖掘機買賣合同書
- 2025咖啡粉批發(fā)合同
- 2025金屬制品委托加工合同
- 2023三年級英語上冊 Unit 5 Let's eat The first period第一課時說課稿 人教PEP
- 5 應對自然災害(說課稿)2023-2024學年統(tǒng)編版道德與法治六年級下冊
- 保母阿姨合同范例
- 人用工合同范例
- 上海檢測合同范例
- 金屬防水材料施工方案
- 神經外科課件:神經外科急重癥
- 頸復康腰痛寧產品知識課件
- 2024年低壓電工證理論考試題庫及答案
- 微電網市場調查研究報告
- 《民航服務溝通技巧》教案第14課民航服務人員上行溝通的技巧
- MT/T 538-1996煤鉆桿
- 小學六年級語文閱讀理解100篇(及答案)
- CB/T 467-1995法蘭青銅閘閥
- 氣功修煉十奧妙
- 勾股定理的歷史與證明課件
- 中醫(yī)診斷學八綱辨證課件
評論
0/150
提交評論