操作系统实验:在linux下用c语言模拟进程调度算法程序

devtools/2024/11/16 15:15:43/

文章目录

    • 1、实验内容
    • 2、实验结果及分析
    • 3、如何在linux下编写并执行c语言程序以及实验源代码
  • gcc -o test test.c

1、实验内容

1)用C语言编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。

(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:
进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1。
进程每运行一个时间片,优先数减3。
(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。
(5)分析程序运行的结果,谈一下自己的认识。

2、实验结果及分析

1、调度程序的运行实验结果截图
在这里插入图片描述
图1
在这里插入图片描述
图2
在这里插入图片描述
图3
分析:
图1和图2模拟了一个简单的进程调度过程,根据进程的优先级和运行时间来进行调度,直到所有进程运行完成。
具体而言,1、进程控制块(PCB):定义了一个结构体 pcb 用来表示进程控制块,包括进程名、状态、优先级、需要运行时间、已经运行时间等信息。使用了 typedef 将 struct pcb 重命名为 PCB,提高代码可读性。
2、它其中有一个进程优先级排列函数sort(),对进程根据其优先级进行排序,以便按照优先级高低进行调度。使用的是插入排序的思想,根据进程的优先级将其插入到就绪队列中的适当位置。3、然后用户输入需要调度的进程数量以及每个进程的信息,包括进程名、优先级、需要运行时间等。每个进程被创建后,调用 sort() 函数将其按优先级插入到就绪队列中。
4、就绪队列长度计算函数 space():返回当前就绪队列的长度。
5、进程显示函数 disp():用于显示当前进程的信息。
6、进程查看函数 check():显示当前正在运行的进程和就绪队列的状态。
7、进程撤消函数 destroy():进程运行结束后调用,释放进程控制块占用的内存。
8、进程就绪函数 running():进程运行时间到时,将进程状态置为就绪,更新其优先级,并重新排序就绪队列。
9、主函数 main():调用 input() 函数创建进程。循环执行进程调度过程,直到所有进程都运行完成。在每次循环中,从就绪队列中取出一个进程进行运行,调用 check() 函数显示当前状态,然后调用 running() 函数执行进程,并等待用户按键继续。

图3
优先数法
进程就绪队列按优先数大小从高到低排列,链首进程首先投入运行。进程每执行一次,进程需要的时间片数减1、该进程的优先数减3。这样,该进程如果在一个时间片中没有完成,其优先数降低一级。接着仍是用该进程降低一级后的优先数与就绪队列中链首进程的优先数进行比较,如果仍是该进程的优先数高或相同,便让该进程继续执行;否则,调度就绪队列的链首进程投入运行。原运行过的进程按其现行优先数大小插入就绪队列,且改变它们对应的进程状态,一直到所有进程都运行完各自的时间片数。
(3) 时间轮转法
进程就绪队列按各进程进入的先后顺序排列。进程每次所需处理机的轮转式按其重要程度记入进程控制块中的轮转时间片数记录项。进程执行时,每运行一个时间片,进程还需要的时间片数减1,运行进程占用处理机的时间片数加1,然后比较占用CPU的时间片数是否与该进程的轮转时间片数相等,若相等则说明已达到轮转时间,应将现运行的进程排列就绪队列的末尾,调度队列上的首进程运行,且改变它们的进程状态,直至所有进程完成各自的时间片。
————————————————
来自这篇文章
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/g15827636417/article/details/53365903

在这里插入图片描述

在这里插入图片描述

linuxc_56">3、如何在linux下编写并执行c语言程序以及实验源代码

1,使用vim编辑器编写程序,可在终端输入命令:sudo apt-get install vim 下载最新vim
在这里插入图片描述

2,需要下载c语言的编译器gcc,在终端输入命令:sudo apt-get install gcc 下载gcc

在这里插入图片描述
3,使用vi非常的简单,命令 # vi filename ,即可打开filename的文件,如果filename不存在则会新建一个。这里我们输入命令 :
vi test.c
在这里插入图片描述
4,我们进入文件后,这是一般模式,你还不能输入任何字符,键入字符 i,,左下角显示 插入模式,表示我们进入了编辑模式,这时可以直接敲代码了。

敲好源程序后,我们先按 Esc 键退出编辑模式,再输 shift+: 键进入命令行模式,左下角出现 :号,我们输入 wq,表示 保存并退出 ;再按Enter键即可。
在这里插入图片描述
我们又来到了终端界面,这时候有了源文件,我们来编译,命令如下:

gcc -o test test.c

成功后,我们查看当前目录下出现一个名为test 的可执行文件,

接着执行,通过命令# ./test 即可执行 !
在这里插入图片描述
该部分来源此文章
源代码
代码一

#include "stdio.h" 
#include <stdlib.h> 
#define getpch(type) (type*)malloc(sizeof(type)) struct pcb { /* 定义进程控制块PCB */ char name[10]; //进程名char state;    //进程状态:"W"-就绪态,"R"-运行态int nice;      //进程优先级int ntime;     //需要运行时间int rtime;     //已经运行的时间struct pcb* link; 
}*ready=NULL,*p; 
typedef struct pcb PCB; char sort() /* 建立对进程进行优先级排列函数,优先数大者优先*/ 
{ PCB *first, *second; int insert=0; if((ready==NULL)||((p->nice)>(ready->nice)))/*优先级最大者,插入队首*/ { p->link=ready; ready=p; } else /* 进程比较优先级,插入适当的位置中*/ { first=ready; second=first->link; while(second!=NULL) { if((p->nice)>(second->nice)) /*若插入进程比当前进程优先数大,*/ { /*插入到当前进程前面*/ p->link=second; first->link=p; second=NULL; insert=1; } else /* 插入进程优先数最低,则插入到队尾*/ { first=first->link; second=second->link; } } if(insert==0) first->link=p; } 
} char input() /* 建立进程控制块函数*/ 
{ int i,num; printf("\n 请输入被调度的进程数目:"); scanf("%d",&num); for(i=0;i<num;i++) { printf("\n 进程号No.%d:",i); 

http://www.ppmy.cn/devtools/134463.html

相关文章

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中&#xff0c;我们通常会将某些常见组件进行二次封装&#xff0c;以便更好地实现特定的业务需求。然而&#xff0c;在封装 Table 组件时&#xff0c;遇到一个问题&#xff1a;Table 内部暴露的方法&#xff0c;在封装之后的组件获取不到。 代码展示为&#xff1a; …

坚果云·无法连接服务器(无法同步)

cmd&#xff0c;右键选择&#xff1a;以管理员身份打开输出netsh winsock reset&#xff0c;重启计算机即可 &#xff08;这是由于某些代理防火墙导致的&#xff1b;关闭代理&#xff0c;使用代理设置清理器&#xff09; 如果还不行&#xff0c; 换用移动热点、关闭有线网络&a…

鸿蒙动画开发06——打断动画

1、前 言 UI界面除了运行动画之外&#xff0c;还承载着与用户进行实时交互的功能。当用户行为根据意图变化发生改变时&#xff0c;UI界面应做到即时响应。 例如用户在应用启动过程中&#xff0c;上滑退出&#xff0c;那么启动动画应该立即过渡到退出动画&#xff0c;而不应该…

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

芯原科技嵌入式面试题及参考答案

Linux 相关驱动怎么写? 在 Linux 中编写驱动主要有以下步骤。 首先,需要了解设备的硬件特性。这包括设备的工作原理、寄存器地址和功能、中断号等信息。例如,对于一个简单的 GPIO 设备,要知道其数据寄存器、方向寄存器的位置以及读写操作的规则。 然后是模块的初始化部分。…

【全面系统性介绍】虚拟机VM中CentOS 7 安装和网络配置指南

一、CentOS 7下载源 华为源&#xff1a;https://mirrors.huaweicloud.com/centos/7/isos/x86_64/ 阿里云源&#xff1a;centos-vault-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 百度网盘源&#xff1a;https://pan.baidu.com/s/1MjFPWS2P2pIRMLA2ioDlVg?pwdfudi &…

Kotlin约束泛型参数必须继承自某个父类

Kotlin约束泛型参数必须继承自某个父类 open class SuperData { }class DataA : SuperData {constructor() {println("DataA constructor")} }class DataB : SuperData {constructor() {println("DataB constructor")} }fun <T : SuperData> myfun(p…

利用服务工作线程serviceWorker缓存静态文件css,html,js,图片等的方法,以及更新和删除及版本控制

Service Worker 是一种运行在浏览器背后的独立线程&#xff0c;可以用来处理推送通知、后台同步、缓存等任务。以下是使用 Service Worker 来缓存图片的一个基本示例&#xff1a; 1、注册 Service Worker: 首先&#xff0c;你需要在你的 JavaScript 文件中注册 Service Worker。…