




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、三種存儲管理方式的地址換算摘要:操作系統(Operating System,OS)是方便用戶、管理和控制計算機軟硬件資源的系統軟件(或程序集合)。從用戶角度看,操作系統可以看成是對計算機硬件的擴充;從人機交互方式來看,操作系統是用戶與機器的接口;從計算機的系統結構看,操作系統是一種層次、模塊結構的程序集合,屬于有序分層法,是無序模塊的有序層次調用。操作系統在設計方面體現了計算機技術和管理技術的結合。操作系統是系統軟件的核心,、它控制程序的執行和提供資源分配、調度、輸入/輸出控制和數據管理等任務。如DOS、UNIX、OS/2和Windows NT都是得到廣泛使用的操作的系統。 三種管理方式中,分
2、頁系統能有效地提高內存利用率,分段系統則能很好地滿足用戶需要,而段頁式系統則是把前兩種結合起來形成的系統。這種新系統既具有分段系統的便于實現、分段可共享、易于保護、可動態鏈接等一系列優點,有能像分頁系統那樣很好地解決內存的外部碎片問題,以及可為各個分段離散地分配內存等問題。關鍵字:分頁方式,分段方式,段頁式方式,操作系統。1. 引言:分頁存儲管理是將一個進程的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁。在分段存儲管理方式中,作業的地址空間被劃分為若干個段,每個段定義了一組邏輯信息。段的長度由相應的邏輯信息組的長度決定,因而個段長度不等。段頁式存儲管理方式是分段和分頁原理的結合,即先將用戶
3、程序分成若干個段,再把每個段分成若干個頁,并為每一個段賦予一個段名。三種存儲管理都有其相應的段表、頁表和地址變換機構。2三種存儲管理方式地址換算描述: (1)分頁存儲管理方式為了實現從進程的邏輯地址到物理地址的變換功能,在系統中設置了頁表寄存器,用于存放頁表在內存中的始址和頁表的長度。當進程要訪問某個邏輯地址中的數據時,分頁地址變換機構會自動地將有效地址(相對地址)分為頁號和頁內地址兩部分,再以頁號為索引去檢索頁表。查找操作由硬件執行。在執行檢索之前,先將頁號與頁表長度進行比較,如果頁號大于或等于頁表長度,則表示本次所訪問的地址已超越進程的地址空間。于是,這一錯誤將被系統發現并產生一地址越界中
4、斷。若未出現越界錯誤,則將頁表始址與頁號和頁表項長度的乘積相加,便得到該表項在頁表中的位置,于是可從中得到該頁的物理塊號,將之裝入物理地址寄存器中。與此同時,再將有效地址寄存器中的頁內地址送入物理地址寄存器的塊內地址字段中。這樣便完成了從邏輯地址到物理地址的變換。(2)分段存儲管理方式為了實現從進程的邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器,用于存放段表始址和段表長度TL。在進行地址變換時,系統將邏輯地址中的段號與段表長度TL進行比較。若S>TL,表示段號太大,是訪問越界,于是產生越界中斷信號;若未越界,則根據段表的始址和該段的段號,計算出該段對應段表項的位置,從中讀出該段
5、在內存的起始地址,然后,再檢查段內地址d是否超過該段的段長SL。若超過,即d>SL,同樣發出越界中斷信號;若未越界,則將該段的基址與段內地址d相加,即可得到要訪問的內存物理地址。(3)段頁存儲管理方式在段頁式系統中,為了便于實現地址變換,需配置一個段表寄存器,其中存放段表始址和段表長TL。進行地址變換時,首先利用段號S,將它與段表長TL進行比較。若S>TL,表示未越界,于是利用段表始址和段號來球出該段所對應的段表項在段表中的位置,從中得到該段的頁表始址,并利用邏輯地址中的段內頁號P來獲得對應表的頁表項位置,從中讀出該頁所在的物理塊號b,再利用塊號b和頁內地址來構成物理地址。3程序模
6、塊:#include <stdlib.h> #include <stdio.h>int settable1(int n,int k);/創建頁表 int printTable1(int n,int k);/顯示頁表 int transt(int n,int k,int add);/分頁地址換算 int defSect(int n,int *t);/創建段表 int printSect(int n);/輸出段表內容 int transSect(int n,int s,int d);/進行分段地址換算函數 int setSectTable(int n,int k);/創建段
7、頁式內容 int printSectTable(int n,int k);/顯示段頁內容 int transSectPage(int n,int k,int s1,int s2,int s3);/段頁式地址換算 /定義頁表結構體 typedef struct stable int y1;/頁號 int y2;/塊號 stable; struct stable setst512; /建立段表的結構體 typedef struct setsect int d1;/段號 int d2;/段長 int d3;/基址 setsect; struct setsect sets512;/定義段表的總長度 /
8、建立段頁式內的頁表的結構體 typedef struct table int dy1;/頁號 int dy2;/塊號 table; /建立段頁式的結構體 typedef struct setAll struct table c1512;/定義段內頁表的結構體 int c2;/段號 int c3;/段長 int c4;/起始地址 setAll; struct setAll set512;/定義段頁式的總長度 4三種存儲管理方式的地址變換機構(1) 分頁系統的地址變換機構頁表始址頁表長度>頁號(3)頁內地址1b頁表物理地址邏輯地址L越界中斷頁表寄存器頁號塊號0123 (2) 分段系統的地址變
9、換機構段號S位移量W段表始址段表長度>2100越界有效地址段號段長基址0123物理地址(3) 段頁式系統中的地址變換機構段表始址段表長度段表寄存器>段超長頁號P段號S頁內地址0123段表長度頁表始址0123b塊號b塊內地址頁表段表5結束語:為期二周的操作系統課程設計很快就結束了,做為每個學期末的一項必修課,課程設計的目的就是要讓我們能夠更加深刻的理解課堂上所學的知識,并能夠將它們應用到實踐中去,讓知識能為實踐服務。這次操作系統的課程設計,我是通過編程演示三種存儲管理方式的地址換算過程。通過這次課程設計,加深了我對課堂上所學的三種存儲管理方式的地址換算的概念的理解,了解了操作系統的工
10、作原理已經平時遇到的一些狀況是怎么樣產生的,通過這次操作系統的課程設計,另我學到了很多在課堂上學不到的知識,以及動手能力,這次課程設計老師不限開發工具,因此也鍛煉了我們對新的開發工具的掌握能力。對于我們計算機專業的學生來說,在軟件更新如此之快的今天,對新的開發工具的快速掌握能力也是一項必不可少的能力。當然,在這次課程設計中,也暴露出來了一些問題,就是我對開發工具的使用,雖然大學三年基本是用C編寫程序比較多,但是還是感到了力不從心的感覺,就是自己對一些C函數庫的了解不夠,導致自己在用的時候走了很多彎路,這也從間接讓我了解了許多平時學習不到的知識。課程設計不僅能鍛煉我們把知識應用于實踐的能力,還鍛
11、煉了我們思維的邏輯性。編寫一個BUG盡可能少的程序,需要考慮很多方面的問題,包括給別人試用,這就鍛煉了我們邏輯思維的能力,為今后走上工作崗位打下了堅實的基礎。6參考文獻:計算機操作系統 西安電子科技大學出版社C語言程序設計教程 機械工業出版社附:三種存儲管理方式地址換算程序清單如下:#include <stdlib.h> #include <stdio.h>int settable1(int n,int k);/創建頁表 int printTable1(int n,int k);/顯示頁表 int transt(int n,int k,int add);/分頁地址換算
12、int defSect(int n,int *t);/創建段表 int printSect(int n);/輸出段表內容 int transSect(int n,int s,int d);/進行分段地址換算函數 int setSectTable(int n,int k);/創建段頁式內容 int printSectTable(int n,int k);/顯示段頁內容 int transSectPage(int n,int k,int s1,int s2,int s3);/段頁式地址換算 /定義頁表結構體 typedef struct stable int y1;/頁號 int y2;/塊號 s
13、table; struct stable setst512; /建立段表的結構體 typedef struct setsect int d1;/段號 int d2;/段長 int d3;/基址 setsect; struct setsect sets512;/定義段表的總長度 /建立段頁式內的頁表的結構體 typedef struct table int dy1;/頁號 int dy2;/塊號 table; /建立段頁式的結構體 typedef struct setAll struct table c1512;/定義段內頁表的結構體 int c2;/段號 int c3;/段長 int c4;/
14、起始地址 setAll; struct setAll set512;/定義段頁式的總長度 int main() int choice1,choice2; int truth=0,truth1; int jobAddr;/進程的邏輯地址空間 int md;/頁面大小 int addr1;/輸入的邏輯地址 int dc;/定義段表的長度 int dh,sAddr;/定義段表的邏輯地址的段號和段內地址 int dyc;/段頁式的段表長度 int jobs,jobt,joba;/段頁式邏輯段號、段內頁號、頁內地址 do printf(" 組員:符小平 崔健 王菲菲 王天渤n");
15、printf("-操作系統課程設計題目:分頁、分段、段頁式地址換算-nn"); printf(" 總菜單n"); printf(" 1.分頁方式n"); printf(" 2.分段方式n"); printf(" 3.段頁式n"); printf(" 4.結束nn"); printf("-n"); printf("請輸入您的選擇:n"); scanf("%d",&choice1); switch(choice1
16、) case 1:/分頁方式 do printf(" 分頁方式n"); printf("-n"); printf(" 1.隨機生成進程大小n"); printf(" 2.進程創建頁表n"); printf(" 3.顯示頁表的信息n"); printf(" 4.地址換算n"); printf(" 5.退出n"); printf("-nn"); printf("請輸入您的選擇:"); scanf("%d&quo
17、t;,&choice2); switch(choice2) case 1: printf(" 隨機生成一個進程(大小在1024K至2048K)n"); printf("-n"); do jobAddr=rand()%2048;/隨機產生進程的邏輯地址空間 while(jobAddr<1024); printf("該進程的邏輯地址空間是:%d(K)n",jobAddr); printf("頁面的大小:"); scanf("%d",&md); truth=1; printf(&
18、quot;-n"); break; case 2: if(truth=1) printf("n 進程創建的頁表n"); printf("-nn"); settable1(jobAddr,md); truth1=1; printf("nn-n"); else printf("nn-n"); printf("n還沒有創建進程.請先選擇1創建進程.nn"); printf("nn-n"); break; break; case 3: if(truth=1) if(trut
19、h1=1) printf("n 顯示進程創建的頁表n"); printf("-nn"); printTable1(jobAddr,md); printf("nn-n"); else printf("nn-n"); printf("n還沒有創建頁表.請先選擇2創建頁表.nn"); printf("nn-n"); break; else printf("nn-n"); printf("n還沒有創建進程.請先選擇1創建進程.nn"); pri
20、ntf("nn-n"); break; break; case 4: if(truth=1) if(truth1=1) printf("n 地址換算n"); printf("-nn"); printf("請你輸入要進行換算的邏輯地址(K):"); scanf("%d",&addr1); if(addr1>jobAddr) do printf("輸入的邏輯地址大于進程地址空間,請重新輸入邏輯地址(K):"); scanf("%d",&a
21、ddr1); while(addr1>jobAddr); transt(jobAddr,md,addr1); printf("nn-n"); else printf("nn-n"); printf("n還沒有創建頁表.請先選擇2創建頁表.nn"); printf("nn-n"); break; else printf("nn-n"); printf("n還沒有創建進程.請先選擇1創建進程.nn"); printf("nn-n"); break; br
22、eak; case 5: printf("-nn"); printf("退出分頁方式地址換算選項,進入總菜單.n"); printf("-nn"); break; default: printf("-n"); printf("錯誤提示:你輸入的選擇有錯,請重新選擇!n"); printf("-n"); while (choice2!=5); break; case 2:/分段方式 do printf(" 分段方式地址換算n"); printf("
23、-n"); printf(" 1.創建段表n"); printf(" 2.顯示段表n"); printf(" 3.地址換算n"); printf(" 4.退出n"); printf("-nn"); printf("請輸入您的選擇:"); scanf("%d",&choice2); switch(choice2) case 1: printf(" 開始創建段表n"); printf("-n"); pr
24、intf("請輸入你要創建的段表長度(最大為512個):"); scanf("%d",&dc); defSect(dc,&truth); printf("-n"); break; case 2: if(truth=1) printf("n 顯示已經創建的段表內容n"); printf("-nn"); printSect(dc); printf("nn-n"); else printf("nn-n"); printf("n還沒有創建
25、段表.請先選擇1創建段表.nn"); printf("nn-n"); break; break; case 3: if(truth=1) printf(" 分段地址換算n"); printf("-n"); printf("請您輸入邏輯地址的段號,段內地址(K):"); scanf("%d,%d",&dh,&sAddr); transSect(dc,dh,sAddr); printf("-n"); else printf("-n")
26、; printf("n還沒有創建段表.請先選擇1創建段表.nn"); printf("-n"); break; break; case 4: printf("-nn"); printf("退出分段方式地址換算選項,進入總菜單.n"); printf("-nn"); break; default: printf("-n"); printf("錯誤提示:你輸入的選擇有錯,請重新選擇!n"); printf("-n"); while (cho
27、ice2!=4); break; case 3:/段頁式 do printf(" 段頁式地址換算n"); printf("-n"); printf(" 1.創建段頁式n"); printf(" 2.顯示段頁式結構n"); printf(" 3.地址換算n"); printf(" 4.退出n"); printf("-nn"); printf("請輸入您的選擇:"); scanf("%d",&choice2);
28、switch(choice2) case 1: printf(" 開始創建段頁式n"); printf("-n"); printf("請輸入你要創建的段表長度(最大為512個):"); scanf("%d",&dyc); printf("頁面的大小K:"); scanf("%d",&md); setSectTable(dyc,md); truth=1; printf("-n"); break; case 2: if(truth=1) pri
29、ntf("n 顯示段頁式結構n"); printf("-nn"); printSectTable(dyc,md); printf("nn-n"); else printf("nn-n"); printf("n還沒有創建段頁式.請先選擇1創建段頁式.nn"); printf("nn-n"); break; break; case 3: if(truth=1) printf(" 段頁式地址換算n"); printf("-n"); print
30、f("請輸入要查找的邏輯地址段號:"); scanf("%d",&jobs); printf("段內頁號:"); scanf("%d",&jobt); printf("頁內地址(K):"); scanf("%d",&joba); transSectPage(dyc,md,jobs,jobt,joba); printf("-n"); else printf("-n"); printf("n還沒有創建段表.
31、請先選擇1創建段頁式.nn"); printf("-n"); break; break; case 4: printf("-nn"); printf("退出段頁式地址換算選項,進入總菜單.n"); printf("-nn"); break; default: printf("-n"); printf("錯誤提示:你輸入的選擇有錯,請重新選擇!n"); printf("-n"); while (choice2!=4); break; case 4:
32、 printf("準備退出程序!n"); break; default: printf("-n"); printf("錯誤提示:你輸入的選擇有錯,請重新選擇!n"); printf("-n"); while (choice1!=4); return (0); /創建頁表 int settable1(int n,int k) int p;/頁號 int d;/剩余地址 int i; int block;/塊號 p=n/k;/求出邏輯地址空間總頁數 d=n%k;/求出該頁大小 block=1024*1024/k; /求
33、出最大塊號 for(i=0;i<p;i+) setsti.y1=i;/頁號 setsti.y2=rand()%block;/定義隨機產生的塊號在1到(1M內存/頁面大小)之間 printf("正在創建中···n"); if(d!=0) setstp.y1=p;/頁號 setstp.y2=rand()%block;/定義隨機產生的塊號在1到(1M內存/頁面大小)之間 printf("n頁表已經創建成功!"); return (0); /顯示頁表 int printTable1(int n,int k) int p; in
34、t d; int i; p=n/k;/求出總頁數 d=n%k;/求出該頁大小 printf(" 進程邏輯地址空間:%dK 頁面大小:%dKn",n,k); printf(" 頁表n"); if(d!=0) for(i=0;i<=p;i+) printf("頁號:%d->塊號:%dn",setsti.y1,setsti.y2); else for(i=0;i<p;i+) printf("頁號:%d->塊號:%dn",setsti.y1,setsti.y2); return (0); /分頁地址
35、換算 int transt(int n,int k,int add) int p1,d1; p1=add/k;/求出邏輯頁號 d1=add%k;/求出邏輯頁內地址 printf("n 分頁地址換算結果.n"); printf("-n"); printf("進程邏輯地址空間=%dKn",n); printf("頁面大小=%dKn",k); printf("給定的邏輯地址=%dKn",add); printf("頁號=%dn",p1); printf("塊號=%dn&q
36、uot;,setstp1.y2); printf("起始地址=%dKn",setstp1.y2*k); printf("頁內地址=%dKn",d1);printf("物理地址=(起始地址+頁內地址)=%dKn",setstp1.y2*k+d1);printf("n-n"); return (0); /創建段表 int defSect(int n,int *t) int i; printf("n 開始給各個段號分配段長和基址.n"); printf("-n"); for(i=0
37、;i<n;i+) setsi.d1=i; printf("定義第%d段的段長(K):",i); scanf("%d",&setsi.d2);/自己定義段長 (1050) setsi.d3=rand()%2048;/定義隨機產生基址為1到2048之間 *t=1; printf("n-n"); return (0); /輸出段表 int printSect(int n) int i; printf(" 段表n"); for(i=0;i<n;i+) printf("n"); pri
38、ntf("段號:%d->段長:%dK->起始地址:%dK",setsi.d1,setsi.d2,setsi.d3); return (0); /進行分段地址換算 int transSect(int n,int s,int d) int sum; printf(" 分段地址換算結果"); printf("n-n"); if(s<n)/段號與段表長度比較 if(d<=setss.d2)/段內地址與該段的段長比較 sum=setss.d3+d; printf("查找段號=%dn",s); prin
39、tf("該段段長=%dKn",setss.d2); printf("該段起始地址=%dKn",setss.d3); printf("分段地址中的段內地址=%dKn",d); printf("物理地址=(起始地址+段內地址)=%dKn",sum); else printf("輸入的段內地址超過該段的段長,訪問越界,產生越界中斷信號!n"); else printf("輸入的段號太大,訪問越界,產生越界中斷信號n!"); printf("-nn"); retu
40、rn (0); /創建段頁式內容 int setSectTable(int n,int k) int p,d; int i,j; int block; block=1024*1024*1024/k;/求出最大塊號 for(i=0;i<n;i+) seti.c2=i; printf("定義第%d段的段長(大于1024K,小于2048K):",i); scanf("%d",&seti.c3);/自己定義段長 p=seti.c3/k; d=seti.c3%k; seti.c4=rand()%1024;/定義隨機產生的起始地址在1到1024之間 f
41、or(j=0;j<p;j+) seti.c1j.dy1=j;/頁號 seti.c1j.dy2=rand()%block;/定義隨機產生的起始地址在1到(1G內存/頁面大小)之間 if(d!=0) seti.c1p.dy1=p;/頁號 seti.c1p.dy2=rand()%block;/定義隨機產生的起始地址在1到(1G內存/頁面大小)之間 return (0); /顯示段頁式內容 int printSectTable(int n,int k) int i,j; int s,p,d; printf(" 段表長度:%d 頁面大小:%dKn",n,k); printf(" 段頁式:"); for(i=0;i<n;i+)printf("n段號:%d->頁表大小:%dK->頁表起始地址:%dK->頁表n",i,seti.c3,seti.c4); s=seti.c3; p=s/k; d=s%k; /顯示段頁式結構的內容 if(d!=0) for(j=0;j<=p;j+) printf("頁號:%d->塊號:%dn",seti.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鐵路旅客運輸服務鐵路旅客運輸服務質量監管課件
- 鐵路的管理體制鐵道概論課件
- 鐵路市場營銷市場營銷發展的新趨勢課件
- 鐵路貨物運輸保險YourSiteHere83課件
- 鐵路信號與通信設備-接發列車工作-1738488352028
- 中醫文化課件培訓教材
- 權威二手房成交合同匯編
- 部分時間工作的合同
- 四川輕化工大學《應用分析化學》2023-2024學年第二學期期末試卷
- 江西省高安市吳有訓實驗校2025屆初三中考仿真模擬卷(一)數學試題含解析
- 《頸椎病的針灸治療》課件
- 醫美診所院感知識培訓課件
- 河北省氣象部門招聘筆試沖刺題2025
- 糖尿病患者飲食指導課件
- 倉庫規劃目標管理
- 【MOOC】宇宙簡史-南京大學 中國大學慕課MOOC答案
- 【MOOC】現代養殖設施與設備-河南牧業經濟學院 中國大學慕課MOOC答案
- 論文后期檢查報告范文
- 汽輪機課件完整版本
- 《電子商務數據分析》教學大綱
- 醫療面試自我介紹
評論
0/150
提交評論