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

文章目录

    • 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

在这里插入图片描述

在这里插入图片描述

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); 
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916995.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端开发迈向全栈之路:规划与技能

一、前端开发与全栈开发的差异 前端开发主要负责构建和实现网页、Web 应用程序和移动应用的用户界面。其工作重点在于网页设计和布局&#xff0c;使用 HTML 和 CSS 技术定义页面的结构、样式和布局&#xff0c;同时运用前端框架和库如 React、Angular 或 Vue.js 等构建交互式和…

GOLANG+VUE后台管理系统

1.截图 2.后端工程截图 3.前端工程截图

中文书籍对《人月神话》的引用(161-210本):微软的秘密

中文书籍对《人月神话》的引用&#xff08;第001到160本&#xff09;>> 《人月神话》于1975年出版&#xff0c;1995年出二十周年版。自出版以来&#xff0c;该书被大量的书籍和文章引用&#xff0c;直到现在热潮不退。 2023年&#xff0c;清华大学出版社推出《人月神话》…

IO流(五):字节流-输入流(Inpustream)、输出流(OutputStream)--使用场景、弊端、注意事项、代码演示。

目录 1、什么是字节流&#xff1f; 2、字节输入流--FileInputStream 2.1 int read()方式代码演示以及注释 2.1.1 读取一个字节 2.1.2 将整个文件挨个字节读取并打印演示 2.2 int read(byte[] buffer)方式代码演示以及注释 2.2 .1 一次读取3字节演示 2.2.2 一次性读取全…

直流保护电路设计及保护器件参数说明和选型

在工控产品设计中时常会涉及到电源保护的电路设计的问题&#xff0c;在深圳瑞隆源电子给出的参考电路来切入主题&#xff0c;对气体放电管、压敏电阻和TVS这三类保护器件的参数及选型进行详细说明&#xff0c;以达到深刻理解的目的。 图1 直流保护电路 举例说明&#xff0c;若…

FastGPT部署通义千问Qwen和智谱glm模型|OneAPI配置免费的第三方API

继这篇博客之后 从零开始FastGPT本地部署|Windows 有同学问&#xff0c;不想在多个平台申请API-Key&#xff0c;不好管理且要付费&#xff0c;有木有白嫖方案呀&#xff1f; 答&#xff1a;有啊。用硅基流动。 注册方法看这篇 【1024送福利】硅基流动送2000万token啦&#xff0…

机器学习day2-特征工程

四.特征工程 1.概念 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 将任意数据&#xff08;文本或图像等&#xff09;转换为数字特征&#xff0c;对特征进行相关的处理 步骤&#xff1a;1.特征提取&#xff1b;2.无量纲化&#xff08;预处理&#xf…

sql数据库-排序查询-DQL

目录 语法 排序方式 举例 将表按年龄从小到大排序 将表按年龄从大到小排序 ​编辑 多重排序 将表按年龄升序&#xff0c;年龄相同按入职时间降序 语法 select * from 表名 order by 字段名1 排序方式1&#xff0c;字段2 排序方式2; 排序方式 升序&#xff1a;ASC&…

响应“一机两用”政策 落实政务外网安全

在数字化时代&#xff0c;政务办公外网安全的重要性日益凸显&#xff0c;特别是在“一机两用”的背景下&#xff0c;即同一台终端既要处理政务内网的数据&#xff0c;又要访问互联网&#xff0c;这对网络安全提出了更高的要求。深信达SPN安全上网方案&#xff0c;即反向沙箱技术…

测试实项中的偶必现难测bug--互斥逻辑异常

问题: 今天线上出了一个很奇怪的问题,看现象和接口是因为数据问题导致app模块奔溃 初步排查数据恢复后还是出现了数据重复的问题,查看后台实际只有一条数据,但是显示在app却出现了两条一模一样的置顶数据 排查: 1、顺着这个逻辑,我们准备在预发复现这个场景,先是cop…

Burpsuite的安装使用说明——【渗透工具介绍与使用】

# 前记 **工欲善其事必先利其器&#xff0c;本系列先介绍一些常见的安全工具的安装与使用** 该文章介绍的是Burpsuite的安装使用说明 > &#x1f340; 作者简介 > 小菜鸡罢了&#xff0c;研究过漏洞、扫过端口、写过脚本&#xff0c;迷恋着CTF&#xff0c;脑袋里充满了各…

如何在 WordPress 中轻松强制所有用户退出登录

作为一名长期管理 WordPress 网站的站长&#xff0c;我深知维护网站安全性的重要性。尤其是在面对会员网站或付费内容平台时&#xff0c;确保所有用户的登录状态是最新的&#xff0c;是维持网站正常运营的关键之一。今天&#xff0c;我就分享一下如何通过简单的步骤&#xff0c…

SNN学习(2):深入了解SNN及LIF神经元的原理和运行过程

目录 一、STDP机制 1、STDP 的基本原理 权重调整的“时间差依赖性” 2、STDP 的数学模型 二、SNN的应用场景 三、从人工神经网络ANN到脉冲神经网络SNN 1、脉冲 2、稀疏性&#xff08;Sparsity&#xff09; 3、事件驱动处理&#xff08;静态抑制&#xff09; 四、脉冲…

运动汇 专业的比赛管理平台数据获取

在获取到运动汇的网站链接后&#xff0c;界面如图所示: 右键检查&#xff0c;我们会发现没有任何数据&#xff0c;只有当我们点开这些"第一单元"、"第二单元"等&#xff0c;数据才会加载出来&#xff1b; 由于我们只需要分析这一个网页并获取其中的数据&a…

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中&#xff0c;BootLoader 的设计是非常关键的部分&#xff0c;它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoader&…

rust高级特征

文章目录 不安全的rust解引用裸指针裸指针与引用和智能指针的区别裸指针使用解引用运算符 *&#xff0c;这需要一个 unsafe 块调用不安全函数或方法在不安全的代码之上构建一个安全的抽象层 使用 extern 函数调用外部代码rust调用C语言函数rust接口被C语言程序调用 访问或修改可…

45.第二阶段x86游戏实战2-hook监控实时抓取游戏lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

数据结构 ——— 层序遍历链式二叉树

目录 链式二叉树示意图​编辑 何为层序遍历 手搓一个链式二叉树 实现层序遍历链式二叉树 链式二叉树示意图 何为层序遍历 和前中后序遍历不同&#xff0c;前中后序遍历链式二叉树需要利用递归才能遍历 而层序遍历是非递归的形式&#xff0c;如上图&#xff1a;层序遍历的…

Vue3 -- 基于Vue3+TS+Vite项目【项目搭建及初始化】

兼容性注意&#xff1a; Vite 需要 Node.js 版本 18 或 20。然而&#xff0c;有些模板需要依赖更高的 Node 版本才能正常运行&#xff0c;当你的包管理器发出警告时&#xff0c;请注意升级你的 Node 版本。【摘抄自vite官网】 这里我用的node版本是 v18.20.2 创建项目&#xf…

Linux(CentOS 7) yum一键安装mysql8

1、通过yum安装 &#xff08;1&#xff09;下载mysql 在Linux找个地方输入以下命令 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm &#xff08;2&#xff09;安装mysql yum 仓库配置文件 [rootVM-8-15-centos ~]# sudo rpm -Uvh mysql80-c…