一個操作系統會提供什麼功能?
分配cpu,管理內存,管理文件,輸入輸出
一個操作系統實現這些功能,有更加詳細的設計,今天分析一篇關於進程的結構,狀態,控制的模擬程序。
采用最高優先數優先的調度算法(即把處理機分配給優先數最高的進程)和先來先服務算法。
每個進程有一個進程控制塊( PCB)表示。進程控制塊可以包含如下信息:進程名、優先數、到達時間、需要運行時間、已用CPU時間、進程狀態等等。
進程的優先數及需要的運行時間可以事先人為地指定(也可以由隨機數產生)。進程的到達時間為進程輸入的時間。 進程的運行時間以時間片為單位進行計算。每個進程的狀態可以是就緒 W(Wait)、運行R(Run)狀態之一。
就緒進程獲得 CPU後都只能運行一個時間片。用已占用CPU時間加1來表示。如果運行一個時間片後,進程的已占用 CPU時間已達到所需要的運行時間,則撤消該進程,如果運行一個時間片後進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續運行,此時應將進程的優先數減1(即降低一級),然後把它插入就緒隊列等待CPU。
每進行一次調度程序都打印一次運行進程、就緒隊列、以及各個進程的 PCB,以便進行檢查。
define null 0
define getpch(type)(type*)malloc(sizeof(type))
struct pcb { /* 定義進程控制塊PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb* link;
}*ready=NULL,*p;
typedef struct pcb PCB;
void sort() /* 建立對進程進行優先級排列函數*/
{
PCB *first, *second; //2個指針
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /優先級最大者,插入隊首/
{
p->link=ready; //p是輸入的進程塊指針,p->link指向一個進程塊,ready也是指向一個進程塊的指針,初始為空。p->link=ready=null//
ready=p;
}
else /* 進程比較優先級,插入適當的位置中*/
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->super)>(second->super)) /若插入進程比當前進程優先數大,/
{ /插入到當前進程前面/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else /* 插入進程優先數最低,則插入到隊尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0) first->link=p;
}
}
//先把這個函數的作用分析清楚,可以用圖幫助理解。
int space()
{
int l=0; PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
Void disp(PCB * pr) /建立進程顯示函數,用於顯示當前進程/
{
printf(“\n qname \t state \t super \t ndtime \t runtime \n”);
printf(“|%s\t”,pr->name);
printf(“|%c\t”,pr->state);
printf(“|%d\t”,pr->super);
printf(“|%d\t”,pr->ntime);
printf(“|%d\t”,pr->rtime);
printf(“\n”);
}
Void check() /* 建立進程查看函數 */
{
PCB* pr;
printf(“\n ** 當前正在運行的進程是:%s”,p->name); /顯示當前運行進程/
disp(p);
pr=ready;
printf(“\n **當前就緒隊列狀態為:\n”); /顯示就緒隊列狀態/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
}
Void destroy() /建立進程撤消函數(進程運行結束,撤消進程)/
{
printf(“\n 進程 [%s] 已完成.\n”,p->name);
free(p);
}
這幾個函數,都很簡單,下面一個關於執行時間的稍微復雜
Void running() /* 建立進程就緒函數(進程運行時間到,置就緒狀態*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 調用destroy函數*/
else
{
(p->super)–;
p->state=’w’;
sort(); /調用sort函數/
}
}
Void main() /主函數/
{
int len,h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
h++;
printf(“\n The execute number:%d \n”,h);
p=ready;
ready=p->link;
p->link=NULL;
p->state=’R’;
check();
running();
printf(“\n 按任一鍵繼續……”);
ch=getchar();
}
printf(“\n\n 進程已經完成.\n”);
ch=getchar();
}