第一篇:操作系統課程設計
引言
操作系統是計算機科學與技術專業的主要專業基礎課和主干課。操作系統對計算機系統資源實施管理,是所有其他軟件與計算機硬件的唯一接口,所有用戶在使用計算機時都要得到操作系統提供的服務。
通過模擬操作系統的全部或者部分功能的實現,加深對操作系統工作原理和操作系統實現方法的理解,達到練習編程的目的,提高學生運用理論知識分析問題、解決問題的能力,為學生從事科學研究和獨立負擔計算機及其應用方面的工作打好扎實的基礎。
0 河北大學工商學院2011級操作系統課程設計論文(設計)課程設計任務及要求
2.1 設計任務
模擬采用多道程序設計方法的單用戶操作系統,該操作系統包括進程管理、存儲管理、設備管理、文件管理和用戶接口四部分。
本部分要求實現文件的邏輯結構、文件的物理結構、目錄結構、磁盤分配和回收、文件的保護和用戶接口。
2.2 實現方法和原理
2.2.1文件的邏輯結構:
文件的邏輯結構采用流式結構; 文件均采用文本文件;
系統中有兩種文件,一種是存放任意字符的文件,一種是可執行文件。可執行文件的內容就是模擬系統內進程的程序體。
文件中要有一種特定命令的“可執行”文件,文件中的命令非常簡單,包括: x=?;
給x賦值一位數 x++;
x加1 x--;
x減1!??;
第一個?為A,B,C中某個設備,第二個?為一位數,表示使用設備的時間(由于沒有實際設備,所以無法知道設備何時工作完成,所以假定一個數,這個數隨著系統時間增加而遞減,減到0時,認為是設備工作完成);
end.表示文件結束,同時將結果寫入文件out,其中包括文件路徑名和x的值。2.2.2 磁盤模擬:
用一個文件disk模擬磁盤,磁盤的每個盤塊64字節,模擬磁盤共有128塊。第0、1塊存放文件分配表,第2塊存放根目錄,其余存放子目錄和文件。2.2.3目錄結構
目錄結構采用樹型目錄結構,目錄項內容共十六個字節。①目錄項內容(8個字節): 目錄名、文件名:3個字節;
河北大學工商學院2011級操作系統課程設計論文(設計)
擴展名:1個字節(可執行文件擴展名為e,目錄沒有擴展名); 目錄、文件屬性:1字節; 起始盤塊號:1個字節;
文件長度:2字節(目錄沒有長度)。②根目錄
根目錄位置固定,為磁盤第2塊,大小固定,共8項,占用模擬磁盤第2塊; ③子目錄
位置不固定,大小不固定。2.2.4磁盤分配
磁盤的分配采用鏈接結構(顯式鏈接)的分配方式。系統采用文件分配表方式記錄磁盤空間的使用情況和鏈接結構的指針。
因為磁盤有占用磁盤由128塊,所以文件分配表中一項需要1字節,而磁盤由128塊,因而需要128項,所以模擬磁盤空間中的第0、1塊被用來存放文件分配表。2.2.5用戶接口
用戶接口提供用戶命令接口,要求實現以下命令: 創建文件:create 拷貝文件:copy 刪除文件:delete 移動文件:move 顯示文件:type 編輯文件:edit 改變文件屬性:change 磁盤格式化命令 format 建立目錄:makdir 改變目錄路徑:chadir
刪除空目錄:rdir 刪除目錄:deldir(既可刪除空目錄又可刪除非空目錄)
河北大學工商學院2011級操作系統課程設計論文(設計)
磁盤分區命令:fdisk 運行可執行文件:可執行文件的文件名(可創建進程)。
上述命令在實際系統中都是需要建立進程才可以實現的,這里由于模擬系統的能力達不到,所以除運行可執行文件需要建立進程外,其他指令執行不必在模擬系統中建立進程,可直接執行。
注意打開文件表。2.2.6屏幕顯示
如圖所示,屏幕顯示要求包括:
用戶命令接口,用于系統運行時用戶輸入命令; 磁盤目錄顯示,要求顯示磁盤的樹型目錄結構;
磁盤使用情況,顯示磁盤每一個磁盤塊的空間是占用還是空閑。
3程序設計與實現
3.1目錄結構的實現
3.1.1創建目錄
#region CreateMenu(建立目錄)
public void CreateMenu(string pathname,string harddisk)3.1.2刪除空目錄
刪除空目錄首先要找到該目錄,如果目錄不存在,執行指令失敗;如果存在,但是根 河北大學工商學院2011級操作系統課程設計論文(設計)
目錄或非空目錄顯示不能刪除,操作失?。蝗羰欠强兆幽夸洠瑒t刪除器目錄項并回收對應空間。刪除空目錄的過程和刪除文件的過程相似。
3.1.3刪除目錄
#region DeleteMenu(刪除目錄)
public void DeleteMenu(string pathname, string harddisk)
{
if(Search(pathname,harddisk)== 1)
{
MessageBox.Show(“文件路徑不正確!”, “注意”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);3.2文件 3.2.1創建文件
#region CreateFile(建立文件)public void CreateFile(string pathname, byte attribute, byte address, char length, string harddisk){
if(attribute == 3 || attribute == 5){
MessageBox.Show(“只讀性質,建立失?。 ? “注意”, MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
return;} 3.2.2拷貝文件
#region CopyFile(復制文件,只復制FCB)
public void CopyFile(string pathname1, string pathname2, string harddisk)
{
string[] pnames = pathname1.Split(new char[] { '', '.' });
string halfpathname = pathname1.Remove(pathname1.Length1]);
UTF8Encoding utf = new UTF8Encoding();4 河北大學工商學院2011級操作系統課程設計論文(設計)
byte[] name = utf.GetBytes(pnames[pnames.Length1];
CreateFile(pathname2, buffer.Attribute, buffer.Address, buffer.Length,harddisk);
}
#endregion 3.2.3刪除文件 #region DeleteFile(刪除文件)
public void DeleteFile(string pathname, string harddisk)
{
if(Search(pathname,harddisk)==1)
{
MessageBox.Show(“文件路徑不正確!”, “注意”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
else if(Search(pathname,harddisk)== 2)
//文件存在 {
string[] pnames = pathname.Split(new char[] { '', '.' });
string halfpathname = pathname.Remove(pathname.Length2]);
int disknum;
if(pnames.Length == 3)
//c:aaa.t
{
disknum = 3;
}
else
{
disknum = Search(halfpathname,harddisk);
}
int item = FindItem(disknum, name, attribute,harddisk)[0];
int address = FindItem(disknum, name, attribute,harddisk)[1];
byte addr = Convert.ToByte(address);
DeleteFCB(disknum, item,harddisk);
//刪除FCB
if(addr==0)
{
return;3.2.4移動文件
#region CutFile(移動文件)
public void CutFile(string pathname1, string pathname2, string harddisk)
{
CopyFile(pathname1, pathname2,harddisk);//復制FCB到新目錄下
string[] pnames = pathname1.Split(new char[] { '', '.' });
string halfpathname = pathname1.Remove(pathname1.Length1]);
UTF8Encoding utf = new UTF8Encoding();6 河北大學工商學院2011級操作系統課程設計論文(設計)
byte[] name = utf.GetBytes(pnames[pnames.Length1)+ 8 *(Itemnumber-1), SeekOrigin.Begin);
Disk.Write(buffer.Name, 0, buffer.Name.Length);
Disk.Seek(0, SeekOrigin.Current);
Disk.WriteByte(buffer.Type);
Disk.Seek(0, SeekOrigin.Current);
Disk.WriteByte(buffer.Attribute);
Disk.Seek(0, SeekOrigin.Current);
Disk.WriteByte(buffer.Address);7 河北大學工商學院2011級操作系統課程設計論文(設計)
Disk.Seek(0, SeekOrigin.Current);
Disk.WriteByte(Convert.ToByte(buffer.Length));
}
Disk.Close();
}
#endregion
3.2.7顯示文件
#region ReadFile(讀文件畫節點)
public void ReadFile(TreeView treeView, ContextMenuStrip contextMenuStrip,ImageList imageList)
{
treeView.Nodes.Clear();
//刪除集合中所有樹節點
//重新添加樹節點
treeView.ImageList = imageList;
TreeNode root = new TreeNode(“計算機”, 0, 0);
TreeNode node_C = new TreeNode(“本地磁盤C”, 4, 4);
TreeNode node_D = new TreeNode(“本地磁盤D”, 4, 4);
node_C.ContextMenuStrip = contextMenuStrip;
node_D.ContextMenuStrip = contextMenuStrip;
treeView.Nodes.Add(root);
root.Nodes.Add(node_C);
root.Nodes.Add(node_D);
DrawTree(node_C, 3,“disk1.txt”,contextMenuStrip);
DrawTree(node_D, 3, “disk2.txt”,contextMenuStrip);
treeView.ExpandAll();
}
#endregion
4.程序運行部分截圖
4.1主頁面 河北大學工商學院2011級操作系統課程設計論文(設計)
4.2創建文件
4.3編輯文件河北大學工商學院2011級操作系統課程設計論文(設計)
4.4創建目錄 總結
在此系統我主要模擬的是文件部分。通過編寫此系統,采用了c#語言。但是,在實現此系統中,一方面因為我對c#這門語言掌握的不是很熟練,另外一方面,對操作系統理解的不夠深入以至于部分功能沒有實現,讓我發現了自己的不足,從而要在以后的學習中更加努力,不短提高自己個方面的能力。
河北大學工商學院2011級操作系統課程設計論文(設計)
裝
訂
第二篇:操作系統課程設計
湖北民族學院信息工程學院11級計算機專業操作系統課程設計
(操作系統課程設計)
連續動態分區內存
管理模擬實現
學生姓名: 韓 慧 學生學號: 031140312 班 級: 031140--3 0311401、02、03、04班制
二〇一三年十二月 湖北民族學院信息工程學院11級計算機專業操作系統課程設計
目錄
《操作系統》課程設計.......................................................1 引言......................................................................3 課程設計目的和內容......................................................3 需求分析.........................................................................3 概要設計...................................................................3 開發環境........................................................................4 系統分析設計.....................................................................4 有關了解內存管理的相關理論..................................................4 內存管理概念........................................................................4 內存管理的必要性..............................................................4 內存的物理組織.............................................................4 什么是虛擬內存.................................................................5 連續動態分區內存管理方式...................................................5 單一連續分配(單個分區)...................................................5
固定分區存儲管理...............................................................5 可變分區存儲管理(動態分區)..............................................5 可重定位分區存儲管理........................................................5 問題描述和分析....................................................................6 程序流程圖........................................................................6 數據結構體分析..................................................................8 主要程序代碼分析...............................................................9 分析并實現四種內存分配算法.................................................11 最先適應算.....................................................................11 下次適應分配算法..........................................................13 最優適應算法...............................................................16 最壞適應算法...............................................................18 回收內存算法................................................................20 調試與操作說明.................................................................22
初始界面.......................................................................22 模擬內存分配...............................................................23
已分配分區說明表面............................................................24 空閑區說明表界面.............................................................24 回收內存界面.....................................................................25 重新申請內存界面..........................................................26.總結與體會......................................................................28 湖北民族學院信息工程學院11級計算機專業操作系統課程設計
參考文獻.........................................................................28
引言
操作系統是最重要的系統軟件,同時也是最活躍的學科之一。我們通過操作系統可以理解計算機系統的資源如何組織,操作系統如何有效地管理這些系統資源,用戶如何通過操作系統與計算機系統打交道。
存儲器是計算機系統的重要組成部分,近年來,存儲器容量雖然一直在不斷擴大,但仍不能滿足現代軟件發展的需要,因此,存儲器仍然是一種寶貴而又緊俏的資源。如何對它加以有效的管理,不僅直接影響到存儲器的利用率,而且還對系統性能有重大影響。而動態分區分配屬于連續分配的一種方式,它至今仍在內存分配方式中占有一席之地。
課程設計目的和內容:
理解內存管理的相關理論,掌握連續動態分區內存管理的理論;通過對實際問題的編程實現,獲得實際應用和編程能力。
編寫程序實現連續動態分區內存管理方式,該程序管理一塊虛擬內存,實現內存分配和回收功能。分析并實現四種內存分配算法,即最先適應算法,下次最先適應算法,最優適應算法,最壞適應算法。內存分配算法和回收算法的實現。
需求分析
動態分區分配是根據進程的實際需要,動態地為之分配內存空間。在實現動態分區分配時,將涉及到分區分配中所用的數據結構、分區分配算法和分區的分配和回收操作這樣三個問題。常用的數據結構有動態分區表和動態分區鏈。在對數據結構有一定掌握程度的情況下設計合理的數據結構來描述存儲空間,實現分區存儲管理的內存分配功能,應該選擇最合適的適應算法(首次適應算法,最佳適應算法,最后適應算法,最壞適應算法),在動態分區存儲管理方式中主要實現內存分配和內存回收算法,在這些存儲管理中間必然會有碎片的產生,當碎片產生時,進行碎片的拼接等相關的內容
概要設計
本程序采用機構化模塊化的設計方法,共分為四大模塊。⑴最先適應算法實現
從空閑分區表的第一個表目起查找該表,把最先能夠滿足要求的空閑區分配給作業,這種方法目的在于減少查找時間。為適應這種算法,空閑分區表(空閑區鏈)中的空閑分區要按地址由低到高進行排序。該算法優先使用低址部分空閑區,在低址空間造成許多小的空閑區,在高地址空間保留大的空閑區。⑵下次適應分配算法實現 湖北民族學院信息工程學院11級計算機專業操作系統課程設計
該算法是最先適應算法的變種。在分配內存空間時,不再每次從表頭(鏈首)開始查找,而是從上次找到空閑區的下一個空閑開始查找,直到找到第一個能滿足要求的的空閑區為止,并從中劃出一塊與請求大小相等的內存空間分配給作業。該算法能使內存中的空閑區分布得較均勻。⑶最優適應算法實現
它從全部空閑區中找出能滿足作業要求的、且大小最小的空閑分區,這種方法能使碎片盡量小。為適應此算法,空閑分區表(空閑區鏈)中的空閑分區要按從小到大進行排序,自表頭開始查找到第一個滿足要求的自由分區分配。⑷最壞算法實現
最壞適應分配算法要掃描整個空閑分區或鏈表,總是挑選一個最大的空閑分區分割給作業使用。該算法要求將所有的空閑分區按其容量從大到小的順序形成一空閑分區鏈,查找時只要看第一個分區能否滿足作業要求。
開發環境:
win7 下 VC++6.0 系統分析設計:
相關算法原理,算法流程圖,涉及的數據結構內容都相應包含在各章節中
有關了解內存管理的相關理論
內存管理概念:
內存管理,是指軟件運行時對計算機內存資源的分配和使用的技術。其最主要的目的是如何高效,快速的分配,并且在適當的時候釋放和回收內存資源。內存不是預先劃分好的,而是在系統運行的過程中建立分區.當作業裝入主存時,根據作業所需要的主存容量查看是否有足夠的主存空間,若有則按需要分割一個分區給該作業;否則令該作業等待.分區長度不固定分區個數不固定。這種存儲管理的方法克服了固定分區嚴重浪費主存的問題,提高了主存資源的利用率。
內存管理的必要性:
內存管理對于編寫出高效率的 Windows 程序是非常重要的,這是因為Windows 是多任務系統,它的內存管理和單任務的 DOS 相比有很大的差異。DOS是單任務操作系統,應用程序分配到內存后,如果它不主動釋放,系統是不會對它作任何改變的;但 Windows 卻不然,它在同一時刻可能有多個應用程序共享內存,有時為了使某個任務更好地執行,Windows 系統可能會對其它任務分配的內存進行移動,甚至刪除。因此,我們在 Windows 應用程序中使用內存時,要遵循Windows 內存管理的一些約定,以盡量提高 Windows 內存的利用率。湖北民族學院信息工程學院11級計算機專業操作系統課程設計
1.3 內存的物理組織:
物理地址:
把內存分成若干個大小相等的存儲單元,每個存儲單元占 8 位,稱作字節(byte)。每個單元給一個編號,這個編號稱為物理地址(內存地址、絕對地址、實地址)。
二、物理地址空間: 物理地址的集合稱為物理地址空間(主存地址空間),它是一個一維空間。
什么是虛擬內存:
虛擬內存是內存管理技術的一個極其實用的創新。它是一段程序(由操作系統調度),持續監控著所有物理內存中的代碼段、數據段,并保證他們在運行中的效率以及可靠性,對于每個用戶層(user-level)的進程分配一段虛擬內存空間。當進程建立時,不需要在物理內存件之間搬移數據,數據儲存于磁盤內的虛擬內存空間,也不需要為該進程去配置主內存空間,只有當該進程被被調用的時候才會被加載到主內存。
連續動態分區內存管理方式的實現
在早期的操作系統中,主存分配廣泛采用連續分配方式。連續分配方式,是指為一個用戶程序分配一個連續的內存空間,該連續內存空間指的的是物理內存。下面介紹連續分配的四種方式。
單一連續分配(單個分區)
最簡單的存儲管理方式,用于多道程序設計技術之前。內存分為系統區和用戶區,系統區由操作系統使用。用戶區作為一個連續的分區分配給一個作業。分區存儲管理是滿足多道程序設計的最簡單的一種存儲管理方法,它允許多 4個用戶程序同時存在系統內存中,即共享內存空間。按分區劃分方式可分為固定分區和可變分區。
固定分區存儲管理
把內存的用戶區預先劃分成多個分區,每個分區大小可以相同,也可以不同。(分區的劃分由計算機的操作員或者由操作系統給出,并給出主存分配表)分區個數固定,分區的大小固定。一個分區中可裝入一個作業,作業執行過程中不會改變存放區域。早期的 IBM 的 OS/MFT(具有固定任務數的多道程序系統)采用了這種固定分區的方法。
可變分區存儲管理(動態分區)
內存不是預先劃分好的,而是在系統運行的過程中建立分區.當作業裝入主存時,根據作業所需要的主存容量查看是否有足夠的主存空間,若有則按需要分割一個分區給該作業;否則令該作業等待。分區長度不固定分區個數不固定。這種存儲管理的方法克服了固定分區嚴重浪費主存的問題,提高了主存資源的利用率。IBM操作系統OS/MVT采用可變分區存儲管理。湖北民族學院信息工程學院11級計算機專業操作系統課程設計
可重定位分區存儲管理
解決碎片問題的一種簡單方法是采用可重定位分區分配.。其中心思想是,把不同程序,且在內存中地址不連續的想法讓他們連續。
例:內存中現有 3 個空閑區,現有一作業到達,要求獲得 30k 內存空間,沒有分區滿足容量要求,若想把作業裝入,可將內存中所有作業進行移動,這樣把原來分散的空閑區匯集成一個大的空閑區。將內存中的作業進行移動使它們連接在一起把原來分散的多個小分區拼接成一個大的空閑區.這個過程稱為”緊湊”或”移動”。需解決的問題:每次”緊湊”后程序或數據裝入的物理地址變化采用動態重定位。
問題描述和分析
系統應利用某種分配算法,從空閑分區鏈表中找到所需大小的分區,如果空閑分區大小大于請求分區大小,則從該分區中按改請求的大小劃分出一塊內存空間大小劃分出一塊內存空間分配出去,余下的部分仍留在空閑鏈表中。然后,將分配區的首址返回給調用者。
當進程運行完畢師范內存時,系統根據回收區的首址,從空閑區中找到相應的插入點,此時可能出現以下四種情況之一:
⑴該空閑區的上下兩相鄰分區都是空閑區:將三個空閑區合并為一個空閑區。新空閑區的起始地址為上空閑區的起始地址,大小為三個空閑區之和??臻e區合并后,取消可用表或自由鏈中下空閑區的表目項或鏈指針,修改上空閑區的對應項。
⑵該空閑區的上相鄰區是空閑區:將釋放區與上空閑區合并為一個空閑區,其起始地址為上空閑區的起始地址,大小為上空閑區與釋放區之和。合并后,修改上空閑區對應的可用表的表目項或自由鏈指針。
⑶該空閑區的下相鄰區是空閑區:將釋放區與下空閑區合并,并將釋放區的起始地址作為合并區的起始地址。合并區的長度為釋放區與下空閑區之和。同理,合并后修改可用表或自由鏈中相應的表目項或鏈指針。
⑷兩相鄰區都不是空閑區:釋放區作為一個新空閑可用區插入可用表或自由鏈。
程序流程圖
內存分配流程圖,如圖
湖北民族學院信息工程學院11級計算機專業操作系統課程設計
從頭開始查表檢索完否?NY返回分區大小>所需大小N繼續檢索下一個表項Y分區大小-所需大小<=不可再分割大小N從該分區中劃出所需大小的新分區Y將該分區從鏈中移出將該分區分配給請求者修改有關數據結構返回
內存回收流程圖,如圖
湖北民族學院信息工程學院11級計算機專業操作系統課程設計
開始判斷空閑區上下內存情況上為空下為空上下都為空上下都不為空將上面的空閑區合并,并回收將下面的空閑區合并,并回收將上下的空閑區合并,并回收直接將其回收結束 數據結構體分析
⑴進程屬性結構體 typedef struct readyque { char name[10];int size;}readyque,*readyqueue;⑵空閑鏈表結構體 typedef struct idlyspace { int from;int size;idlyspace * next;}idlyspace,*idly;⑶已分配鏈表結構體 typedef struct busyspace { int from;readyque r;湖北民族學院信息工程學院11級計算機專業操作系統課程設計
busyspace * next;}busyspace,*busy
主要程序代碼分析
⑴主函數//代碼請添加適當的注釋。int main(){ Is=(idly)malloc(sizeof(idlyspace));Is->from=0;Is->size=256;Is->next=NULL;Is2=Is;Bs=(busy)malloc(sizeof(busyspace));Bs->next=NULL;int t,t1;printf(“n.......................歡迎來到動態分區存儲管理系統..................nn”);printf(“...........................請選擇要執行的算法:...........................n”);printf(“.........................1.最先適應算法
...............................n”);printf(“.........................2.下次適應算法............................n”);printf(“..........................3.最優適應算法
...............................n”);printf(“.........................4.最壞適應算法................................n”);printf(“........................................................................n”);printf(“請輸入您的選擇:”);scanf(“%d”,&t);int i;while(i!=5){
printf(“........................................................................n”);
printf(“.........................操作菜單如下:(請選擇).......................n”);
printf(“..........................1.輸入進程分配空間...........................n”);
printf(“.........................2.進程撤銷回收空間...........................n”);
printf(“.........................3.輸出所有空閑分區
..........................n”);
printf(“..........................4.輸出所有已分配分區..........................n”);
printf(“..........................5.退
出..........................n”);
printf(“........................................................................n”);
scanf(“%d”,&i);
switch(i)
{
case 1:
switch(t)
{
case 1:
t1=FF();湖北民族學院信息工程學院11級計算機專業操作系統課程設計
break;
case 2:
t1=NF();
break;
case 3:
t1=BF();
break;
case 4:
t1=WF();
break;
default:
printf(“選擇算法錯誤n”);
return 1;
}
if(t1)
printf(“分配空間成功n”);
else
printf(“分配空間失敗n”);
break;
case 2:
t1=recover();
if(t1)
printf(“回收成功n”);
else
printf(“回收失敗n”);
break;
case 3:
Isprint();
break;
case 4:
Bsprint();
break;
} } return 0;}
第三章 :分析并實現四種內存分配算法
最先適應算法
空閑區按地址從小到大的次序排列。
分配:當進程申請大小為 SIZE 的內存時,系統順序查找空閑區表(鏈),直到找到容量滿足要求(≥SIZE)的空閑區為止。從該空閑區中劃出大小為 SIZE的分區分配給進程,余下的部分仍作為一個空閑區,但要修改其首址和大小。湖北民族學院信息工程學院11級計算機專業操作系統課程設計
優點:這種算法是盡可能地利用低地址部分的空閑區,而盡量地保證高地址 6部分的大空閑區,有利于大作業的裝入。
缺點:主存低地址和高地址分區利用不均衡。在低地址部分集中了許多非常小的空閑區碎片降低了主存的利用率。最先適應算法 int FF(){ int t=0;readyque D;printf““請輸入進程名:””);scanf““%””,D.name);
printf““輸入進程申請空間大小:””);scanf““%””,&D.size);
idly l=Is;int mt=256;busy b=Bs;idly min=NULL;while(l)
//尋找空閑表中大小滿足申請進程所需大小并且起址最小的空閑結點
{
if(D.size<=l->size)
{
if(l->from { mt=l->from;min=l;t=1; } } l=l->next;} if(mt!=256) { busy j; j=(busy)malloc(sizeof(busyspace)); //如果找到則為進程分配空間 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 j->from=min->from; for(int i=0;i<10;i++) { j->r.name[i]=D.name[i]; } j->r.size=D.size; while(b->next) { if(b->next->from b=b->next;else break; } j->next=b->next; b->next=j; min->from=min->from+D.size; min->size=min->size-D.size;} return t;} 下次適應分配算法 最先適應算法的變種。 總是從空閑區上次掃描結束處順序查找空閑區表(鏈),直到找到第一個滿足容量要求的空閑區為止,分割一部分給作業,剩余部分仍作為空閑區。下次適應分配算法 int NF(){ int t=0;readyque D;printf““請輸入進程名:””);scanf““%””,D.name); 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 printf““輸入進程申請空間大小:””);scanf““%””,&D.size); int mt=256;idly l=Is2;idly min=NULL;busy b=Bs;while(l)//尋找空閑表中大小滿足申請進程所需大小并且起址最小的空閑結點 { if(D.size<=l->size) { if(l->from { mt=l->from;min=l;t=1; } } l=l->next;} if(mt!=256) { busy j; j=(busy)malloc(sizeof(busyspace)); j->from=min->from; for(int i=0;i<10;i++) { j->r.name[i]=D.name[i]; } j->r.size=D.size; while(b->next) { if(b->next->from b=b->next;else break; //如果找到則為進程分配空間 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 } //將申請空間進程插入到已分配鏈表中 j->next=b->next; b->next=j; //修改相應空閑節點的起址和大小 min->from=min->from+D.size; min->size=min->size-D.size; Is2=min->next; 結點 t=1; return t;} l=Is;//l指向空閑表的頭 while(l!=Is2) { if(D.size<=l->size) { if(l->from { mt=l->from;min=l;t=1; } } l=l->next;} if(mt!=256){ busy j; j=(busy)malloc(sizeof(busyspace)); j->from=min->from; for(int i=0;i<10;i++) { //ls2指向修改結點的下一個 //循環查找 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 j->r.name[i]=D.name[i]; } j->r.size=D.size; while(b->next) { if(b->next->from b=b->next;else break; } j->next=b->next; b->next=j; min->from=min->from+D.size; min->size=min->size-D.size; Is2=min->next; t=1; return t;} return t;} 最優適應算法 空閑區按容量遞增的次序排列。 分配:當進程申請存儲空間,系統順序查找空閑區表(鏈),直到找到第一個滿足容量要求的空閑區為止。采用最優適應算法選中的空閑區是滿足容量要求的最小空閑區。優點:選中的空閑區是滿足容量要求的最小空閑區,而不致于毀掉較大的空閑區。 缺點:空閑區的大小一般與申請分區大小不相等,因此將其一分為二,留下來的空閑區一般情況下是很小的,以致無法使用。隨著時間的推移,系統中的小空閑區會越來越多,從而造成存儲空間的浪費。最優適應算法 int BF(){ int t=0;湖北民族學院信息工程學院11級計算機專業操作系統課程設計 readyque D;printf““請輸入進程名:””);scanf““%””,D.name); printf““輸入進程申請空間大小:””);scanf““%””,&D.size); idly l=Is;idly min=NULL;int mt=256;busy b=Bs;while(l)//在空閑鏈中尋找第一個大于所輸入的進程大小的空閑塊 { if(D.size<=l->size) { if(l->size { mt=l->size;min=l;t=1; } } l=l->next;} if(mt!=256) { busy j; j=(busy)malloc(sizeof(busyspace));空間 j->from=min->from; //申請分配用于存放進程的內存 //找到第一個滿足要求的空閑塊 //將第一個滿足要求的空閑塊(min)的首地址賦給j for(int i=0;i<10;i++) { j->r.name[i]=D.name[i];16 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 } j->r.size=D.size; while(b->next) //按從小到大的順序查找新進程在已分配區中的位置 { if(b->next->from b=b->next;else break; } j->next=b->next; b->next=j; min->from=min->from+D.size; min->size=min->size-D.size; } return t;} 最壞適應算法 為了克服最佳適應算法把空閑區切割得太小的缺點,人們提出了一種最壞適應算法,即每次分配時,總是將最大的空閑區切去一部分分配給請求者,剩余的部分仍是一個較大的空閑區。避免了空閑區越分越小的問題。要求空閑區按容量遞減的順序排列。 分配:進程申請存儲區時,檢查空閑區表(鏈)的第一個空閑區的大小是否滿足要求,若不滿足則令進程等待;若滿足則從該空閑區中分配一部分存儲區給用戶,剩下的部分仍作為空閑區。最壞適應算法 int WF(){ int t=0;readyque D;printf““請輸入進程名:””);scanf““%””,D.name); printf““輸入進程申請空間大小:””); //將所輸入的進程插入進程鏈 //改變該空閑塊的起始地址 //改變該空閑塊的剩余大小 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 scanf““%””,&D.size); //輸入進程申請的空間大小 idly l=Is;//l指向空閑鏈表ls頭 idly min=NULL;int mt=0;busy b=Bs; //b指向已分配鏈表Bs頭 //找到空閑分區中大小滿足進程的請求且尺寸最大的結點 while(l){ if(D.size<=l->size)//判斷進程所申請的大小是否小于空閑區的各結點大小 { if(l->size>mt) { mt=l->size;min=l;//min指向空閑區中尺寸最大的結點 t=1; } } l=l->next;} if(mt!=0)點 { busy j; j=(busy)malloc(sizeof(busyspace)); j->from=min->from; for(int i=0;i<10;i++) { j->r.name[i]=D.name[i]; } j->r.size=D.size; //判斷是否找到了空閑區的滿足結 //l指向空閑鏈表下一個結點 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 while(b->next)置 //尋找插入到已分配鏈表中的位 { if(b->next->from b=b->next;else break; } //把此進程結點j插入到已分配鏈表中 j->next=b->next; b->next=j; //修改空閑鏈表的相應結點的參數 min->from=min->from+D.size; min->size=min->size-D.size;} return t;} 可變分區的回收 當某個進程釋放某存儲區時,系統首先檢查釋放區是否與系統中的空閑區相鄰若相鄰則把釋放區合并到相鄰的空閑區去,否則把釋放區作為一個空閑區插入到空閑表的適當位置。 釋放區與空閑區相鄰的四種情況。 (1)釋放區與前空閑區相鄰:把釋放區與前空閑區合并到一個空閑區。其首址仍為前空閑區首址,大小為釋放區大小與空閑區大小之和。 (2)釋放區與后空閑區相鄰:則把釋放區合并到后空閑區,其首地址為釋放區首地址,大小為二者之和。 (3)釋放區與前后兩空閑區相鄰:這三個區合為一個空閑區,首地址為前空閑區首址,大小為這三個空閑區之和,并取消后空閑區表目。 (4)釋放區不與任何空閑區相鄰:將釋放區作為一個空閑區,將其大小和首址插入到空閑區表的適當位置。 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 回收內存算法 int recover(){ readyque D;printf““請輸入想要回收的進程名””); scanf““%””,D.name); busy b=Bs;idly l=Is;while(b->next)鏈表中 { bool yo=1; for(int i=0;i<10;i++) { if(b->next->r.name[i]==D.name[i])yo=yo*1; else yo=0; } //如果在已分配鏈表中則釋放該結點所占空間 if(yo) { int t=b->next->from; int ts=b->next->r.size; //查找輸入的進程名是否在已分配湖北民族學院信息工程學院11級計算機專業操作系統課程設計 while(l) { if(l->from>t+ts)不鄰接 { idly tl;tl=(idly)malloc(sizeof(idlyspace));tl->from=t;tl->size=ts;tl->next=l;Is=tl;break;} if(l->from==t+ts) l->from=t; l->size=l->size+ts; busy tb=b->next; b->next=b->next->next; free(tb); return 1;} if(l->from+l->size idly tl; tl=(idly)malloc(sizeof(idlyspace)); tl->from=t; tl->size=ts; tl->next=l->next; l->next=tl; break;} else if(l->from+l->size==t) //所回收進程與空閑結點上鄰接 { //所回收進程與空閑結點上下都不鄰接 //所回收進程與空閑結點下鄰接 { //所回收進程與空閑結點上下都 21 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 l->size=l->size+ts; if(l->from+l->size==l->next->from)接 { l->size=l->size+l->next->size; idly tm=l->next; l->next=l->next->next; freI); } br l=l->next; } //從已分配鏈表中釋放所回收進程 busy tb=b->next; b->next=b->next->next; free(tb); return 1; } b=b->next;} printf(“沒找到這”進程n”);return 0;} //所回收進程與空閑結點上下都鄰調試與操作說明 初始界面 程序初始界面,有四個塊選擇,選擇要執行的算法,調試以最壞算法為例,如圖 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 選擇最壞適應算法,如圖 模擬內存分配 給進程a分配內存20,如圖 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 已分配分區說明表界面 同理,給進程b分配內存30,給進程c分配內存40,給進程d分配50,給進程e分配60,如圖 空閑分區說明表界面 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 查看空閑分區,如圖 回收內存界面 回收進程b和d所占內存,如圖 已分配分區說明表和空閑分區說明表 如圖 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 重新申請內存界面 再為新進程i分配內存30,如圖 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 根據最壞適應算法結合圖所示可知,該算法將會從空閑分區表中選擇一塊最大的內存空間分配給進程i,從圖也可看出該模擬算法實現了最壞適應算法 湖北民族學院信息工程學院11級計算機專業操作系統課程設計 總結與體會 本次做的課題是動態分區分配算法實現,此次課程設計成功實現了內存分配和內存回收,內存分配中包含了四種算法,分別是首次適應算法,循環首次適應算法,最佳適應算法和最壞適應算法。經編碼調試,表明該程序模塊是有效可行的。 通過這門課程的學習讓我充分了解了內存管理的機制實現,從而更深一步的的對計算機 有了很多了解,這對于以后我們的研究和學習計算機系統起到了很重要的作用。 對于本次論文制作,自己的編程能力有所提高,對操作系統內存分配,存儲空間的回收都有全新的認識。 在這次操作系統課程設計中,我使用了c++編寫系統軟件,對os中可變分區存儲管理有了深刻的理解,但是過程中遇到了很多困難,一邊做一邊學,對c++有了比較多的理解。 實驗中遇到很多問題,浪費了很多時間,總而言之是自己學習還不夠好,不扎實,希望在以后學習中加以改善,學到更多知識。 參考文獻 【1】 湯子瀛,哲鳳屏,湯小丹.計算機操作系統.西安:西安電子科技大學出版社,2001.。湖北民族學院信息工程學院11級計算機專業操作系統課程設計 【2】 任愛華.操作系統實用教程.北京:清華大學出版社,2001。 長春理工大學 軟件學院 0813111班 27號 姓名:丁為勝 一. 概述 1、課程設計目的及任務課程設計地點及要求 每個學生一臺微機,需要安裝windows98或windows2000操作系統,配備VC、VB、java或C編程語言,每個學生上機時間不少于24個小時。 操作系統是計算機專業的核心專業課,“操作系統課程設計”是理解和鞏固操作系統基本理論、原理和方法的重要的實踐環節。 操作系統課程主要講述的內容是多道操作系統的原理與技術,與其它計算機原理、編譯原理、匯編語言、計算機網絡、程序設計等專業課程關系十分密切。本課程設計的目的綜合應用學生所學知識,建立系統和完整的計算機系統概念,理解和鞏固操作系統基本理論、原理和方法,掌握操作系統基本理論與管理方式。在算法基礎上,解決實際的管理功能的問題,提高學生實際應用、編程的能力。 主要任務是實現操作系統和相關系統軟件的設計,其中涉及進程創建,同步,進程間的通信,存儲管理,文件系統等操作系統概念。 2.課程設計地點及要求 每個學生一臺微機,需要安裝windows98或windows2000操作系統,配備VC、VB、java或C編程語言,每個學生上機時間不少于24個小時。 3.課程設計的內容 設計二: 設計任務: 掌握進程的管道通訊機制和信號量同步互斥機制。1. 進程的管道通訊 編制一個程序,程序中創建一個子進程。然后父子進程各自獨立運行,父進程不斷地在標準輸入設備上讀入小寫字母,寫入管道。子進程不斷地從管道中讀取字符,轉換為大寫字母后輸出到標準輸出設備上。當讀到x時,結束。 2. 信號量實現的同步互斥機制 編制一個程序,程序中創建5個子進程,代表五位哲學家,然后父進程結束。使用信號量機制解決哲學家進餐問題。當哲學家進餐時,屏幕輸出: [進程號] eating!當哲學家思考時,屏幕輸出: [進程號] thinging!相關的系統調用和函數:pipe();write();read();semget();sepop();semctl();要求:查找并閱讀上述系統調用的相關資料,將上述相關的函數封裝為P()、V()操作,使用你封裝的P()、V()操作實現5位哲學家的同步和互斥。 二. 設計的基本概念和原理 1.進程的管道通訊 管道(Pipe)實際是用于進程間通信的一段共享內存,創建管道的進程稱為管道服務器,連接到一個管道的進程為管道客戶機。命名管道(Named Pipes)是在管道服務器和一臺或多臺管道客戶機之間進行單向或雙向通信的一種命名的管道。一個命名管道的所有實例共享同一個管道名,但是每一個實例均擁有獨立的緩存與句柄,并且為客戶——服務通信提供有一個分離的管道。實例的使用保證了多個管道客戶能夠在同一時間使用同一個命名管道。 2.信號量實現的同步互斥機制 規定奇數號的哲學家先拿起他左邊的筷子,然后再去拿他右邊的筷子;而偶數號 的哲學家則相反.按此規定,將是1,2號哲學家競爭1號筷子,3,4號哲學家競爭3號筷子.即 五個哲學家都競爭奇數號筷子,獲得后,再去競爭偶數號筷子,最后總會有一個哲學家能獲 得兩支筷子而進餐。而申請不到的哲學家進入阻塞等待隊列,根FIFO原則,則先申請的哲 學家會較先可以吃飯,因此不會出現餓死的哲學家。 三. 總體設計 1.實現的方法和主要技術路線 1.無名管道 無名管道用于具有親緣關系的父子進程,子子進程之間的通訊。它的實現函數有 int pipe(int fd[2]); //fd[2] 為描述符數組,包含一個讀描述符與一個寫描述符,在使用管道通信時,關閉某些不需要的讀或寫描述符,建立起單向的讀或寫管道,然后用read 和write 像操作文件一樣去操作它即可。 如圖便是進程1 到進程2 的一個讀管道。 分別在父進程和父子進程里向管道寫數據,然后在子進程和子子進程里讀數據。2.哲學家進餐偽碼: semaphore chopstick[5]={1,1,1,1,1};void philosopher(int i){ while(true){ think(); if(i%2 == 0)//偶數哲學家,先右后左。 { wait(chopstick[ i + 1 ] mod 5);wait(chopstick[ i]);eat(); signal(chopstick[ i + 1 ] mod 5);signal(chopstick[ i]);} Else //奇數哲學家,先左后右。 { wait(chopstick[ i]); wait(chopstick[ i + 1 ] mod 5);eat(); signal(chopstick[ i]); signal(chopstick[ i + 1 ] mod 5);} } 四. 詳細設計 進程的管道通信代碼: import java.io.IOException;import java.io.PipedReader; public class ReceiverThread1 extends Thread { PipedReader pipedReader; public ReceiverThread1(SenderThread1 sender)throws IOException { pipedReader=new PipedReader(sender.getPipedWriter()); } public void run() { char[] ch=new char[100];StringBuffer sb=null;String str=null;int i=0;try { while((i=pipedReader.read(ch))!=-1) { sb=new StringBuffer(); for(int j=0;j { sb.append(ch[j]); } str=sb.toString(); System.out.println(“子進程讀取的字符為:”+str.toUpperCase()); if(!str.endsWith(“x”)) { System.out.print(“父進程讀入字符為:”); }else if(str.endsWith(“x”)) { System.out.println(“結束無法再次輸入字符”); } } } catch(IOException e){ e.printStackTrace();}finally{ try { pipedReader.close(); } catch(IOException e){ e.printStackTrace(); } } } } import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PipedWriter; public class SenderThread1 extends Thread { PipedWriter pipedWriter; public SenderThread1(){ pipedWriter=new PipedWriter();} public PipedWriter getPipedWriter(){ return pipedWriter;} public void run() { BufferedReader ir=new BufferedReader(new InputStreamReader(System.in));char[] ch=new char[100];StringBuffer sb=null;String str=null;int i=0;System.out.print(“父進程讀入字符為:”);try { while((i=ir.read(ch))!=-1) { sb=new StringBuffer(); for(int j=0;j { if(ch[j]>='a' && ch[j]<='z') { sb.append(ch[j]); if(ch[j]=='x') { break; } } } str=sb.toString(); pipedWriter.write(str); if(str.startsWith(“x”)||str.endsWith(“x”)) { break; // this.stop(); } } } catch(IOException e){ e.printStackTrace();}finally{ try { ir.close(); pipedWriter.close(); } catch(IOException e){ e.printStackTrace(); } } } } public class ThreadComm1 { public static void main(String[] args)throws Exception{ SenderThread1 sender=new SenderThread1();ReceiverThread1 receiver=new ReceiverThread1(sender);sender.start();receiver.start();} } 哲學家進餐問題代碼: #include “stdafx.h” using namespace std;bool chop[100];//定義筷子 class ph { protected: bool * left,* right;//哲學家的左右手指向的筷子 int eattime;//哲學家的吃飯時間 public: bool check()//用于檢查哲學家左右手的筷子是不是被占用 { if(*left && *right) return true; else return false;} void eat(int ineattime)//哲學家開始進餐 { eattime=ineattime; *left=false; *right=false;} bool finish()//檢查哲學家是否完成進餐 { if(eattime>0)//沒完成的話剩余時間減少 { eattime--; if(eattime==0)//完成的話歸還筷子 { *left=true; *right=true; return true; } else return false; } else return false;} void init(int num,int max)//初始化哲學家,指定他們使用的筷子 { eattime=0; left=&chop[num]; if(num right=&chop[num+1]; else right=&chop[0];} };void main(){ system(“title 哲學家進餐問題”);int in,i,temp,time,j=1;queue for(int i=0;i<5;i++){ chop[i]=1; } for(int i=0;i<5;i++){ P[i].init(i,5);} cout<<“輸入哲學家進餐隊列:”< break;else if(in>5) { cout<<“一共只有”<<5<<“個人!”< } else { Q.push(in-1); } } cout<<“每個人吃飯時間:”< P[temp].eat(time); cout< if(temp+2>5) cout<<1< else cout< Q.push(temp);} for(i=0;i<5;i++) { if(P[i].finish()) cout< } //Q.push(-1); for(i=0;i { temp=Q.front(); Q.pop(); //if(temp!=-1) { cout< Q.push(temp); } //else { // Q.pop(); break; } } } for(int j=0;j第三篇:操作系統課程設計