東北大學軟體學院作業系統v實驗報告
課程編號:B080000070
《作業系統》實驗報告
姓名 |
學號 |
|||
班級 |
指導教師 |
|||
實驗名稱 |
《作業系統》實驗 |
|||
開設學期 |
2016-2017第二學期 |
|||
開設時間 |
第11周——第18周 |
|||
報告日期 |
2017年7月8日 |
|||
評定成績 |
評定人 |
|||
評定日期 |
東北大學軟體學院
實驗一 程序的同步與互斥
一、實驗目的
(1)加深對程序概念的理解,明確程序和程式的區別。
(2)進一步認識併發執行的實質。
(3)分析程序競爭資源現象,學習解決程序互斥的方法。
二、預習內容
預習程序同步有關理論,包括程序的基本操作和經典的程序同步與互斥問題。
三、實驗內容
1.生產者:規定生產總量,生產者一直等待消費者傳來的緩衝區資料已空的訊號,一旦接受到該訊號,生產者便進入關鍵程式碼段,進行生產資料活動,生產過後從關鍵程式碼段出來,發出訊號通知消費者取資料。
2.消費者:一直等待生產者傳來資料已經生產的訊號,一旦接收到該訊號,消費者便進入關鍵程式碼段,取資料,取完資料後離開關鍵程式碼段,發訊號通知生產者緩衝區已空,該進行資料生產。
四、流程圖
分析:本實驗要求利用PV操作實現解決生產者——消費者問題中的同步問 題。此問題描述的是一群生產者程序在生產產品並將這些產品提供給消費者程序去消費,在兩者之間設定了一個具有n個緩衝區的緩衝池,生產者程序將它所生產的產品放入一個緩衝區,消費者程序可從緩衝區中取走產品去消費,但它們之間必須保持同步,即不允許消費者程序到一個空緩衝區去取產品,也不允許生產者程序向一個已裝滿且尚未取出的緩衝區中投放產品,並且生產者消費者互斥使用緩衝區。
流程圖如下:
五、關鍵程式碼
1.生產者執行緒函式
unsigned int __stdcall ProducerThreadFun(PVOID pM)
{
for (int i = 1; i <= END_PRODUCE_NUMBER; i++)
{
//等待緩衝區為空
WaitForSingleObject(g_hEventBufferEmpty, INFINITE);
//互斥的訪問緩衝區
EnterCriticalSection(&g_cs);
g_Buffer = i;
printf("生產者生產%d\n", i);
LeaveCriticalSection(&g_cs);
//通知緩衝區有新資料了
SetEvent(g_hEventBufferFull);
}
return 0;
}
//消費者執行緒函式
unsigned int __stdcall ConsumerThreadFun(PVOID pM)
{
volatile bool flag = true;
while (flag)
{
//等待緩衝區中有資料
WaitForSingleObject(g_hEventBufferFull, INFINITE);
//互斥的訪問緩衝區
EnterCriticalSection(&g_cs);
printf(" 消費者消費%d\n", g_Buffer);
if (g_Buffer == END_PRODUCE_NUMBER)
flag = false;
LeaveCriticalSection(&g_cs);
//通知緩衝區已為空
SetEvent(g_hEventBufferEmpty);
Sleep(10); //some other work should to do
}
return 0;
}
六、實驗結果
程式碼的執行結果如下:
六、思考題
(1)如何控制程序間的相互通訊?
1.管道通訊:管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。
2.訊號:訊號量是一個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。
3.訊息佇列:訊息佇列是訊息的連結表。對訊息佇列有讀許可權的程序則可以從訊息佇列中讀取資訊。其基本思想是:根據”生產者-消費者”原理,利用記憶體中公用訊息緩衝區實現程序之間的資訊交換.記憶體中開闢了若干訊息緩衝區,用以存放訊息.每當一個程序向另一個程序傳送訊息時,便申請一個訊息緩衝區,並把已準備好的訊息送到緩衝區,然後把該訊息緩衝區插入到接收程序的訊息佇列中,最後通知接收程序.接收程序收到傳送里程發來的通知後,從本程序的訊息佇列中摘下一訊息緩衝區,取出所需的資訊,然後把訊息緩衝區不定期給系統.系統負責管理公用訊息緩衝區以及訊息的傳遞.一個程序可以給若干個程序傳送訊息,反之,一個程序可以接收不同程序發來的訊息.顯然,程序中關於訊息佇列的操作是臨界區.當傳送程序正往接收程序的訊息佇列中新增一條訊息時,接收程序不能同時從該訊息佇列中到出訊息。
4.共享記憶體:依靠某種同步操作,如互斥鎖和訊號量等。
5.訊號量:主要作為程序之間及同一種程序的不同執行緒之間得同步和互斥手段。
6.套接字:套解口也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程序通訊。
(2)什麼是程序的同步?什麼是程序的互斥?分別有哪些實現方式?
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。
同步:是指在互斥的基礎上,通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。
關於同步與互斥的實現具有典型意義的方法是p、v操作。p、v操作是定義在訊號量上的兩個原語操作。訊號量是表示資源的物理量,也是一個與佇列有關的整形變數,用s表示。其值僅能由p,v操作原語來改變。當s<0時,其絕對值代表進入訊號量執政佇列的處於等待狀態的程序數:當s>0時,其值代表系統中可用的資源數:當s=0是,表示所有資源都分配給了所有程序。系統利用訊號量對程序控制和管理,及控制程序對臨界資源或者公共變數的訪問,以實現程序的同步與互斥。
實驗二 處理機排程
一、實驗目的
(1)加深對處理機排程的作用和工作原理的理解。
(2)進一步認識併發執行的實質。
二、預習內容
預習課本處理機排程有關內容,包括程序佔用處理機的策略方法。
三、實驗內容
1.首先定義資料結構,定義好程序的結構體模板
2.輸入5個程序的名稱、優先數、所需執行時間後對程序根據優先順序排序
3.每次迴圈將優先權最高的程式的優先順序和所需時間減1,cpu時間加1
4.當所有程序所需時間均為0時結束迴圈
四、流程圖
五、關鍵程式碼
1.對程序優先順序排序
pbcp p1, p2, p3, p4;
p4 = NULL;
while (p4 != pbca->p->p)
{
for (p1 = pbca; p1->p->p != p4; p1 = p1->p)
{
if ((p1->p->pri)<(p1->p->p->pri))
{
p2 = p1->p;
p3 = p1->p->p;
p1->p = p3;
p2->p = p3->p;
p3->p = p2;
}
}
p4 = p1->p;
}
2.迴圈執行對優先順序最高的程序的相關操作
while (p1->time == 0)
p1 = p1->p;
if ((p1->time -= 1) == 0)
{
p1->cputime += 1;
p1->pri -= 1;
strcpy(p1->status, "finish");
sort(pbca);
}
else
{
strcpy(p1->status, "run");
p1->cputime += 1;
p1->pri -= 1;
//strcpy(p1->status, "run");
}
p2 = p1->p;
while (p2 != NULL)
{
if (p2->cputime != 0)
{
(p2->cputime) += 1;
}
p2 = p2->p;
}
printPbc(pbca);
五、實驗結果(部分)
六、思考題
(1)處理機排程的目的?
合理快速的處理計算機軟體硬體資源
(2)你實現優先權排程演算法的思想?
運用連結串列,在每次對程序執行相關操作前對優先順序佇列進行排序,優先順序高的排在佇列前端。
(3)你採用時間片輪轉法實現處理機排程的思想?
將時間以一個cpu時間為單位,每次迴圈代表一次cpu時間,每次對優先順序最高的程序進行操作。
(4)比較效率如何?
每次cpu時間執行完後都要對所有程序進行優先權排序,浪費一定時間,但是每次都保證了執行當前優先順序做高的程序。
實驗三 儲存管理
一、實驗目的
(1)加深對儲存管理的作用和工作原理的理解。
(2)進一步認識主存空間的分配和回收方法。
(3)進一步認識虛擬儲存器的工作原理。
二、預習內容
預習課本儲存管理有關內容,包括各種記憶體分配方法和利用分頁式儲存管理實現虛擬儲存器策略方法。
三、實驗內容
選擇實現模擬分頁式儲存管理中硬體的地址轉換和產生缺頁中斷以及用先進先出(FIFO)頁面排程演算法處理缺頁中斷。
實驗3-1:
1.定義頁表格式的結構體
2.定義指令格式結構體
3.初始化頁表
4.執行指令的查詢操作,判斷缺頁與否與是否越界。
實驗3-2:
1.定義頁表格式的結構體
2.定義指令格式結構體
3.初始化頁表
4.執行指令的查詢操作,判斷缺頁與否與是否越界。
5.弱缺頁,利用FIFO演算法進行頁置換
四、關鍵程式碼
判斷指令是否發生缺頁或越界
if(flag==0&&p2[i].pagenum<7)//不在主存
{
printf("*pagenum=%d Page fault generated\n\n",p2[i].pagenum);
}
else if(p2[i].pagenum<7)
{
memaddress=p1[page].block*size+p2[i].address;
printf(" memaddress=block(%d)*size(%d)+address(%d);\n memaddress= %ld\n\n",
p1[page].block,size,p2[i].address,memaddress);
}
else
printf("page over! again\n");
2.如果要發生頁置換,利用FIFO演算法將最早進入的頁置換掉:
if (pagelist[P[po]].dirty)
{
//將更新後的內容寫回外存
pagelist[P[po]].dirty=0;
}
pagelist[P[po]].flag=0;//修改要調出的頁標誌
printf("調出 %ld 調入 %ld\n",P[po],p); //顯示調出調入頁面
pagelist[p].block=pagelist[P[po]].block;
pagelist[p].flag=1;//該頁被調入記憶體
P[po]=p;
po=(po+1)%M;
五、實驗結果
1.普通頁查詢:
2.FIFO
六、思考題
(1)先進先出頁面排程演算法的思想?
在即將發生頁置換時,將最先到來的頁置換出去。
(2)最近最少用(LRU)頁面排程演算法思想?
設塊數為n,將最近的n-1個頁保留,剩餘的一個置換出去。
(3)比較兩種排程演算法的效率(哪種排程演算法使產生缺頁中斷的次數少)?
LRU效率高於先進新出演算法,頁錯誤率低。
(4)分析在什麼情況下采用哪種排程演算法更有利?
當之後要來的頁為現最早到來頁時LRU好,當最近經常使用但將來不常使用的情況新進先出好。
實驗四 檔案系統
一、實驗目的
(1)加深理解檔案系統的內部功能及內部實現。
(2)進一步認識檔案系統的作用。
二、預習內容
預習課本檔案系統有關內容,包括檔案和目錄的建立和刪除等基本原理。
三、實驗內容
1.建立UDF、MDF結構體連結串列。
2.通過控制檯輸入初始化使用者連結串列和使用者檔案列表。
3.實現各個查詢以及更新功能。
4.進行建立刪除開啟等操作。
四、流程圖
開啟檔案的流程圖如下:
五、
刪除的流程圖如下:
六、實驗結果
程式碼的測試結果如下:
首先進行初始化,也是註冊的過程;
然後進行登陸驗證和建立檔案:
然後進行是刪除操作:
五、思考題
(1)檔案管理的思想?
根據不同單位計算機技術在現行檔案和文件管理中應用情況,可以分為三種模式,一是現代檔案和檔案管理分別應用計算機技術模式;二是現行檔案和檔案管理綜合應用技術模式;三是電子檔案模式。要結合本單位的特點,採用相應的管理模式。
(2)目錄管理的思想?
管理索引,操作索引,不直接對檔案進行操作。