當前位置:才華齋>計算機>作業系統>

作業系統實驗二:程序管理

作業系統 閱讀(2.3W)

作業系統實驗二:程序管理

作業系統實驗二:程序管理

篇一:作業系統實驗報告 實驗一 程序管理

一、目的

程序排程是處理機管理的核心內容。本實驗要求編寫和除錯一個簡單的程序排程程式。通過本實驗加深理解有關程序控制塊、程序佇列的概念,並體會和了解程序排程演算法的具體實施辦法。

二、實驗內容及要求

1、設計程序控制塊PCB的結構(PCB結構通常包括以下資訊:程序名(程序ID)、程序優先數、輪轉時間片、程序所佔用的CPU時間、程序的狀態、當前佇列指標等。可根據實驗的不同,PCB結構的內容可以作適當的增刪)。為了便於處理,程式中的某程序執行時間以時間片為單位計算。各程序的輪轉時間數以及程序需執行的時間片數的初始值均由使用者給定。

2、系統資源(r1…rw),共有w類,每類數目為r1…rw。隨 機產生n程序Pi(id,s(j,k)t),0<=i<=n,0<=j<=m,0<=k<=dt為總執行時間,在執行過程中,會隨機申請新的資源。

3、每個程序可有三個狀態(即就緒狀態W、執行狀態R、等待或阻塞狀態B),並假設初始狀態為就緒狀態。建立程序就緒佇列。

4、編制程序排程演算法:時間片輪轉排程演算法

本程式用該演算法對n個程序進行排程,程序每執行一次,CPU時間片數加1,程序還需要的時間片數減1。在排程演算法中,採用固定時間片(即:每執行一次程序,該程序的執行時間片數為已執行了1個單位),這時,CPU時間片數加1,程序還需要的時間片數減1,並排列到就緒佇列的尾上。

三、實驗環境

作業系統環境:Windows系統。

程式語言:C#。

四、實驗思路和設計

1、程式流程圖

2、主要程式程式碼

//PCB結構體

struct pcb

{

public int id; //程序ID

public int ra; //所需資源A的數量

public int rb; //所需資源B的數量

public int rc; //所需資源C的數量

public int ntime; //所需的時間片個數

public int rtime; //已經執行的時間片個數

public char state; //程序狀態,W(等待)、R(執行)、B(阻塞)

//public int next;

}

ArrayList hready = new ArrayList();

ArrayList hblock = new ArrayList();

Random random = new Random();

//ArrayList p = new ArrayList();

int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m為要模擬的程序個數,n為初始化程序個數

//r為可隨機產生的程序數(r=m-n)

//a,b,c分別為A,B,C三類資源的總量

//i為進城計數,i=1…n

//h為執行的時間片次數,time1Inteval為時間片大小(毫秒)

//對程序進行初始化,建立就緒陣列、阻塞陣列。

public void input()//對程序進行初始化,建立就緒佇列、阻塞佇列

{

m = e();

n = e();

a = e();

b = e();

c = e();

a1 = a;

b1 = b;

c1 = c;

r = m - n;

time1Inteval = e();

rval = time1Inteval;

for (i = 1; i <= n; i++)

{

pcb jincheng = new pcb();

= i;

= ((a) + 1);

= ((b) + 1);

= ((c) + 1);

e = ((1, 5));

e = 0;

("產生程序ID:" + );

("所需A資源數目:" + );

("所需B資源數目:" + );

("所需C資源數目:" + );

("所需時間片數:" + e);

if ((a - ) >= 0 && (b - ) >= 0 && (c - ) >= 0)

{

a = a - ;

b = b - ;

c = c - ;

e = 'W';

(jincheng);//加入就緒佇列

}

else

{

e = 'B';

(jincheng);//加入阻塞佇列

}

("當前程序狀態:" + e);

}

}

//從陣列起始地址開始輸出該陣列的內容

public void disp(ArrayList list)

{

ArrayList list1 = new ArrayList();

list1 = list;

if (t > 0)

{

for (int j = 0; j < t; j++)

{

pcb p = (pcb)list1[j];

(" " + ring() + " " + ring() + "

ring() + "" + ring() + "" + ring()+"

ring() + " " + ring() + " ");

}

}

else

{

(" 該佇列中沒有程序! ");

}

}

