### 操作系统模拟进程调度算法 #### 一、概述 在计算机科学中,进程调度是操作系统内核的一个关键部分,负责根据不同的策略选择一个进程占用处理器执行。本篇将详细介绍如何使用 C 语言来实现一个简单的进程调度模拟器,特别关注的是先来先服务(FCFS)调度算法。该模拟器通过创建一系列的进程并按照它们进入就绪队列的顺序进行调度,从而实现了基本的进程管理功能。 #### 二、代码解析 ##### 2.1 基础定义与数据结构 代码首先定义了一些基础常量和数据结构: - `MAXSIZE` 定义了最大进程数量为 10。 - `PCB` 结构体代表了进程控制块(Process Control Block),包含了进程的基本属性如 ID、优先级、已经使用的 CPU 时间、还需要的时间、总运行时间以及状态等。 - 使用双向链表来管理这些进程,其中 `head` 和 `tail` 分别指向前导节点和尾节点。 ##### 2.2 进程管理函数 接下来是一系列用于进程管理的函数: - **`print_pro(PCB pcb)`**:打印单个进程的信息。 - **`allprint()`**:打印当前所有进程的状态信息,包括每个进程的 ID、优先级、已用 CPU 时间、剩余时间、总时间及状态。 - **`num_rand()`**:初始化进程编号,通过随机排列的方式为每个进程分配唯一的编号。 - **`creat_pro(pPCB pcb)`**:创建一个新的进程,并将其添加到进程列表中。 - 首先调用 `num_rand()` 函数初始化编号。 - 设置进程的各项属性,如 ID、优先级、需要的 CPU 时间等。 - 将进程的状态设置为 “就绪”。 - **`run_pro(pPCB pcb)`**:运行进程一段时间(默认为 4 个时间单位)。 - 更新进程的 CPU 使用时间和总运行时间。 - 如果进程还有剩余时间,则更新状态为 “运行中”,否则将状态设置为 “销毁” 并输出相关信息。 - 最后调用 `allprint()` 打印所有进程的状态。 - **`wait_pro(pPCB pcb)`**:将进程的状态设置为 “等待”。 ##### 2.3 调度算法实现 **`FCFS(int m)`** 实现了先来先服务调度算法: - 创建指定数量 `m` 的进程。 - 按照创建的顺序运行每个进程,直到它们全部完成。 #### 三、进程调度详解 ##### 3.1 先来先服务 (FCFS) FCFS 调度算法是一种非常简单但效率较低的调度方式。它按照进程到达就绪队列的顺序依次调度。当一个进程完成或等待 I/O 操作时,下一个到达的进程将被选中执行。这种调度策略的优点是简单且公平,缺点是可能会导致响应时间较长的进程等待较长时间。 在本模拟器中,进程的创建是随机的,但一旦创建完成后,它们就会按照创建顺序依次运行,直至完成。 ##### 3.2 进程状态转换 进程在生命周期中会经历多种状态的变化,主要包括: - **就绪(Ready)**:进程已经准备好运行,只需要获得 CPU 控制权。 - **运行(Running)**:进程正在 CPU 上运行。 - **等待(Waiting)**:进程因为等待某个事件的发生而无法继续运行,例如等待 I/O 操作完成。 - **销毁(Destroyed)**:进程已完成所有任务并退出。 在本模拟器中,进程的状态主要涉及“就绪”、“运行中”和“销毁”。 #### 四、总结 通过上面的分析,我们可以看到这个模拟器使用 C 语言实现了基于 FCFS 算法的简单进程调度。虽然其功能相对简单,但它提供了一个很好的起点,用于理解进程调度的基础概念和技术。对于学习操作系统原理的学生来说,这不仅有助于理解进程管理的核心概念,还可以作为进一步探索更复杂调度算法的跳板。
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define MAXSIZE 10 //最大进程数
#define Myprint printf("PCB:=======================================\nID\tPrioity\tCPUtime\tNeed\tTotal\tState\n")
typedef struct pro_pcb
{ int id;//进程名
int prio; //进程优先数
int cputime;//进程占有cpu时间
int needtime;//进程完成还需要的时间
int totaltime;//进程实际完成所用实际
char state[10];//进程状态
struct pro_pcb *next;//队列指针
}PCB,*pPCB;
/***********************定义全局变量 */
pPCB head=NULL,tail=NULL;//队列指针
int n=0;//已经创建的进程数
int i=0;
int nowtime=0;//系统时间
int num[MAXSIZE],rand_num=0;//用于取随机数
/*********************/
void print_pro(PCB pcb)//输出进程信息
{ printf("%d\t%d\t%d\t%d\t%d\t%s\n",pcb.id,pcb.prio,pcb.cputime,pcb.needtime,pcb.totaltime,pcb.state);
}
void allprint()
{ if(head==NULL) return;
pPCB p=head;
printf("ID\tPrioity\tCPUtime\tNeed\tTotal\tState\n");
while(p!=NULL)
{ print_pro(*p);
p=p->next;
}
printf("end:=======================================\n");
}
void num_rand()/*打乱数组形成随机数*/
{ for ( i=0;i<10;i++) num[i]=i+1;
srand(time(NULL));
for (int i=0;i<10;i++)
{ int j=0,temp;
j=rand()%MAXSIZE;
temp=num[i];num[i]=num[j];num[j]=temp;
}
}
void creat_pro(pPCB pcb)//创建进程
{ num_rand();
if(n==0) {head=pcb;}
else
{ tail->next=pcb;// 加入到等待队列
}
pcb->id=++n;
pcb->prio=num[(rand_num++)%MAXSIZE];
pcb->cputime=0;
pcb->needtime=num[(rand_num++)%MAXSIZE]%3*10+num[(rand_num++)%MAXSIZE];//进程需占有cpu时间设为两位数
pcb->totaltime=0;
strcpy(pcb->state,"ready");
pcb->next=NULL;
剩余7页未读,继续阅读
- 粉丝: 1
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ssrf-king-main.zip
- 适用于 Python 的 Docker 官方镜像打包
- 基于springboot的人事系统源码(java毕业设计完整源码+LW).zip
- 贝叶斯回归算法是一种基于贝叶斯定理的回归分析方法
- 软件测试方法和技术 复习大纲总结
- 5_base.apk.1
- 基于springboot的视频网站系统的设计与实现源码(java毕业设计完整源码+LW).zip
- Anaconda3-2024.10-1-Windows-x86-64
- 密探.zip渗透测试工具
- “借阅便捷化”:SSM框架在图书管理系统中的应用
- Shell教程v1.0中文PDF完整版最新版本
- CNC编程员个人简历模板
- 基于springboot的图书进销存管理系统源码(java毕业设计完整源码+LW).zip
- C编程中如何使用设计模式中的Policy策略模式
- netty封装的modbus-tcp协议,可以同时访问多个plc并自动解析
- Linux下的多线程编程电脑资料