搜索
您的当前位置:首页正文

进程管理

来源:易榕旅网


设计一个先来先服务的调度算法实现处理机调度

实验内容:

假设系统中有3-5个进程,每个进程由一个进程块(PCB)来识别。进程控制块结构如图所示

进程名 (1)

连接指针 进程名:即进程标识

到达时间

链接指针:按照进程到达系统的时间将处于就绪状态的 估计运行时间 进程连接成一个就绪队列。指针指出下一个到达的进程 进程状态 控制块首地址。最后一个的进程的链接指针为NULL。

估计运行时间:可由设计者任意指定一个时间值。

到达时间:进程创建时系统时间或由用户指定,调度时,总是选择到达时间最早的进程。

进程状态:为简单起见,这里假定进程有两种状态:就绪和完成。就绪状态用“R”表示,完成状态用“C”表示。假定进程一创建就处于就绪状态,运行时间结束时,就被置成完成状态。

(2)设置一个队首指针head用来指出最先进入系统的进程,各就绪进程通过链接指针连在一起。

(3)处理机调度时总是选择队首指针指向的进程投入运行。由于本实验是模拟实验,所以被选中进程并不实际启动运行,而只是执行:估计运行时间减1.用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。

(4)在所设计的程序中应有显示或打印的语句,能显示或打印正运行的程序名字,已运行时间和剩余时间,就绪队列中的进程名等。所有进程完成时,给出各进程的周转时间和平均周转时间。

1013022056 计102 林洵

实验程序:

#include using namespace std;

struct pcb //进程控制块 { char pname[512]; //进程名 int runtime; //运行时间 int arrtime; //到达时间 char state; //进程状态 int rtime; //进程周转时间

pcb *next; //指向下一个进程 };

void input(pcb *head,int n) //进程的输入函数 { pcb *t=head; for(int i=0;i>p->pname>>p->runtime>>p->arrtime; p->next=t->next; t->next=p; t=p; } }

void output(pcb *head,int n) //进程的输出函数 { pcb *x,*p; x=new pcb; p=new pcb; //工作指针 p=head->next; int time=0; float a,b,c,d,e,f=0; //a用来控制程序的循环,b为暂存周转时间,c用来定位,d用来暂存运行时间也用来控制循环,e用来控制循环 //f为所有进程的周转时间和 float g; //g为平均周转时间 time=p->arrtime; for(int i=0;iruntime; x=p; //x暂时保存p的位置,下面p会有很多改变,方便恢复 while(a if(p->next->arrtime<=time) p->next->state='R'; //置状态位 p=p->next;} p=head->next; //重新将p定义到目前正在运行的进程 for(c=0;cnext;} cout<state=='R') cout<pname<<\" \"<state<next; } time++; //时间继续运行 a++; p=x; //恢复p }

b=time-p->arrtime; //一个进程运行结束 p->state='C'; //置状态位 p->rtime=b; //置周转时间 f+=b; //累计周转时间

cout<next;

for(e=0;estate=='C') {cout<<\"进程名,状态,周转时间\"<pname<<\" \"<state<<\" \"<rtime<next; }

p=x->next; if(p!=NULL) //当上一个进程结束后将下一个进程的状态位改变,d是随意设置,目的是改变状态位 {p->state='d';} } g=f/n; //结算平均周转时间 cout<<\"平均周转时间:\"<int main(void) //主函数 { int n; cout<<\"几个进程:\"; cin>>n; pcb *head; head=new pcb; head->next=NULL; input(head,n); output(head,n); return 0; }

实验结果:

用三个进程来进行实验.

心得体会:

熟练的使用进程控制块来控制进程。了解更多的关于进程的各方面的知识。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top