作業系統實驗二 程序管理
阿新 • • 發佈:2019-02-14
程序管理
一.實驗目的
1、 理解程序的概念,明確程序和程式的區別。
2、 理解併發執行的實質。
3、 掌握程序的建立、睡眠、撤銷等程序控制方法。
二.實驗內容與基本要求
用C語言編寫程式,模擬實現建立新的程序;檢視執行程序;換出某個程序;殺死程序等功能。
三.實驗報告內容
1.程序、程序控制塊等的基本原理
a.為了能使程式併發執行,並且可以對併發執行的程式加以描述和控制,引入了“程序”的概念。它是資源分配和獨立執行的基本單位。
b.程序控制塊(PCB)是作業系統為程序配置的一個專門的資料結構。系統利用PCB來描述程序的基本情況和活動過程,進而控制和管理程序。
2.程式流程圖
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.執行結果以及結論
程式功能一覽
建立新的程序,理論上可支援最多20個程序。每個程序對應有唯一的ID,優先順序,程序大小(執行時長),程序內容
可檢視正在執行的程序全部資訊。
可選擇將正在執行的程式換出,掛起。
殺死程序
喚醒被掛起的程序