C語言基本分頁存儲管理_第1頁
C語言基本分頁存儲管理_第2頁
C語言基本分頁存儲管理_第3頁
C語言基本分頁存儲管理_第4頁
C語言基本分頁存儲管理_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)實驗報告姓名:盧一一 學(xué)號:201607010209 學(xué)校:清華大學(xué) 專業(yè):計算機科學(xué)與技術(shù) 班級:2008級2班基本分頁存儲管理實驗?zāi)康倪B續(xù)內(nèi)存分配方式會形成許多“碎片”,雖然可以通過“緊湊”方法將許多碎片拼接成可用的大塊空間,但須為之付出很大開銷。如果允許將一個進程直接分散地裝入到許多不相鄰接的分區(qū)中,則無需再進行“緊湊”。基于這一思想而產(chǎn)生了離散分配方式。如果離散分配的基本單位是頁,則稱為分頁存儲管理方式;如果離散分配的基本單位是段,則稱為分段存儲管理方式。在分頁存儲管理方式中,如果不具備頁面兌換功能,則稱為基本的分頁存儲管理方式,或稱為純分頁存儲管理方式,它不具備支持虛擬存儲器

2、的功能,它要求把每個作業(yè)全部裝入內(nèi)存后方能運行。本實驗通過程序模擬操作系統(tǒng)的基本分頁存儲管理方式,進一步理解這一內(nèi)存分配方式的原理和特點,加深對理論知識的掌握。實驗要求1、用C語言或Java語言編寫程序模擬操作系統(tǒng)對內(nèi)存的基本分頁存儲管理方式2、程序要能正確對“內(nèi)存”進行“分配”和“回收”,能接受用戶的輸入,顯示內(nèi)存的分配情況,并有一定的容錯能力。3、每個人獨立按時完成實驗內(nèi)容。實驗內(nèi)容本實驗假定內(nèi)存空間已經(jīng)按塊劃分,目標(biāo)程序無需關(guān)心內(nèi)存塊大小等底層細節(jié),只需按算法對內(nèi)存塊進行分配即可。程序應(yīng)該實現(xiàn)以下功能:1、內(nèi)存初始化。假定內(nèi)存塊共有N個,初始化后的內(nèi)存空間應(yīng)該有一部分已經(jīng)被使用,這可以用

3、隨機數(shù)或程序內(nèi)部的其他算法完成。2、程序應(yīng)該能接受用戶輸入的進程信息,并為之分配內(nèi)存,返回分配結(jié)果(成功或失?。?,注意,此處應(yīng)該考慮到不合法的輸入并進行相應(yīng)處理。3、程序能回收用戶指定的進程所占用的內(nèi)存空間,因此,程序可能需要為每個進程分配一個唯一的進程號并給出詳細的提示信息。4、能直觀合理地顯示內(nèi)存分配情況。5、程序界面友好,便于操作和查看運行結(jié)果。實驗結(jié)果實驗總結(jié)基本分頁的思想是比較簡單的,而且實驗前老師已經(jīng)給出了一種可行的數(shù)據(jù)結(jié)構(gòu)來存儲程序中需要用到的數(shù)據(jù),因此這個實驗在構(gòu)思上是沒有多少難度的。由于程序中主要使用的是數(shù)組,操作起來比較方便,不像前兩個實驗需要用到大量的鏈表操作。在這次試驗

4、中,我主要遇到了以下一些問題:1、程序剛寫完時,記錄“內(nèi)存”中的進程數(shù)的變量和當(dāng)前剩余總內(nèi)存的變量的值不正確,經(jīng)檢查后發(fā)現(xiàn)是在結(jié)束進程時沒有同時更新這些數(shù)據(jù)。2、內(nèi)存使用情況應(yīng)該以哪種形式輸出以及輸出哪些信息。最終我選擇了盡可能詳細地輸出有用信息,通過空格、空行、對齊等手段盡力使輸出格式簡潔美觀。比如,在輸出每個進程的內(nèi)存使用情況時,首先輸出該進程占用的總內(nèi)存,然后以統(tǒng)一的對齊方式依次輸出各個內(nèi)存塊編號。當(dāng)然,對于不同的模塊輸出的信息也應(yīng)該不一樣,比如,內(nèi)存初始化結(jié)束后應(yīng)該輸出哪個內(nèi)存塊被占用了,否則無法判斷后續(xù)的內(nèi)存分配是否正確,但在以后查看內(nèi)存使用情況時則不必把所有已占用的內(nèi)存塊輸出,因為

5、每個進程都會單獨把自己占用的內(nèi)存塊顯示出來。為了達到這種效果,我使用了一個全局變量作為判斷依據(jù),詳細情況見附錄中代碼。3、程序的容錯性。這是一個容易被忽略的問題。這個程序起初基本沒考慮這個問題,但在后來的調(diào)試過程中,逐漸加上了一些基本的容錯功能,比如用戶在結(jié)束某進程時,其輸入的進程號可能根本不存在,這時應(yīng)該給出用戶出錯提示,并要求用戶重新輸入,但這里用了一個編程中不太推薦的方式:goto 語句。總體而言,這次實驗還是比較順利的,沒有遇到什么特別難解決的問題。通過自己編程模擬內(nèi)存分配,我不僅加深了對這種內(nèi)存管理方式的理解,也增強了C語言的編程能力。通過這幾次的實驗,我感覺手工寫一個幾百行的程序不

6、像以前那么困難了。附錄#include <stdio.h>#include <windows.h>#define N 100 / 共有100個內(nèi)存塊int processNN+1; / 存放每個進程的頁表int blockN; / 內(nèi)存塊狀態(tài)標(biāo)志數(shù)組,0:空閑,1:使用int blockCount; / 記錄當(dāng)前內(nèi)存剩余空間int processCount; / 記錄當(dāng)前進程數(shù)bool flag = true;void init();void output();bool createProcess();bool endProcess();void init()int i

7、, j;/ 初始化內(nèi)存狀態(tài)標(biāo)志數(shù)組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+;/ 初始化存放進程的數(shù)組for (i=0; i<N; i+)processi0 = 0;for (j=1; j<N; j+)processij = -1;processCount = 0;printf("初始化結(jié)果如下:");output();flag =

8、 false;void output()printf("n內(nèi)存總量:%d 塊, 已用空間:%d 塊, 剩余空間:%d 塊, 進程總數(shù):%d 個n", N, N-blockCount, blockCount, processCount);if (flag && blockCount < N)printf("已使用的內(nèi)存塊(%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');/ 輸出各進程占用內(nèi)存詳細情況if (processCount > 0)printf("內(nèi)存詳細使用情況如下:n");for (int i=0; i<N; i+)if (processi0 > 0)printf("進程號:%d n占用內(nèi)存塊(%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("當(dāng)前內(nèi)存無進程!n");/*/ 輸出空閑內(nèi)存塊if (blockCount > 0)printf("空閑內(nèi)存塊(%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)和所需頁面數(shù):", 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("當(dāng)前內(nèi)存沒有進程!nn");return false;prin

13、tf("當(dāng)前內(nèi)存中的進程有 %d 個, 進程號為:", processCount);for (int i=0; i<N; i+)if (processi0 > 0)printf("%2d ", i);putchar('n');printf("請輸入您要結(jié)束的進程號(小于%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 -> 結(jié)束進程n 3 -> 查看內(nèi)存n 0 -> 退出程序n");printf("請輸入您要進行的操作:");scanf("%d", &choice);switch (choice)case 1: if (createProcess() printf("創(chuàng)建新進程成功!nn");elseprintf("抱歉!內(nèi)存空間不足,創(chuàng)

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論