1. 程式人生 > >作業系統實驗二 程序管理

作業系統實驗二 程序管理

程序管理

一.實驗目的

1、 理解程序的概念,明確程序和程式的區別。
2、 理解併發執行的實質。
3、 掌握程序的建立、睡眠、撤銷等程序控制方法。

二.實驗內容與基本要求

用C語言編寫程式,模擬實現建立新的程序;檢視執行程序;換出某個程序;殺死程序等功能。

三.實驗報告內容

1.程序、程序控制塊等的基本原理

a.為了能使程式併發執行,並且可以對併發執行的程式加以描述和控制,引入了“程序”的概念。它是資源分配和獨立執行的基本單位。
b.程序控制塊(PCB)是作業系統為程序配置的一個專門的資料結構。系統利用PCB來描述程序的基本情況和活動過程,進而控制和管理程序。

2.程式流程圖

process

3.程式及註釋

#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
struct PCB_type
{  int pid;
   int youxianji;
   int daxiao;
   char neirong[10];
   int state;     /* 0表示不在記憶體,1表示在記憶體,2表示掛起*/ 
};
struct PCB_type neicun[20];
int num=0,guaqi=0,bj,i,j,pid;/*定義相關引數變數*/
/*********************建立新程序*************************/
void create() { if(num>=20) /*判斷是否有儲存空間*/ printf("\n 記憶體已滿,請刪除或掛起其他程式"); else{ for(i=0;i<20;i++) if(neicun[i].state==0) 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++;/*記憶體中程序數目加一*/ } } /********************檢視當前執行程序**************************/ void run() { bj=0; for(i=0;i<20;i++) if(neicun[i].state==1) /*若程序狀態設為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,表示該程序未創建於記憶體中*/ } /********************換出程序***************************/ void huanchu() {if(num==0) /*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].state==1) {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(bj==0) printf("\n要換出的程序不存在\n" ); } /********************殺死程序***************************/ 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(pid==neicun[i].pid) { if(neicun[i].state==1) {neicun[i].state=0; /*將該程序的狀態設為不在記憶體中*/ num--; /*記憶體中的程序數目減少一個*/ printf("\n該程序已成功殺死\n" ); } else if(neicun[i].state==0) printf("\n要殺死的程序不存在\n" ); else printf("\n要殺死的程序已經被掛起\n" );/*剩餘狀態為2,掛起*/ bj=1;break; } } if(bj==0) printf("\n要殺死的程序不存在\n" ); } /********************喚醒程序***************************/ void huanxing() { if(num==0) { 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(pid==neicun[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" ); } } } /********************主程式***************************/ void main() {int xuhao,n=1,i; for(i=0;i<20;i++) neicun[i].state=0; /*使所有程序都初始設為不在記憶體中*/ while(n){ printf("\n**********************************************"); printf("\n* 程序演示系統 *"); printf("\n**********************************************"); printf("\n 1.建立新的程序 2.檢視執行程序"); printf("\n 3.換出某個程序 4.殺死執行程序"); printf("\n 5.喚醒某個程序 6.退出程式 "); printf("\n**********************************************"); printf("\n請選擇(1~6):"); scanf("%d",&xuhao); switch(xuhao) { case 1: create( ); break; case 2 :run(); break; case 3 :huanchu();break; case 4 :kill();break; case 5 :huanxing();break; case 6 :exit(0); default: n=0; break; } } }

4.執行結果以及結論

程式功能一覽
1

建立新的程序,理論上可支援最多20個程序。每個程序對應有唯一的ID,優先順序,程序大小(執行時長),程序內容

2

可檢視正在執行的程序全部資訊。

3

可選擇將正在執行的程式換出,掛起。
4

殺死程序
5

喚醒被掛起的程序
6