概述
- List item
进程的状态和转换
一 实验目的
1.了解进程状态转换的模型:进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态。
2.了解并掌握进程控制块的结构定义。就绪;执行;阻塞;转换条件。
二 实验要求
1.认真阅读并理解教材上进程控制块的作用。
2.正确编写进程控制块作用的模拟程序并能上机运行。
其中必须完成:
定义多个进程实体(2个以上);
初始化进程实体
标识进程状态
依次输出每个执行进程的开始时间和周转时间
选择完成:
采用随机函数模拟进程的到达时间;
采用随机函数产生每个进程实体的执行时间;
三 代码
#include <stdio.h>
#include <stdlib.h>
typedef struct PCB
{
int name; // 进程编号
char state; // 进程状态
int arrivaltime; // 进程的到达时间
int runtime; // 进程的执行时间
int cputime; // 进程已执行时间
int proirity; // 优先级
struct PCB *next;
}pcb;
pcb *head = NULL; // 正常队列
pcb *wait = NULL; // 未到达队列
int n = 0; // 进程数目
//创建头指针
void createhead()
{
pcb *p = (pcb*)malloc(sizeof(pcb));
head = p;
pcb *q = (pcb*)malloc(sizeof(pcb));
wait = q;
}
void sort()// 按照优先级进行排序
{
pcb* t = head;
pcb *q, *p, *r;
int max;
while (t->next != NULL)
{
p = t->next;
r = t->next;
max = r->proirity;
while (r != NULL)
{
if (r->proirity > max)
{
max = r->proirity;
p = r;
}
r = r->next;
}
q = t;
while (q->next != p)
q = q->next;
if (t->next != p)
{
q->next = p->next;
p->next = t->next;
t->next = p;
}
t = t->next;
}
}
bool create() //创建pcb
{
createhead();
pcb *p = head;
pcb *q = wait;
printf("请输入进程数目:");
scanf("%d", &n);
pcb *temp;
for (int i = 1; i <= n; i++)//尾插法建立就绪队列
{
temp = (pcb*)malloc(sizeof(pcb));
if (!temp) return false;
printf("请输入进程%d的运行时间,进程优先数,到达时间:", i);
scanf("%d %d %d", &(temp->runtime), &(temp->proirity), &(temp->arrivaltime));
temp->cputime = 0;
temp->name = i;
temp->next = NULL;
temp->state = 'W';
if (temp->arrivaltime != 0) // 对到达时间进行判断
{
q->next = temp;
q = temp;
}
else
{
p->next = temp;
p = temp;
}
}
sort(); // 排序
return true;
}
void destory(pcb *rp)// 撤销操作
{
printf("****************进程%d已完成****************n", rp->name);
pcb *q = rp->next;
head->next = q;
free(rp);
}
void display(pcb *rp) // 打印信息
{
printf("进程编号:%d", rp->name);
printf("n进程优先级:%d", rp->proirity);
printf("n进程所占时间片:%d", rp->runtime);
printf("n进程已运行时间:%d", rp->cputime);
printf("n进程当前状态:%c", rp->state);
printf("n=====================================n");
}
void arrivaltime()// 对于到达时间-1的操作
{
pcb *q = wait->next;
pcb *r, *t;
while (q != NULL) // 判断到达时间是否为0 此时是否到达
{
q->arrivaltime--;
if (q->arrivaltime == 0)
{
t = wait;
while (t->next != q)
t = t->next;
t->next = q->next;
r = head->next;
q->next = r;
head->next = q;
}
q = q->next;
}
}
void runpcb(pcb *rp)
{
rp->cputime++; //修改cpu占用的时间 arrivaltime();
printf("----------正在运行的进程----------n"); // 输出正在运行的队列
display(rp);
if (rp->cputime == rp->runtime)
{
destory(rp);
}
else
{
rp->proirity--;
rp->state = 'W';
}
pcb *p = head;
if (head->next == NULL && wait->next == NULL) return;
printf("----------处于就绪对列的进程----------n"); // 输出就绪的队列
while (p->next != NULL)
{
display(p->next);
p = p->next;
}
pcb *q = wait;
while (q->next != NULL)
{
display(q->next);
q = q->next;
}
sort();
}
int main()
{
create();
pcb * p;
while (head->next != NULL || wait->next != NULL)
{
if (head->next != NULL)
{
p = head->next;
p->state = 'R';
runpcb(p);
}
else
{
arrivaltime();
}
}
return 0;
最后
以上就是缓慢御姐为你收集整理的2021-8-15的全部内容,希望文章能够帮你解决2021-8-15所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复