这是操作系统课上的一次作业,我是属于旁听去的,也许正是由于旁听的缘故,对作业总是抱着一中拖延的心态,没花什么心思在这门课的作业上。这次的进程调度作业其实早已经上交了,这两天想写点程序了,顺便更新下博客里面的内容。闲话少说,上程序了,不会组织语言,只能多写点注释了
基本构造:
使用数据结构struct PCB表示进程, 记录进程的相关信息,设置三个队列(链表),分别是就绪队列、执行队列和等待PCB队列。程序初始化的时候先创建空闲PCB队列,然后根据用户输入的进程数量创建进程并构成进程就绪队列。随机调度进程,最后结束调度,输出所有进程状态。
#define RUNNING 0
#define READY 1
#define WAIT 2
#include
#include
#include
#include
typedef struct PCB
{
int pid;//进程的标识号
int priority;//进程的优先级,数值越大,优先级越高
int pstatus;//进程的状态
struct PCB * next;//指向下一个进程的指针
}PCB;
PCB * Create(int n)
{
//head指向头节点的指针,cur表示指向当前结点的指针
PCB * head,* temp,* cur;
int i;
head=(PCB *)malloc(sizeof(PCB));//分配空间
if(head==NULL)//分配失败
{
printf("ERROR");
exit(1);
}
cur=head;head->next=NULL;//头结点
for(i=0;ipid=i+1; //初始化进程的标识号
temp->pstatus=READY;//进程刚创建时,初始化其状态为"就绪态"
printf("
请输入进程 %d 的优先级别(Int型) :",temp->pid);
scanf("%d",&temp->priority);//由用户输入进程的优先级并初始化,写入对应的PCB表
temp->next=NULL;
cur->next=temp;
cur=cur->next;
}
return head;//返回指向头结点的头指针
}
void Insert(PCB * head,PCB * cur)
{
if(cur==NULL)
return;
for(;head->next!=NULL;head=head->next);
cur->next=NULL;
head->next=cur;
}
PCB * readyTorun(PCB * head)
{
PCB * temp1=head,* temp=head->next;
if(head->next==NULL)
{
printf("The Ready is NUll!");
temp=NULL;
}
for(;head->next!=NULL;head=head->next)
{
if(temp->priority < head->next->priority)//当前优先级小于下一结点优先级
{
temp1=head;
temp=head->next;//temp记录选中的进程的PCB
}
}
if(temp!=NULL)
temp1->next=temp->next;//从就绪进程的PCB链表中去除选中进程的PCB
return temp;//返回该结点
}
void blockToready(PCB * ready,PCB * wait,int j)
{
PCB * temp1=wait,* temp=wait->next;
if(wait->next==NULL)
{
printf("The Wait is Null!");
}
for(;wait->next!=NULL;wait=wait->next)//寻找指定进程的PCB
{
if(wait->next->pid==j)
{
temp1=wait;
temp=wait->next;
}
}
if(temp!=NULL)
{
temp1->next=temp->next;//从等待PCB链表中去除选中的PCB
temp->pstatus=READY;//将选中进程的PCB状态改为就绪态
}
Insert(ready,temp);//向就绪PCB链表中插入选中的PCB
}
void print(PCB * head)
{
PCB * temp=head->next;
if(head->next==NULL)
{
printf("It is NULL");
return;
}
for(;temp!=NULL;temp=temp->next)
{
printf("p<%d> ",temp->pid);
}
}
void Display(PCB * r)
{
for(;r->next!=NULL;r=r->next)
{
printf("
p<%d> information : PID: %d Priority: %d Pstatus: %d",r->next->pid,r->next->pid,r->next->priority,r->next->pstatus);
}
}
void Destroy(PCB * head)
{
PCB * temp=head->next,* cur=NULL;
if(temp==NULL)
return;
for(;temp!=NULL;)
{
cur=temp;
temp=temp->next;
free(cur);
}
}
int main()
{
int n,k=1,j;
struct PCB * ready_list=NULL,* wait_list=NULL,* run=NULL;
wait_list=(struct PCB *)malloc(sizeof(struct PCB));
wait_list->next=NULL;
printf("请输入准备创建的进程数 :");
scanf("%d",&n);
ready_list=Create(n);//根据用户输入,创建进程
run=readyTorun(ready_list);//从就绪PCB链表中选择优先级最高的进程,进入CPU运行
srand((unsigned)time(NULL));//产生一个随机种子
while(k!=0)
{
int i = rand() % 4 ;//在0-3中随机产生一个数,0表示退出
k=i;
printf("
=================进程调度==================");
if(run!=NULL)
{
run->pstatus=RUNNING;
printf("
p<%d> is Running ......",run->pid);
}
printf("
The Ready : ");
print(ready_list);
printf("
The Wait : ");
print(wait_list);
switch(i)
{
case 1 :
run->pstatus=READY;
Insert(ready_list,run);//将当前运行态的进程转为就绪态
run=readyTorun(ready_list);//系统自动从就绪PCB链表选择高优先级进程投入运行态
break;
case 2 :
run->pstatus=WAIT;
Insert(wait_list,run);//将当前运行态的进程转为等待态
run=readyTorun(ready_list);//系统自动从就绪PCB链表选择高优先级进程投入运行态
break;
case 3 :
printf("
输入等待态(Wait)转换为就绪态(Ready)的进程标识号 : ");//将指定的等待态进程转为就绪态
scanf("%d",&j);
blockToready(ready_list,wait_list,j);
break;
default :break;
}
}
//调度结束,输出创建进程的相关信息
printf("
进程模拟调度结束
");
printf("
所有进程信息详细信息 :
");
Display(wait_list);
Display(ready_list);
printf("
p<%d> information : PID: %d Priority: %d Pstatus: %d
",run->pid,run->pid,run->priority,run->pstatus);
//销毁创建进程的链表
Destroy(ready_list);
Destroy(wait_list);
ready_list=NULL;
return 0;
}