作業系統實驗——程式控制

軒轅椿發表於2020-10-30

作業系統實驗——程式控制

預習內容:

1.程式的概念
⑴程式的併發執行
⑵程式的定義
2.程式的描述
⑴程式控制塊
⑵程式上下文
⑶程式上下文切換
⑷程式空間與大小
3. 程式狀態及其轉換
⑴程式狀態
⑵程式狀態轉換
4.程式控制
⑴程式建立與撤銷
⑵程式的阻塞與喚醒

實驗目的與要求(及主要實驗儀器、裝置):

1、理解程式的概念,明確程式和程式的區別。
2、理解併發執行的實質。
3、 掌握程式的建立、睡眠、撤銷等程式控制方法
要求:
(1)一臺Windows7以上版本作業系統的計算機。
(2)計算機裝有Microsoft Visual Studio專業版或企業版。

實驗原理(方法與與原理分析):

程式的建立:
1.為新程式分配唯一的程式識別符號,並從PCB佇列中申請一個空閒的PCB;
2.為新程式分配必要的記憶體空間和其它各種資源;
3.初始化PCB中的相應資訊,如標識資訊、CPU資訊、程式控制資訊;
4.若條件許可,將新程式的PCB插入到就緒佇列中;

實驗步驟(程式程式碼與實驗過程):

步驟1:登入進入Windows,啟動VC++。
步驟2:在“FILE”選單中單擊“NEW”子選單,在“projects”選項卡中選擇“Win32ConsolApplication”,然後在“Projectname”處輸入工程名,在“Location”處輸入工程目錄。建立一個新的控制檯應用程式工程。
步驟3:在“FILE”選單中單擊“NEW”子選單,在“Files”選項卡中選擇“C++SourceFile”,然後在“File”處輸入C/C++源程式的檔名。
步驟4:將新建立的C/C++源程式中,編譯成的可執行檔案進行執行。
1.建立新程式程式碼:
void create()
{
if(num>=20) /判斷是否有儲存空間/
printf("\n 記憶體已滿,請刪除或掛起其他程式");
else{
for(i=0;i<20;i++)
if(neicun[i].state0) break; /按順序在記憶體中尋找建立新程式的空間/
printf("\n 請輸入新建程式的 pid 值\n");
scanf("%d",&neicun[i].pid);
for(j=0;j<i;j++) /判斷是否之前已儲存相同 pid 程式/
if(neicun[j].pid
neicun[i].pid)
{ printf("\n 該程式已存在於記憶體中");
return;
}
printf("\n 請輸入新程式的優先順序 \n" );
scanf("%d",&neicun[i].youxianji);
printf("\n 請輸入新程式的大小\n" );
scanf("%d",&neicun[i].daxiao);
printf("\n 請輸入新程式的內容\n" );
scanf("%s",&neicun[i].neirong);
neicun[i].state=1; /將程式狀態設為 1,表示在記憶體中/
num++;/記憶體中程式數目加一/
}
}
2.檢視程式程式碼:
void run()
{ bj=0;
for(i=0;i<20;i++)
if(neicun[i].state1) /若程式狀態設為 1,表示在記憶體中,輸出檢視/
{printf("\n pid=%d",neicun[i].pid);
printf(" youxianji=%d",neicun[i].youxianji);
printf(" daxiao=%d",neicun[i].daxiao);
printf(" neirong=%s",neicun[i].neirong);
bj=1;/*存在於記憶體中的程式標記為 1 */
}
if(bj
0)
printf("\n 當前沒有執行該程式\n" );/標記為 0,表示該程式未建立於記憶體中/
}

3.換出程式程式碼
void huanchu()
{if(num0) /num=0,表示記憶體中無程式/
{ printf("\n 當前沒有執行的程式\n" );
return;
}
printf("\n 請輸入要換出的程式的 pid 值\n" );
scanf("%d",&pid);
bj=0;
for(i=0;i<20;i++)
{
if(pid
neicun[i].pid)
{ if(neicun[i].state1)
{neicun[i].state=2; /將該程式的狀態設為掛起/
guaqi++;
printf("\n 該程式已成功掛起換出\n" );
}
else if(neicun[i].state
0)
printf("\n 要換出的程式不存在\n" );
else printf("\n 要換出的程式已經被掛起\n" );
bj=1;break;
}
}
if(bj0) printf("\n 要換出的程式不存在\n" );
}
4.殺死程式程式碼
void kill()
{
if(num
0)
{ printf("\n 當前沒有執行的程式\n" );
return;
}
printf("\n 請輸入要殺死的程式的 pid 值\n" );
scanf("%d",&pid);
bj=0;
for(i=0;i<20;i++)
{
if(pidneicun[i].pid)
{ if(neicun[i].state
1)
{neicun[i].state=0; /將該程式的狀態設為不在記憶體中/
num–; /記憶體中的程式數目減少一個/
printf("\n 該程式已成功殺死\n" );
}
else if(neicun[i].state0)
printf("\n 要殺死的程式不存在\n" );
else printf("\n 要殺死的程式已經被掛起\n" );/剩餘狀態為 2,掛起/
bj=1;break;
}
}
if(bj
0) printf("\n 要殺死的程式不存在\n" );
}
5.喚醒程式程式碼
void huanxing()
{
if(num0)
{ printf(“當前沒有執行的程式\n”);
return;
}
if(guaqi
0) /guaqi=0,表示沒有掛起的程式/
{ printf("\n 當前沒有換出的程式\n");
return;
}
printf("\n 請輸入要喚醒的程式的 pid 值:\n");
scanf("%d",&pid);
for(i=0;i<20;i++){
if(pidneicun[i].pid)
{
if(neicun[i].state
2)
{neicun[i].state=1; /將該程式的狀態設為掛起/
guaqi–;
num++;
printf("\n 該程式已成功喚醒\n" );
}
else if(neicun[i].state==0)
printf("\n 要喚醒的程式不存在\n" );
else printf("\n 要喚醒的程式已經在記憶體中\n" );
}
}
}

實驗結果(資料分析與結論):

1.通過程式碼實現程式的建立和對是否有儲存空間的判斷,在有儲存空間的情況下新建程式pid值,並且對之前是否儲存相同pid值進行判斷,在確定沒有相同的pid程式的情況下輸入程式的優先順序,並且修改新建程式狀態記憶體空間減少,之後結束;如果在有儲存空間或者有相同的pid程式的情況下直接進行結束。
2.執行檢視的程式碼後通過檢視當前執行程式來判斷迴圈判斷記憶體中程式狀態是否為1,是的情況下輸出當前程式狀態後結束,如果記憶體中狀態不為1則直接結束。
3.建立程式
在這裡插入圖片描述

4.檢視當前執行程式
在這裡插入圖片描述

5.換出程式
在這裡插入圖片描述

在這裡插入圖片描述

6.殺死程式
在這裡插入圖片描述
在這裡插入圖片描述

7.喚醒程式
在這裡插入圖片描述

問題討論:

問:在什麼情況下會導致程式被撤銷?
答:
(1)該程式已完成所要求的功能而正常終止;
(2)由於某種錯誤導致非正常終止;
(3)祖先程式要求撤銷某個子程式。

相關文章