//輸出就緒陣列和阻塞陣列的資訊

public void outputall()

{

(" =======CPU運行了:" + ring() + "次======= ");

("*********當前就緒佇列的資訊!*********");

("程序ID 程序狀態 A資源數 B資源數 C資源數 所需時間片 已執行時間片");

disp(hready);

("*********當前就阻塞列的資訊!*********");

("程序ID 程序狀態 A資源數 B資源數 C資源 所需時間片 已執行時間片");

disp(hblock);

}

//執行就緒陣列的頭程序,執行一個時間片,輪轉一個時間片,時間片輪轉排程演算法

public void running()

{

ArrayList hready1 = new ArrayList();

hready1 = hready;

pcb p1 = new pcb();

p1=(pcb)hready1[0];

e='R';

e= e + 1;

h=h+1;

(" ~~~~~~~當前正在執行程序ID是:" + + "~~~~~~~~ ");

(" 程序ID 程序狀態 A資源數 B資源數 C資源數 所需時間片 已執行時間片 ");

( + " " +e+ "" + + " " + + "" + + "" + e + "" + e);

if (e==e)

{

(ring()+"的程序已經完成! ");

a = a + ;

b = b + ;

c = c + ;

veAt(0);

}

else

{

e='W';

(p1);

veAt(0);

}

}

//檢測當前資源數目是否滿足阻塞數組裡程序的需求

public void testblock()

