操作系統課程設計進程管理代碼
『壹』 計算機操作系統進程管理實驗代碼。
你說的是cmd命令提示符地下的操作命令嗎? 可以找度娘啊!
『貳』 操作系統課程設計"進程管理系統設計"
日死 打廣告哈
『叄』 哪位大俠有操作系統課程設計關於處理機管理(進程管理)的源代碼,十萬火急!!!
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
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;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*優先順序最大者,插入隊首*/
{
p->link=ready;
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;
}
}
void input() /* 建立進程式控制制塊函數*/
{
int i,num;
//clrscr(); /*清屏*/
printf("\n 請輸入進程號?");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n 進程號No.%d:\n",i);
p=getpch(PCB);
printf("\n 輸入進程名:");
scanf("%s",p->name);
printf("\n 輸入進程優先數:");
scanf("%d",&p->super);
printf("\n 輸入進程運行時間:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort(); /* 調用sort函數*/
}
}
int space()
{
int l=0; PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
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");
}
check() /* 建立進程查看函數 */
{
PCB* pr;
printf("\n **** 當前正在運行的進程是:%s",p->name); /*顯示當前運行進程*/
disp(p);
pr=ready;
printf("\n ****當前就緒隊列狀態為:\n"); /*顯示就緒隊列狀態*/
while(pr!=NULL)
{
disp(pr);
pr=pr->link;
}
}
destroy() /*建立進程撤消函數(進程運行結束,撤消進程)*/
{
printf("\n 進程 [%s] 已完成.\n",p->name);
free(p);
}
running() /* 建立進程就緒函數(進程運行時間到,置就緒狀態*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 調用destroy函數*/
else
{
(p->super)--;
p->state='w';
sort(); /*調用sort函數*/
}
}
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();
}
『肆』 操作系統進程調度課程設計偽代碼
操作系統進程調度課程設計偽代碼我幫你解決絕對專業.
『伍』 操作系統的課程設計~進程式控制制系統~用C語言編寫的
補充: 這個程序當然可以在WINDOWS下編輯了. 不過編譯就必須要UNIX了.
下面的程序假設回你的當答前目錄有一個helloworld程序, 這個你會寫吧? :)
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int pid;
int status;
pid = fork();
if (pid == 0) {
/* child process */
execve("./helloworld", NULL, NULL);
} else if (pid < 0) {
/* failed to fork, print error message */
printf("fork error, errno = %d\n", errno);
} else {
waitpid(pid,&status,0)
}
return 0;
}
『陸』 求代碼~操作系統 進程式控制制實驗 語言C++ 要求如下
代碼很簡單的,其實就是考查出隊入隊的隊列應用。
創建進程入隊、結束進程出隊、進程阻塞入隊、激活進程出隊、調度進程入隊出隊、時間片到入隊出隊。
『柒』 操作系統課程設計《兩道批處理系統的兩級調度-2》 請發郵箱[email protected],多謝各位大神啦!
設計1 進程管理
設計內容
進程的創建和控制
編寫一段程序,使用系統調用()創建兩個子進程。當此程序運行時,在系統中有一個父進程和兩個子進程活動。每個進程在屏幕上顯示一個字元,記錄屏幕上的顯示結果,並分析原因。修改以編寫的程序,將每個進程輸出一個字元改為每個進程輸出一句話。
進程的軟中斷通信
使用系統調用fork()創建兩個子進程,使用系統調用signal()讓父進程捕捉用alarm函數設置時鍾的時間段終止時產生的信號,當捕捉到該信號後,父進程使用系統調用Kill()向兩個子進程發出信號,子進程捕捉到信號後分別輸出子進程被殺死信息後終止,父進程等待兩個子進程終止後,輸出父進程被殺死信息後終止程序。記錄屏幕上的顯示結果,並分析原因。
進程的管道通信
使用系統調用pipe()建立一個管道;兩個子進程分別向管道寫信息,父進程則從管道讀出來自子進程的信息,顯示在屏幕上。
記錄屏幕上的顯示結果,並分析原因。
設計2 進程的同步與互斥
設計內容
用程序實現生產者-消費者問題
問題描述: 一個倉庫可以存放K件物品。生產者每生產一件產品,將產品放入倉庫,倉庫滿了就停止生產。消費者每次從倉庫中去一件物品,然後進行消費,倉庫空時就停止消費。
設計3 存儲管理
設計內容
將指令序列轉換為用戶虛存中的請求調用頁面流。
頁面大小為1K
用戶內存容量為4頁到40頁
用戶外存的容量為40k
在用戶外存中,按每K存放10條指令,400條指令在外存中的存放方式為:
0-9條指令為第0頁
10-19條指令為第1頁
。。。。。
390-399條指令為第39頁
按以上方式,用戶指令可組成40頁
通過隨機數產生一個指令序列,共400個指令(0-399)
模擬請求頁式存儲管理中頁面置換演算法
執行一條指令,首先在外存中查找所對應的頁面和頁面號,然後將此頁面調入內存中,模擬並計算下列各述演算法在不同內存容量下的命中率(頁面有效次數/頁面流的個數)
先進先出的演算法(FIFO)
最久未使用演算法(LRU)
提示
隨機指令的產生
rand() 或srand()
用戶內存中頁面控制結構採用鏈表
頁面控制結構
struct p_str{
int pagenum; /* 頁號 */
int count; /* 訪問頁面的次數 */
struct p_str next; /* 下一指針 */
}p_str;
#define false 0
#define true 1
#define n 4
#define m 10
struct
{
char type[10];
int count;
int remain;
int address;
}equiptype[n];
struct
{
int number;
int status;
int remain;
char jobname[4];
int lnumber;
}equipment[m];
allocate(J,type,mm)
char *J,*type;
int mm;
{
int i,t,j;
i=0;
while(i<n&&strcmp(equiptype[i].type,type)!=0)
i++;
if(i>=n)
{
printf("該類設備,設備配失敗");
return(false);
}
if(equiptype[i].remain<1)
{
printf("該類設備足配失敗");
return(false);
}
t=equiptype[i].address;
while(!(equipment[t].status==1 && equipment[t].remain==0))
t++;
equiptype[i].remain--;
equipment[t].remain=1;
strcpy(equipment[t].jobname,J);
equipment[t].lnumber=mm;
}
reclaim (J,type)
char J,type;
{
int i,t,j,k,nn;
i=0;
while(i<n&&strcmp(equiptype[i].type,type)!=0)
i++;
if(i>=n)
{
printf("該類設備,設備收失敗");
return(false);
}
t=equiptype[i].address;
j=equiptype[i].count;
k=0;
nn=t+j;
for(;t<nn;t++)
if(strcmp(equipment[t].jobname,J)==0&&equipment[t].remain==1)
{
equipment[t].remain=0;
k++;
}
equiptype[i].remain= equiptype[i].remain+k;
if(k==0)
printf("該作業沒使用該類設備\n");
}
main( )
{
char J[4];
int i,mm,a;
char type[10];
strcpy(equiptype[0].type,"input");
equiptype[0].count=2;
equiptype[0].remain=2;
equiptype[0].address=0;
strcpy(equiptype[1].type,"printer");
equiptype[1].count=3;
equiptype[1].remain=3;
equiptype[1].address=2;
strcpy(equiptype[2].type,"disk");
equiptype[2].count=4;
equiptype[2].remain=4;
equiptype[2].address=5;
strcpy(equiptype[3].type,"tape");
equiptype[3].count=1;
equiptype[3].remain=1;
equiptype[3].address=9;
for(i=0;i<10;i++)
{
equipment[i].number=i;
equipment[i].status=1;
equipment[i].remain=0;
}
while(1)
{
printf("\n0-退1-配2-收3-顯示");
printf("\n選擇功能項(0~3):");
scanf("%d",&a);
switch(a)
{
case 0 :
exit(0);
case 1 :
printf("輸入作業名、作業所需設備類設備相號");
scanf("%s%s%d",J,type,&mm);
allocate(J,type,mm);
break;
case 2:
printf("輸入作業名作業歸設備類");
scanf("%s%s",J,type);
reclaim(J,type);
break;
case 3:
printf("\n輸設備類表\n");
printf(" 設備類型 設備總量 空閑設備\n");
for(i=0;i<n;i++)
printf("%9s%8d%9d\n",equiptype[i].type,equiptype[i].count, equiptype[i].remain);
printf("輸設備表:\n");
printf("絕號 /壞 已/未配 佔用作業名 相號\n");
for(i=0;i<m;i++)
printf("%3d%8d%9d%12s%8d\n",equipment[i].number, equipment[i].status,equipment[i].remain,equipment[i].jobname,
equipment[i].lnumber);
}
}
}
『捌』 求代碼~操作系統 進程管理實驗 語言C++ 要求如下:
四、實驗思路和設計
1、進程管理
(1)程序流程圖
由學生自行完成。
(2)主要程序代碼
//PCB結構體
struct pcb{
int id; //進程序號
int ra; //所需資源A的數量
int rb; //所需資源B的數量
int rc; //所需資源C的數量
int ntime; //所需的時間片個數
int rtime; //已經運行的時間片個數
char state; //進程狀態
struct pcb *next;
} *hready=NULL,*hblock=NULL,*p; //hready,hblock分別為指向就緒和阻塞隊列
typedef struct pcb PCB;
int m,n,r,a,b,c,h=0,i=1,time1Inteval; //m為要模擬的進程個數,n為初始化進程個數
//r為可隨機產生的進程數(r=m-n)
//a,b,c分別為A,B,C三類資源的總量
//i為進城計數,i=1…n
//h為運行的時間片次數,time1Inteval為時間片大小(毫秒)
//建立一個PCB結構體型的空鏈表
PCB *increat(void)
{ PCB *head;
head=NULL;
return(head);
}
//從鏈表起始地址開始輸出該鏈表的內容
void disp(PCB *head)
{PCB *p1;
p1=head;
AnsiString str2;
if(head!=NULL) //鏈表非空
{
do
{
str2+=" ";
str2+=IntToStr(p1->id);str2+=" ";
str2+=(p1->state);str2+=" ";
str2+=IntToStr(p1->ra);str2+=" ";
str2+=IntToStr(p1->rb);str2+=" ";
str2+=IntToStr(p1->rc);str2+=" ";
str2+=IntToStr(p1->ntime);str2+=" ";
str2+=IntToStr(p1->rtime);str2+="\r\n";
p1=p1->next;
}while(p1!=NULL); //不斷輸出進程的信息,直到鏈尾!
} //if
else
{ str2+="\t\t該 隊 列 中 沒 有 進 程!\r\n" ;}
Form1->Memo1->Lines->Add(str2);
}
//將進程插入到鏈尾(包括就緒隊列和阻塞隊列)
PCB *insert(PCB *head,PCB*pcb) //帶兩個指針形參:隊列指針和當前進程PCB
{
PCB *pi,*p1;
p1=head;
pi=pcb;
if (head==NULL)
{
head=pi;
pi->next=NULL;
}
else
{
while(p1->next!=NULL)
{p1=p1->next;}
p1->next=pi;
pi->next=NULL;
}
return(head);
}
//對進程進行初始化,建立就緒隊阻塞隊列。
void input()
{
AnsiString str1;
m=StrToInt (Form1->Edit1->Text); //讀取要模擬的進程總數給m
n=StrToInt (Form1->Edit2->Text); //讀取需初始化進程數給n
a=StrToInt (Form1->Edit3->Text); //讀取A類資源的總數給a
b=StrToInt (Form1->Edit4->Text); //讀取B類資源的總數給b
c=StrToInt (Form1->Edit5->Text); //讀取C類資源的總數給c
time1Inteval=StrToInt(Form1->Edit6->Text); //讀取時間片長度給time1Inteval
Form1->Timer1->Interval=time1Inteval;
r=m-n; //計算可隨機產生的進程數為r
for(i=1;i<=n;i++) //初始化n個進程信息
{
p=getpcb(PCB); // #define getpcb(type) (type*)malloc(sizeof(type))
p->id=i;
str1+=" 產生進程ID:";str1+=IntToStr(p->id);str1+="\r\n";
p->ra=(random(a-3)+3);
str1+=" 所需A類資源數:";str1+=IntToStr(p->ra);str1+="\r\n";
p->rb=(random(b));
str1+=" 所需B類資源數:";str1+=IntToStr(p->ra);str1+="\r\n";
p->rc=(random(c-2)+2);
str1+=" 所需C類資源數:";str1+=IntToStr(p->ra);str1+="\r\n";
p->ntime=(random(5)+1);
str1+=" 所需時間片個數:";str1+=IntToStr(p->ntime);str1+="\r\n";
p->rtime=0;
p->next=NULL;
if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0)) //如果資源符合所需要求
{ //則寫入就緒隊列隊尾
a=a-(p->ra); //當前所剩A類資源數目
b=b-(p->rb); //當前所剩B類資源數目
c=c-(p->rc); //當前所剩C類資源數目
p->state='W';
hready=insert(hready,p); //將進程插入就緒隊列
}//if
else //如果資源不符合所需要求,則寫入阻塞隊列隊尾
{
p->state='B';
hblock=insert(hblock,p);
} //if
str1+=" 當前進程狀態:";
str1+=(p->state);
str1+="\r\n";
str1+="\r\n";
}//for
Form1->Memo1->Lines->Add(str1);
}
//輸出就緒隊列和阻塞隊列的信息
void outputall()
{
AnsiString str1,str2,str3;
str3+="\r\n" ;
str3+="= = = = = = = = = = = = = = = CPU時間片運行了: " ;
str3+=IntToStr(h);
str3+=" 次= = = = = = = = = = = = = = =\r\n";
Form1->Memo1->Lines->Add(str3);
str1+="*********************************當 前 就 緒 隊 列 的 信 息" ;
str1+="*********************************\r\n" ;
str1+="進程ID 進程狀態 A資源數 B資源數 C資源數 需要時間片 已運行時間片";
Form1->Memo1->Lines->Add(str1);
disp(hready);
str2+="*********************************當 前 阻 塞 隊 列 的 信 息";
str2+="*********************************\r\n" ;
str2+="\r\n";
str2+="進程ID 進程狀態 A資源數 B資源數 C資源數 需要時間片 已運行時間片";
Form1->Memo1->Lines->Add(str2);
disp(hblock);
}
//運行就緒隊列的頭進程,運行一個時間片(FCFS),輪轉一個時間片
PCB *running(PCB *head)
{
PCB *p1;
p1=head;
AnsiString str4;
If (p1->next==NULL) head=increat();
else {head=p1->next; }
p1->state='R'; //進程狀態由就緒轉向運行
(p1->rtime)++; //已運行時間片數增加1
h++;
str4+="~~~~~~~~~~~~~~~~ 當前正在運行的進程ID是: ";
str4+=IntToStr(p1->id);
str4+=" ~~~~~~~~~~~~~~~~~~\r\n";
str4+="進程ID 進程狀態 A資源數 B資源數 C資源數 需要時間片 已運行時間片\r\n";
str4+=" ";
str4+=IntToStr(p1->id);str4+=" ";
str4+=(p1->state);str4+=" ";
str4+=IntToStr(p1->ra);str4+=" ";
str4+=IntToStr(p1->rb);str4+=" ";
str4+=IntToStr(p1->rc);str4+=" ";
str4+=IntToStr(p1->ntime);str4+=" ";
str4+=IntToStr(p1->rtime);str4+=" ";
Form1->Memo1->Lines->Add(str4);
if(p1->ntime==p1->rtime) //如果已經運行的時間片到達所需次數,該進程結束
{
str4+="\r\n\r\n\t\tID號為:";
str4+=IntToStr(p1->id);
str4+=" 的進程已經完成!!!";
Form1->Memo1->Lines->Add(str4);
a=a+(p1->ra);
b=b+(p1->rb);
c=c+(p1->rc);
free(p1); //釋放當前指針
}
else //如果已經運行的時間片未到達所需次數,該進程運行一個時間片後進入就緒隊列尾
{
p1->state='W';
head=insert(head,p1);
}
return(head);
}
//檢測當前資源數目是否滿足阻塞隊列里進程的需求
void testblock()
{
PCB *p1,*p2;
p1=hblock;
p2=hblock;
AnsiString str5;
while((hblock!=NULL)&&(p1!=NULL))
{
if((a-(p1->ra)>=0)&&(b-(p1->rb)>=0)&& (c-(p1->rc)>=0)) //如果滿足
{if(p1==hblock)
{
hblock=p1->next;
p1->state='W';
hready=insert(hready,p1); //將阻塞的進程插入就緒隊列
a=a-(p->ra);
b=b-(p->rb);
c=c-(p->rc);
str5="\tID號為: " ;
str5+=IntToStr(p1->id);
str5+=" 的進程由阻塞隊列轉入就緒隊列!\r\n";
p1=hblock;
} //if(p1==hblock)
else
{p2->next=p1->next;
p1->state='W';
hready=insert(hready,p1);
str5="\tID號為: " ;
str5+=IntToStr(p1->id);
str5+=" 的進程由阻塞隊列轉入就緒隊列!\r\n";
p1=p2->next;
}//else
} //大if
else
{p2=p1;
p1=p1->next;
} //else
Form1->Memo1->Lines->Add(str5);
} //whlie
}
//檢測是否有新的進程產生,隨機產生新進程
void testnew()
{
int t;
AnsiString str6;
if(r>0) //r=m-n為可隨機產生的進程數目
{
t=random(9); //生成隨機數
if(t<=7) //如果隨機數小於等於7,則產生新進程,否則不產生
{
p=getpcb(PCB);
str6+="有新的進程申請加入:\r\n" ;
p->id=i++; //i為全程變數,表示進程號?
str6+="進程ID:";
str6+=IntToStr(p->id);
str6+="\r\n";
p->ra=(random(a-3)); //隨機分配資源
str6+="所需A類資源數:";
str6+=IntToStr(p->ra);
str6+="\r\n";
p->rb=(random(b-3));
str6+="所需B類資源數:";
str6+=IntToStr(p->rb);
str6+="\r\n";
p->rc=(random(c-3));
str6+="所需C類資源數:";
str6+=IntToStr(p->rc);
str6+="\r\n";
p->ntime=(random(5)+1); //隨機分配時間片總數
str6+="所需時間片個數:";
str6+=IntToStr(p->ntime);
str6+="\r\n";
p->rtime=0; //已運行時間片數初始為0
p->next=NULL;
if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0))
{ //進程滿足要求,進入就緒隊列
a=a-(p->ra); //分配資源給該進程,總資源數減少
b=b-(p->rb);
c=c-(p->rc);
p->state='w';
str6+="當前進程狀態:";
str6+=(p->state);
str6+="\r\n";
hready=insert(hready,p);
str6+="資源滿足新進程需求,該進程進入就緒隊列!";
}//if
else //進程不滿足要求,進入阻塞隊列
{
p->state='B';
hblock=insert(hblock,p);
str6+="當前進程狀態:";
str6+=(p->state);
str6+="\r\n";
str6+="資源不能滿足新進程需求,該進程進入阻塞隊列!" ;
}//else
}//if (t<=7)
Form1->Memo1->Lines->Add(str6);
}//if(r>0)
r--;
}
//系統三類資源變化情況的顯示
void rescore()
{
if(a>a1) {Form1->Edit7->Text=IntToStr(a1);}
if(a<0) {Form1->Edit7->Text=0;}
if(a>=0&&a<a1) {Form1->Edit7->Text=IntToStr(a);}
if(b>b1) {Form1->Edit8->Text=IntToStr(b1);}
if(b<0) {Form1->Edit8->Text=0;}
if(b>=0&&b<=b1) {Form1->Edit8->Text=IntToStr(b); }
if(c>c1) {Form1->Edit9->Text=IntToStr(c1);}
if(c<0) {Form1->Edit9->Text=0;}
if(c>=0&&c<=c1) {Form1->Edit9->Text=IntToStr(c); }
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
runFcfs(); //先來先服務(FCFS)調度演算法
}
//先來先服務(FCFS)調度演算法
void runFcfs()
{
AnsiString str;
if(form1_hready!=NULL) //如果就緒隊列為非空,則不斷運行,直到就緒隊列為空為止
{
outputall(); //輸出就緒隊列和阻塞隊列的信息
form1_hready=running(form1_hready); //將就緒隊列的第一個進程運行一個時間片
testblock(); //檢查阻塞隊列是否有進程可以進入就緒隊列
testnew(); //檢查是否有新進程產生
rescore() ; //系統三類資源變化情況的顯示
}
else
{
Form1->Timer1->Enabled=false;
Form1->Edit7->Text=IntToStr(a1);
Form1->Edit8->Text=IntToStr(b1);
Form1->Edit9->Text=IntToStr(c1);
str+="\r\n\r\n<<<<<<<<<<<<<<<所 有 的 進 程 都 已 經 成 功 運 行 結 束 !>>>>>>>>>>>>>>";
Form1->Memo1->Lines->Add(str);
}
}
//將結果保存成txt文件
void __fastcall TForm1::N8Click(TObject *Sender)
{
if(Form1->SaveDialog1->Execute())
{
FILE* fp=fopen(Form1->SaveDialog1->FileName.c_str(),"w");
if(fp==NULL)
{
MessageBox(NULL,"打開文件出錯","信息",MB_OK);
return;
}
for(int i=0;i<Form1->Memo1->Lines->Count;i++)
{ fputs(Form1->Memo1->Lines->Strings[i].c_str(),fp);
fputc('\n',fp);
}
fclose(fp);
}
}
//開始模擬按鈕單擊執行函數
void __fastcall TForm1::Button1Click(TObject *Sender)
{
runmain();
Form1->Button1->Enabled=false;
Form1->Edit1->Enabled=false;
Form1->Edit2->Enabled=false;
Form1->Edit3->Enabled=false;
Form1->Edit4->Enabled=false;
Form1->Edit5->Enabled=false;
Form1->Edit6->Enabled=false;
}
//清除屏幕按鈕單擊執行函數
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form1->Memo1->Clear();
Button1->Enabled=true;
h=0;
Form1->Edit1->Enabled=true;
Form1->Edit2->Enabled=true;
Form1->Edit3->Enabled=true;
Form1->Edit4->Enabled=true;
Form1->Edit5->Enabled=true;
Form1->Edit6->Enabled=true;
}
//運行的主函數
void runmain()
{
AnsiString str,str1;
input();
Form1->Timer1->Enabled=true; //觸發時鍾,調用runFCFS。
str+="\r\n";
}
『玖』 操作系統課程設計 (包括進程管理、進程的同步和互斥、存儲管理)
一、實驗的目的與基本要求實驗目的本課程設計是為了配合操作系統課程的理論教學而設置的,目的是通過課程設計的綜合訓練,加強學生對操作系統概念的實際應用技能的訓練,提高學生分析問題和解決問題的能力。基本要求課程設計按照教學要求需要兩周時間完成,兩周中每天(按每周5天)至少要上3-4小時的機來調試程序。學生要發揮自主學習的能力,充分利用時間,安排好課設的時間計劃,並在課設過程中不斷檢測自己的計劃完成情況,及時的向教師匯報。課程設計的具體內容如下:設計1 進程管理1. 設計目的加深對進程概念的理解,明確進程和程序的區別;進一步認識並發執行的實質;實現Linux中進程通信的兩種方式:軟中斷和管道通信。2. 設計內容1) 進程的創建和控制編寫一段程序,使用系統調用fork()創建兩個子進程。當此程序運行時,在系統中有一個父進程和兩個子進程活動。每個進程在屏幕上顯示一個字元,記錄屏幕上的顯示結果,並分析原因。修改以編寫的程序,將每個進程輸出一個字元改為每個進程輸出一句話。2) 進程的軟中斷通信使用系統調用fork()創建兩個子進程,使用系統調用signal()讓父進程捕捉用alarm函數設置時鍾的時間段終止時產生的信號,當捕捉到該信號後,父進程使用系統調用Kill()向兩個子進程發出信號,子進程捕捉到信號後分別輸出子進程被殺死信息後終止,父進程等待兩個子進程終止後,輸出父進程被殺死信息後終止程序。記錄屏幕上的顯示結果,並分析原因。3) 進程的管道通信使用系統調用pipe()建立一個管道;兩個子進程分別向管道寫信息,父進程則從管道讀出來自子進程的信息,顯示在屏幕上。記錄屏幕上的顯示結果,並分析原因。3. 系統調用函數說明、參數值及定義1. Fork()創建一個新進程進程int fork()其中返回int取值意義如下:正確返回:在父進程中返回子進程的進程號,在子進程中返回0錯誤返回:-12. Lockf(int files,int function,long size)用作鎖定文件的某些段或者整個文件。file:文件描述符;function:鎖定和解鎖,1表示鎖定,0表示解鎖;size:是鎖定或解鎖的位元組數,若用0,表示從文件的當前位置到文件尾。3. Signal(int sig, (*func) function)進程式控制制軟中斷信號的處理。signal()會依照參數sig指定的信號編號來設置該信號的處理函數。sig: SIGALRM: alarm()函數設置的時鍾的時間段終止時產生的信號.其它信號略function:信號處理的一個函數地址。4. kill(int pid,int sig)向一個進程或一個進程組發信號,可以用來送參數sig指定的信號給參數pid指定的進程。pid: pid>0 將信號傳給進程號為pid的進程其它略signumber: 送給進程號為pid進程指定信號量5. alarm(unsigned int seconds)設置一個指定時間的計時器seconds: 設置時間秒數6. int pipe(int filedes[2])filedes為整數數組名,在調用這個函數後,系統為通道分配的兩個文件描述符將通過這個數組返回到用戶進程中, filedes[1]是文件輸出描述符, filedes[0]是文件輸入描述符7. int wait(int *status)暫停目前進程的執行,直到有信號到來或子進程的結束。子進程的結束狀態指會由參數status返回,如果不在意結束狀態時,則參數status可以設置成NULL設計2 進程的同步與互斥1. 設計目的分析進程爭用資源的現象,學習解決進程互斥的方法。2. 設計內容用程序實現生產者-消費者問題l 問題描述: 一個倉庫可以存放K件物品。生產者每生產一件產品,將產品放入倉庫,倉庫滿了就停止生產。消費者每次從倉庫中去一件物品,然後進行消費,倉庫空時就停止消費。l 數據結構:進程:Procer - 生產者進程,Consumer - 消費者進程 buffer: array [0..k-1] of integer; in,out: 0..k-1; in記錄第一個空緩沖區,out記錄第一個不空的緩沖區 s1,s2,mutex: semaphore; s1控制緩沖區不滿,s2控制緩沖區不空,mutex保護臨界區; 初始化s1=k,s2=0,mutex=1l 原語描述procer(生產者進程): Item_Type item;{while (true){proce(&item);p(s1);p(mutex);buffer[in]:=item; in:=(in+1) mod k;v(mutex);v(s2);}}consumer(消費者進程): out:=(out+1) mod k;v(mutex);v(s1);}}設計3 存儲管理1. 設計目的通過請求頁式存儲管理中頁面置換演算法設計,了解存儲技術的特點,掌握請求頁式存儲管理的頁面置換演算法。2. 設計內容l 將指令序列轉換為用戶虛存中的請求調用頁面流。i. 頁面大小為1Kii. 用戶內存容量為4頁到40頁iii. 用戶外存的容量為40k在用戶外存中,按每K存放10條指令,400條指令在外存中的存放方式為:0-9條指令為第0頁10-19條指令為第1頁。390-399條指令為第39頁按以上方式,用戶指令可組成40頁l 通過隨機數產生一個指令序列,共400個指令(0-399)l 模擬請求頁式存儲管理中頁面置換演算法執行一條指令,首先在外存中查找所對應的頁面和頁面號,然後將此頁面調入內存中,模擬並計算下列各述演算法在不同內存容量下的命中率(頁面有效次數/頁面流的個數)1) 先進先出的演算法(FIFO)2) 最久未使用演算法(LRU)3. 提示l 隨機指令的產生 rand() 或srand()l 用戶內存中頁面控制結構採用鏈表 頁面控制結構 struct p_str{ int pagenum; /* 頁號 */ int count; /* 訪問頁面的次數 */struct p_str next; /* 下一指針 */}p_str;