pcb管理与调度

#include <stdio.h> 
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
#define RUNNING 0 
#define READY 1 
#define WAIT 2

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;i<n;i++)
{
temp=(PCB *)malloc(sizeof(PCB));
if(!temp)
{
printf("ERROR");
exit(1);
}
temp->pid=i+1; //初始化进程的标识号
temp->pstatus=READY;//进程刚创建时,初始化其状态为"就绪态"
printf("\n请输入进程 %d 的优先级别 :",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("\np<%d> Priority: %d ",r->next->pid,r->next->priority);
}
}

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("\n=================进程调度==================");
if(run!=NULL)
{
run->pstatus=RUNNING;
printf("\np<%d> is Running ......",run->pid);
}
printf("\nThe Ready : ");
print(ready_list);
printf("\nThe 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("\n输入等待态(Wait)转换为就绪态(Ready)的进程标识号 : ");//将指定的等待态进程转为就绪态
scanf("%d",&j);
blockToready(ready_list,wait_list,j);
break;

default :break;
}

}
//调度结束,输出创建进程的相关信息
printf("\n进程模拟调度结束\n");
Display(wait_list);
Display(ready_list);
printf("\np<%d> Priority: %d \n",run->pid,run->priority);

}

时间: 2024-08-03 09:39:41

pcb管理与调度的相关文章

【操作系统】知识点总结之进程管理与调度

1.中央处理器 1.1 CPU:处理器由运算器.控制器.一系列的寄存器以及高速缓存构成 运算器实现指令中的算术和逻辑运算,是计算机计算的核心 控制器负责控制程序运行的流程,包括取指令.维护CPU状态.CPU与内存的交互等等 寄存器是指令在CPU内部作处理的过程中暂存数据.地址以及指令信息的存储设备.在计算机的存储系统中它具有最快的访问速度.包括用户可见寄存器,控制寄存器. 用户可见寄存器 高级语言编译器通过算法分配并使用之,以减少程序访问主存次数 包括通用寄存器.数据寄存器.地址寄存器 数据寄存

Linux进程管理与调度-之-目录导航【转】

转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 项目链接 进程的描述 进程的创建 进程的加载与运行 进程的退出 进程的调度 调度普通进程-完全公平调度器CFS 日期 内核版本 架构 作者 GitHub CSDN 2016-07-21 Linux-4.6 X86 & arm gatieme

Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872659 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 前景回顾 1 Linux的调度器组成 2 调度工作 进程上下文 1 进程上下文的概念 2 上下文切换 context_switch进程上下文切换 1 context_switch完全注释 2 prepare_arch_switch切换前的准备工作

Linux进程优先级的处理--Linux进程的管理与调度(二十二)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 1 前景回顾 1.1 进程调度 内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来. 调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换. 内核必须提供一种方法, 在各个进程之间

Linux内核线程kernel thread详解--Linux进程的管理与调度(十)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-02 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程就是内核的分身,一个分身可以处理一件特定事情.内核线程的调度由内核负责,一个内核线程处于阻

Maven之——Nexus权限管理与调度任务

Maven之--Nexus权限管理与调度任务 1.    Nexus的权限管理 出于安全性考虑.需要对Nexus仓库进行权限管理.比如只有管理员才能配置Nexus.某个项目组有特定的仓库.等等 2.    Nexus的访问控制模型 Nexus基于权限(Privilege)做访问控制的.一个用户可以被赋予一个或者多个角色.一个角色可以包含一个或者多个权限.还可以包含一个或者多个角色.用户必须拥有相应的角色继而拥有相应权限.才能做相应操作. Nexus预定义了三个用户.以admin登录.单击左边导航

Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四))

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 Linux进程的退出 linux下进程退出的方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit的区别和联系 _exit是linux系统调用,关闭所有文件描述符,然后退出进程. exit是c语言的库函数,他最

Linux内核设计基础(九)之进程管理和调度

在Linux中进程用结构体task_struct来管理一个进程所需的所有信息(所以一般较大,在32位机上,大约有1.7KB).为了提高效率,Linux使用了一些卓越的技术. 通过slab分配task_struct结构 Linux创建进程迅速,正是因为slab分配器预先分配和重复使用task_struct,这样就避免了动态分配和释放所带来的资源消耗(毕竟一个task_struct较大,而且内核中进程的创建和消除很频繁). 将task_struct放置在内核栈的尾端 这样做是为了让那些像x86那样寄

ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-04 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 加载和动态链接 从编译/链接和运行的角度看,应用程序和库程序的连接有两种方式. 一种是固定的.静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中: 另一种是动态链接,是指库函数的代码并不进入应用软件的目标映像,应用软件在编译/链接阶段并