{

ArrayList hblock1 = new ArrayList();

hblock1 = hblock;

for (int m = 0; m < t; m++)

{

pcb p1 = new pcb();

篇二:作業系統程序管理實驗

一、實驗目的

通過編寫程序管理的演算法,要求學生掌握整個程序管理的各個環節,程序的資料結構描述,程序的各種狀態之間的轉換,以及程序的排程演算法。以加深對程序的概念及程序排程演算法的理解,並且提高連結串列的應用能力,達到提高程式設計能力的目的。

二、實驗原理及基本技術路線圖(方框原理圖)

C語言或C++語言開發。需要定義PCB的資料結構,用連結串列的形式管理程序,採用多級反饋佇列排程的演算法模擬程序的控制。要求有建立、撤銷、排程、阻塞、喚醒程序等功能。

①程序的狀態轉換圖

②資料結構定義、主要變數的說明、函式的說明及各原語的功能說明

typedef struct PCB 定義結構體PCB程序控制塊;char NAME[20] 定義結構體變數,程序名;long

ID 定義程序id;int RUNTIME 定義程序執行時間;char STATE[6] 定義程序狀態 有 ready 、wait 、run;

int PRIORITY定義權值。 typedef struct QNode { PCB pcb; struct QNode *next; }QueuePtr; 定義單鏈表,有定義指標next。typedef struct LinkQueue { int prior; QueuePtr *front; QueuePtr *rear; int PartTime; }LinkQueue;

鏈佇列中定:優先順序、結構體裡的QueuePtr型別指標變數,指向該優先順序的程序的頭結點和尾結點,還執行的時間片。LinkQueue Readyqueue[10] 鏈佇列的單鏈表。

void schedule() 宣告排程函式,用來排程程序的執行;void show() 宣告輸出函式,用來輸出的一個函式;void Create()宣告建立程序的函式,用來建立程序。

yunxingshijian=1+(int)(rand()%30); 此語句是隨機生成一個整數賦給執行時間RUNTIME;

youxianji=1+(int)(rand()%9); 該語句隨機生成一個整數(1~9)賦給優先順序; strcpy(p->,name)將名字賦給PCB塊;strcpy(p->E,"Ready")將程序狀態賦給PCB塊; p->RITY=youxianji將優先順序賦給PCB塊; p->IME=yunxingshijian; 將執行時間賦給PCB塊; p->=id 將id號賦給PCB塊。

{Readyqueue[i]t->next=p->next; Readyqueue[i+1]->next=p; Readyqueue[i+1]=p;p->next=NULL; } p移到下一佇列的隊尾,使Readyqueue[i+1]指向最後一個結點。{Readyqueue[i]t->next=p->next; Readyqueue[9]->next=p; p->next=NULL; Readyqueue[9]=p; } //p->next前移,把p移到執行結束的佇列Readyqueue[9]。

③多級反饋佇列排程演算法的描述

一個程序被排程,則其執行時間有p->IME=p->IME-(int )pow(2,i+1),此後如果該程序的p->IME<0或p->IME=0,此程序就結束且加入到Readyqueue[9]->next=p且p->next=NULL。沒有結束就移加到下一佇列的尾部且優先順序減“1”(Readyqueue[i]t->next=p->next;Readyqueue[i+1]->next=p;Readyqueue[i+1]=p;p->next=NULL; )。然後往下執行。如此迴圈 Readyqueue[i]t->next!=NULL發生時,就往下一優先順序執行。直到所有程序結束。

④程式功能結構圖、流程圖

<1>建立程序函式Create()

三、所用儀器、材料(裝置名稱、型號、規格等)。

所用儀器:計算中心201;作業系統:Microsoft Visual C++;軟體平臺:Microsoft Visual C++

四、實驗方法、步驟

#include#include#include#include#include

typedef struct PCB //定義結構體PCB程序控制塊 {

typedef struct QNode//單鏈表 {

PCB pcb;

typedef struct LinkQueue//鏈佇列

{

int prior; //優先順序

LinkQueue Readyqueue[10]; //鏈佇列的單鏈表

int N; //N為當前程序數

void schedule();//宣告排程函式

void show(); //宣告輸出函式

void InitQueue() //佇列的初始化、給每個佇列加個頭結點 {

for(int i=0;i<10;i++) {

Readyqueue[i]Time=(int )pow(2,i+1); //每個程序的時間片

Readyqueue[i]r=9-i;//每程序的.優先順序

Readyqueue[i]t=(QueuePtr*)malloc(sizeof(QueuePtr)); //為程序申請空間

QueuePtr *front; //結構體裡的QueuePtr型別指標變數,指向該優先順序的程序的頭結點

QueuePtr *rear; //結構體裡的QueuePtr型別指標變數,指向該優先順序的程序的尾結點

int PartTime; //時間片

struct QNode *next;

}

QueuePtr;

char NAME[20]; //結構體變數,程序名

long ID; //程序id

int RUNTIME; //程序執行時間

char STATE[6]; //程序狀態

ready wait run int PRIORITY;//權值

}PCB;

}LinkQueue;

}

}

Readyqueue[i]=Readyqueue[i]t;//初始化單鏈的頭結點和尾結點指向同一位置 Readyqueue[i]t->next=NULL; //初始化時Readyqueue[i]t->next為空

//***************************建立程序**************************************************

