操作系统实验:在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); 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙开发】第十一章 Stage模型应用组件-任务Mission

目录 1 任务(Mission)管理场景 2 任务&#xff08;Mission&#xff09;与启动模式 2.1 singleton单实例模式 2.2 multiton多实例模式 2.3 specified指定实例模式 3 页面栈及任务链 3.1 页面栈 3.2 任务链 4 设置任务快照的图标和名称 4.1 设置任务快照的图标&#xf…

postgresql.conf与postgresql.auto.conf区别

1. 简介 PostgreSQL 9.4版本开始引入postgresql.auto.conf 配置文件&#xff0c;作为postgresql.conf文件的补充&#xff0c;在配置文件格式上&#xff0c;它和postgresql.conf保持一致 1.1 postgresql.conf 这是一个静态的参数文件&#xff0c;包含了数据库服务器的基本配置…

如何实现主备租户的无缝切换 | OceanBase应用实践

对于DBA而言&#xff0c;确保数据库的高可用性、容灾等能力是其日常工作中需要持续思考和关注的重要事项。一方面&#xff0c;可以利用数据库自身所具备的功能来实现这些目标&#xff1b;若数据库本身不提供相应功能&#xff0c;DBA则需寻找其他工具来增强数据库的高可用性和容…

STM32芯片EXIT外部中断的配置与原理

配置EXIT外部中断其实就是把GPIO刀NVIC的各个外设配置好 第一步&#xff1a;配置RCC&#xff0c;把我们涉及到的外设的时钟都打开 &#xff08;此处EXTI是默认打开的&#xff0c;而NVIC是内核外设无需配置&#xff09; 第二步&#xff1a;配置GPIO,选择端口为输入模式 第三…

栈相关算法题1|通过栈判断链表是否对称|共享栈入栈出栈|括号匹配|多种括号配对|递归求序列最大值(C)

通过栈判断链表是否对称 设单链表的表头指针为L&#xff0c;data域为字符型&#xff0c;判断该链表的全部n个字符是否中心对称 xyx&#xff0c;xyyx 算法思想 使用栈来判断链表中的数据是否中心对称&#xff0c;让链表的前一半元素依次进栈 在处理链表的后一半元素时&#x…

[Mysql] Mysql的多表查询----多表关系(上)

1、介绍 在实际开发中&#xff0c;一个项目通常需要很多张表才能完成。例如&#xff1a;一个商城项目就需要分类表、商品表、订单表等多张表。且这些表的数据之间存在一定的关系。 2、多表关系 Mysql多表之间的关系可以概括为&#xff1a;一对一、一对多/多对一、多对多关系…

【数据分享】全国农产品成本收益资料汇编(1953-2024)

数据介绍 一、《全国农产品成本收益资料汇编 2024》收录了我国2023年主要农产品生产成本和收益资料及 2018年以来六年的成本收益简明数据。其中全国性数据均未包括香港、澳门特别行政区和台湾省数据。 二、本汇编共分七个部分,即:第一部分,综合;第二部分,各地区粮食、油料;第…

使用 Prompt API 与您的对象聊天

tl;dr&#xff1a;GET、PUT、PROMPT。现在&#xff0c;可以使用新的 PromptObject API 仅使用自然语言对存储在 MinIO 上的对象进行总结、交谈和提问。在本文中&#xff0c;我们将探讨这个新 API 的一些用例以及代码示例。 赋予动机&#xff1a; 对象存储和 S3 API 的无处不在…

虎扑APP数据采集:JavaScript与AJAX的结合使用

引言 虎扑APP的数据采集涉及到前端和后端的交互&#xff0c;其中AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;技术允许在不重新加载整个页面的情况下&#xff0c;与服务器进行数据交换和更新部分网页内容。这种技术使得数据采集过程更加高效和用户友好。然而…

Flutter实现绝对定位学习

通过 Stack Positioned实现Flutter绝对定位学习。 简单Demo import package:flutter/material.dart;class MyPositionedDemoPage extends StatelessWidget {const MyPositionedDemoPage({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: …

《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性

一、论文简介 论文讨论了大规模预训练产生的视觉基础模型在处理任意图像时的强大能力&#xff0c;这些模型不仅能够完成训练任务&#xff0c;其中间表示还对其他视觉任务&#xff08;如检测和分割&#xff09;有用。研究者们提出了一个问题&#xff1a;这些模型是否能够表示物体…

【C++】深入理解自定义 list 容器中的 list_iterator:迭代器实现详解

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 &#x1f4cc; 引言&#x1f4cc; 1. 为什么 list 容器需要 list_iterator…

昆明华厦眼科医院举办中外专家眼科技术研讨会

9月13日&#xff0c;“睿智迭代&#xff0c;增效赋能”Menicon Z Night中外专家研讨会在昆明华厦眼科医院成功举办。此次会议由目立康公司与昆明华厦眼科医院携手共筑&#xff0c;标志着双方合作迈向新的高度。 昆明华厦眼科医院总经理王若镜首先发表了热情洋溢的致辞&#xff…

FreeRTOS的列表与列表项

目录 1.为什么要学列表&#xff1f; 2.什么是列表和列表项&#xff1f; 2.1 列表 2.2列表项 2.3&#xff0c;迷你列表项 3.列表与列表项的初始化 3.1 列表初始化 3.2列表项初始化 4.列表项的“增删查”&#xff08;插入、删除、遍历&#xff09; 4.1列表项的插入 4.1.1…

前端(3)——快速入门JaveScript

参考&#xff1a; 罗大富 JavaScript 教程 | 菜鸟教程 JavaScript 教程 1. JaveScript JavaScript 简称 JS JavaScript 是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果&#xff0c;增加用户与网页的交互性。作为一种客户端脚本语言&#…

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享&#xff0c;B 站账号&#xff1a;https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意&#xff1a;因每个人操作顺序可能略有区别&#xff0c;整个部署流程如果出现出入&#xff0c;以…

H.265流媒体播放器EasyPlayer.js H.264/H.265播放器chrome无法访问更私有的地址是什么原因

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏&#xff0c;之前以为和#define、DEFINES 差不多&#xff0c;看了定义才发现不是那么回事&#xff0c;定义如下&#xff1a; 看注释就知道了QT_CONFIG宏&#xff0c;其实是&#xff1a;实现了一个在编译时期安全检查&#xff0c;检查指定的Qt特性…

centos7安装Chrome使用selenium-wire

背景&#xff1a;在centos7中运行selenium-wire爬虫&#xff0c;系统自带的Firefox浏览器不兼容&#xff0c;运行报错no attribute ‘set_preference’&#xff0c;应该是selenium-wire和Firefox的驱动不兼容 查了半天不知道怎么解决&#xff0c;就想在centos7上安装Chrome来跑…

医院信息化与智能化系统(21)

医院信息化与智能化系统(21) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…