void Create() {

InitQueue();

char name[20]; long id=201031101; //定義ID和初始化為201031101

QueuePtr *p;

int yunxingshijian,youxianji;//執行時間、優先順序

printf(" 請輸入要建立程序的數目:");

fflush(stdin);

scanf("%d",&m);

{

printf(" 輸入程序名:"); //使用者輸入使用者名稱

scanf("%s",&name);

int m;

for(int j=1;j<=m;j++) //建立使用者所需程序m個

srand((int)time(0));

yunxingshijian=1+(int)(rand()%30);//隨機生成一個整數賦給執行時間

printf(" 執行時間:%d",yunxingshijian);

srand((int)time(0));

for(int i=0;i<9;i++) //通過優先順序尋找該程序應放置的佇列

{

if(youxianji==9-i)

{

k=Readyqueue[i]t; //k為移動指標,尋找佇列末尾程序

strcpy(p->,name); //將名字賦給PCB塊

strcpy(p->E,"Ready");//將程序狀態賦給PCB塊

p->RITY=youxianji;//將優先順序賦給PCB塊

p->IME=yunxingshijian; //將執行時間賦給PCB塊

p->=id; //將id號賦給PCB塊

youxianji=1+(int)(rand()%9);//隨機生成一個整數(1~9)賦給優先順序

printf(" 優先順序:%d",youxianji);

p=(QueuePtr *)malloc(sizeof(QueuePtr)); //插入就緒佇列

QueuePtr *k;

篇三:作業系統實驗二(程序管理)

實驗題目:

(1) 程序的建立編寫一段程式,使用系統呼叫fork( )建立兩個子程序。當此程式執行時,在系統中有一個父程序和兩個子程序活動。讓每一個程序在螢幕上顯示一個字元:父程序顯示字元“a”;子程序分別顯示字元“b”和字元“c”。試觀察記錄螢幕上的顯示結果,並分析原因。

(2) 程序的控制修改已編寫的程式,將每個程序輸出一個字元改為每個程序輸出一句話,在觀察程式執行時螢幕上出現的現象,並分析原因。

(3) 編制一段程式,使其實現程序的軟中斷通訊。要求:使用系統呼叫fork( )建立兩個子程序,再用系統呼叫signal( )讓父程序捕捉鍵盤上來的中斷訊號(即按Del鍵);當捕捉到中斷訊號後,父程序呼叫系統呼叫kill( )向兩個子程序發出訊號,子程序捕捉到訊號後分別輸出下列資訊後終止:Child process 1 is killed by parent!Child process 2 is killed by parent! 父程序等待兩個子程序終止後,輸出如下的資訊後終止:Parent process is killed! 在上面的程式中增加語句signal(SIGINT, SIG_IGN)和 signal(SIGQUIT, SIG_IGN),觀察執行結果,並分析原因。

(4) 程序的管道通訊編制一段程式,實現程序的管道通訊。使用系統呼叫pipe( )建立一條管道線;兩個程序P1和P2分別向管道各寫一句話: Child 1 is sending a message! Child 2 is sending a message! 而父程序則從管道中讀出來自於兩個子程序的資訊,顯示在螢幕上。要求父程序先接收子程序P1發來的訊息,然後再接收子程序P2發來的訊息。

實驗源程式及報告:

(1)、程序的建立

#include

int main(int argc, char *argv[])

{

int pid1,pid2; /*fork first child process*/

if ( ( pid1=fork() ) < 0 )

{

printf( "ProcessCreate Failed!");

exit(-1);

}

if ( ( pid1=fork() ) == 0 )

{

printf( "b " );

}

/*fork second child process*/

if ( ( pid2=fork() ) < 0 )

{

printf( "ProcessCreate Failed!");

exit(-1);

}

if ( ( pid2=fork() ) == 0 )

{

printf( "c " );

}

/*parent process*/

else

{

wait(NULL);

printf( "a " );

exit(0);

}

return 0;

}

(2)、程序的控制

#include

int main(int argc, char *argv[])

{int pid1,pid2;

/*fork first child process*/

if ( ( pid1=fork() ) < 0 )

{

printf( "ProcessCreate Failed!");

exit(-1);

}

if ( ( pid1=fork() ) == 0 )

{

printf( "This is my Unix OS program! " );

}

/*fork second child process*/

if ( ( pid2=fork() ) < 0 )

{

printf( "ProcessCreate Failed!");

exit(-1);

}

if ( ( pid2=fork() ) == 0 )

{

printf( "This is the second Child process! " );

}

/*parent process*/

else

{

wait(NULL);

printf( "This is the Parent process " );

exit(0);

}

return 0;

}

(3) 編制一段程式,使其實現程序的軟中斷通訊。

#include

#include

#include

#include

int wait_flag; void stop( );

main( )

{

int pid1, pid2;signal(3, stop);

while ((pid1 = fork( )) == -1);

if ( (pid1 = fork() ) > 0)

{

while ((pid2 = fork( )) == -1);

if (( pid2 = fork()) > 0 )

{

}

else

{

} wait_flag = 1;

signal(SIGINT, stop);

sleep(5);

kill(pid1, 16);

kill(pid2,17);

wait(0); wait(0);

printf(" Parent process is killed. ");

exit(0); wait_flag = 1;

signal(17, stop);

printf(" Child process 2 is killed by parent. ");

exit(0);

}