操作系统实验四 进程间通信

news/2024/5/1 11:04:15/文章来源:https://blog.csdn.net/qq_51646682/article/details/126972163

★观前提示本篇内容为操作系统实验内容,代码等内容经测试没有问题,但是可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考

目录

        • 一、实验目的
        • 二、实验内容
        • 三、具体实现
        • 四、实验总结

一、实验目的

多道程序设计中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验要求学生:

  1. 理解进程的各个状态、进程控制块PCB的结构。
  2. 理解处理机调度算法,模拟在单处理器情况下的处理器调度

二、实验内容

  1. 设计一个按优先数调度算法实现处理器调度的程序。

  2. 设计一个按时间片轮转法实现处理器调度的程序。

三、具体实现

1️⃣设计一个按优先数调度算法实现处理器调度的程序。

①程序设计清单

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
//-----------------------
struct _proc //定义一个结构体表示进程的PCB
{char name[32]; //进程名struct _proc* next; //指向下一个PCB的指针int run_time; // 要求运行的时间int priority; // 优先数int state;//进程状态
};
_proc* root;//向就绪队列中插入进程,按照降序
void Insert(_proc* pr)
{_proc* q = root;_proc* p = root->next;if (root->state != 0){while (p != NULL){if (p->priority > pr->priority){q = p;p = p->next;}else{break;}}}pr->next = p;//插入进程结点q->next = pr;++root->state;//进程个数加1
}//创建进程
_proc Creat(const char name[], int priority, int run_time)
{_proc pr;strcpy(pr.name, name);pr.priority = priority;pr.run_time = run_time;pr.state = 0;pr.next = NULL;return pr;
}//删除就绪队列中队首进程
_proc* Delete()
{_proc* pr = root->next; //此时pr为指向结构体的指针,指向队首进程root->next = root->next->next;--root->state; //进程个数减1return pr; //返回被删除进程的地址
}//对就绪队列排序,按照降序
void Sort()
{if (root->next->run_time == 0)//队首进程的要执行时间为0时,从就绪队列中删除该进程{Delete();root->next->state = 1;}else//不为0时,先删除,再根据变化后的优先级,插入到相应位置{_proc* pr = Delete();Insert(pr);}
}void OutPut()
{ //取队首的进程,模拟进程执行,输出执行进程名printf("%s\n", root->next->name);--root->next->priority;//动态改变优先数,优先级减1--root->next->run_time;//运行时间减1
}void Solve()
{ //定义根结点,指向第一个进程root = new _proc;root->state = 0;//队列中的进程个数root->next = NULL;//创建几个进程,并插入就绪队列_proc pr1 = Creat("p1", 2, 1);Insert(&pr1);_proc pr2 = Creat("p2", 3, 5);Insert(&pr2);_proc pr3 = Creat("p3", 1, 3);Insert(&pr3);_proc pr4 = Creat("p4", 2, 4);Insert(&pr4);_proc pr5 = Creat("p5", 4, 2);Insert(&pr5);printf("调度序列:\n"); //输出while (root->state != 0){OutPut(); //取队首进程模拟执行一个单位时间数Sort(); //重新排序}
}
int main()
{Solve();getchar();getchar();return 0;
}

②编写完程序后,保存并退出
在这里插入图片描述

③编译程序
在这里插入图片描述

④实验结果输出
在这里插入图片描述

⑤程序分析及说明

处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,
所以,对被选中的进程并不实际的启动运行,只进行相应的参数的修改,即执行:优先数-1,要求运行时间-1来模拟进程的一次运行。

说明:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。

2️⃣设计一个按时间片轮转法实现处理器调度的程序。

①程序设计清单

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
//-----------------------
struct _proc //定义一个结构体表示进程的PCB
{char name[32]; //进程名struct _proc* next; //指针int run_time; //要求运行的时间int alloc_time; //已运行的时间int state;//进程状态
};
_proc* root;//向就绪队列中插入进程,按照降序
void Insert(_proc* pr)
{if (root->next == NULL){root = pr;pr->next = pr;return;}pr->next = root->next;//插入root->next = pr;root = pr;
}//创建进程
_proc Creat(char name[], int run_time, int alloc_time)
{_proc pr;strcpy(pr.name, name); //进程名取参数名pr.run_time = run_time; //取参数的要求运行时间pr.alloc_time = alloc_time; //取参数的已运行时间pr.state = 0;pr.next = NULL;return pr;
}//删除就绪队列中对首进程
void Delete()
{if (root->next == root){ //队列已为空root = NULL;return;}root->next = root->next->next;
}//输出进程号,模拟进程执行
void OutPut()
{cout << root->next->name << endl;//输出++root->next->alloc_time;//已运行时间加1
}
void Solve()
{ //定义根结点,指向下一个运行的进程root = new _proc;root->state = 0;//队列中的进程个数root->next = NULL;//创建几个进程,并插入就绪队列_proc pr1 = Creat("Q1", 2, 1);Insert(&pr1);_proc pr2 = Creat("Q2", 3, 0);Insert(&pr2);_proc pr3 = Creat("Q3", 1, 0);Insert(&pr3);_proc pr4 = Creat("Q4", 2, 0);Insert(&pr4);_proc pr5 = Creat("Q5", 4, 0);Insert(&pr5);cout << "调度序列:" << endl; //输出while (root != NULL)//一直循环遍历{OutPut();//执行root指向的进程if (root->next->alloc_time == root->next->run_time)//执行完毕{Delete();//从就绪队列中删除该进程continue;}root = root->next;//root指针后移,执行下一个进程做准备}
}
int main()
{Solve();getchar();return 0;
}

②编写完程序后,保存并退出
在这里插入图片描述

③编译程序
在这里插入图片描述

④实验结果输出
在这里插入图片描述

⑤程序分析及说明

处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,只进行相应的参数的修改,即执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。

说明:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。

四、实验总结

①理解了进程的各个状态、进程控制块PCB的结构,PCB进程控制块是进程的静态描述。
②理解了处理机调度算法,并借助程序模拟了在单处理器情况下的处理器调度。

2022.9.21记录:Code_流苏(CSDN)
如有任何疑问,评论回复,看到即回,欢迎大家多多交流学习!
★以上实验内容仅供参考。

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

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

相关文章

【前端面试】-- 必知必会的promise题

Promise 想必大家都十分熟悉&#xff0c;想想就那么几个 api&#xff0c;可是你真的了解 Promise 吗&#xff1f; 请迎接测试: 以下 promise 均指代 Promise 实例&#xff0c;环境是 Node.js 题目一&#xff1a; const promise new Promise((resolve, reject) > {conso…

ES8JC-ASEMI快恢复二极管ES8JC

编辑:ll ES8JC-ASEMI快恢复二极管ES8JC 型号:ES8JC 品牌:ASEMI 封装:SMC 特性:快恢复二极管 正向电流:8A 反向耐压:600V 恢复时间:35ns 引脚数量:2 芯片个数:1 芯片尺寸:84MIL 浪涌电流:125A 漏电流:<5ua 工作温度:-40℃~150℃ 包装方式:30/管;3000/箱 备受…

华为云各Region网络延迟实测

一、测试综述 测试内容&#xff1a; 序号 评测内容 测试日期 1 华为云各大区公网接入网络延迟 2022-09-20 2 华为云各大区之间网络延迟&#xff08;通过公网&#xff09; 2022-09-20 3 华为云各大区之间网络延迟&#xff08;通过云连接&#xff09; 2022-09-20 测…

【Linux】聊聊删文件的那些破事

聊聊删文件的那些破事前言正文rm命令find命令perl方式10w文件删除对比50w文件删除对比100w文件删除对比结语前言 在操作系统的日常运维中&#xff0c;我们经常会做文件的创建、删除、修改操作&#xff0c;尤其是删除&#xff0c;无论是定期清理日志文件&#xff0c;还是做完一…

传统光流方法汇总

又搬运了一个3d视觉相关的~~ 还是先道歉 就是学习用 还是公交上回家看那种 ~~ 这次分享传统光流方法汇总及其在深度学习中的应用&#xff01;&#xff08;基于相位/能量/匹配/变分&#xff09; 回望传统光流估计方法 近年来&#xff0c;随着深度学习技术的快速发展&#xff…

嵌入式分享合集63

一、PCB为什么一定要做阻抗 在具有电阻、电感和电容的电路里&#xff0c;对交流电所起的阻碍作用叫做阻抗。阻抗常用Z表示&#xff0c;是一个复数&#xff0c;实部称为电阻&#xff0c;虚部称为电抗。 其中电容在电路中对交流电所起的阻碍作用称为容抗&#xff0c;电感在电路…

Pr:多机位编辑

很多时候一个机位满足不了影视创作的需求。比如拍摄人物动作&#xff0c;如果能使远景、近景、特写等一些镜头相互衔接&#xff0c;将会使得角色显得更加丰富饱满。不同的景别传达着不同的信息&#xff0c;更容易交待环境和表达角色的情绪。早期人们在拍摄的同时完成多机位切换…

应用层 HTTP 代理服务器转发消息时的相关头部 请求头 X-Forwarded-For

在http消息传递过程当中会经过很多正向代理服务器和反向代理服务器&#xff0c;这些代理服务器在转发消息的时候会涉及到http的头部&#xff0c;下面将会介绍这些头部&#xff0c;包括由于存在这些代理服务器所以客户端和源服务器之前有许多的tcp连接&#xff0c;有一些http头部…

Flutter快学快用15 服务通信:Flutter 中常见的网络协议

上一课时之前&#xff0c;我们的接口都是在代码中模拟假数据&#xff0c;并没有从服务端获取数据&#xff0c;但是在实际开发中&#xff0c;必须与服务端进行交互。本课时主要介绍在 Flutter 中常见的网络传输协议序列化方式&#xff0c;并对其中比较常用的协议进行简单实践&am…

大数据培训技术phoenix表操作

phoenix表操作 1 显示所有表 &#xff01;table 或 &#xff01;tables 2 创建表 CREATE TABLE IF NOT EXISTS us_population ( State CHAR(2) NOT NULL, City VARCHAR NOT NULL, Population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city)); 如下显示&#xff1a; 在p…

超级基础篇_疑惑实验

1、多态&#xff1a; 多态是什么&#xff1f; 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作多态的优点 1.消除类型之间的耦合关系 2. 可替换性 3. 可扩充性 …

树的应用 —— 二叉树:二叉树的性质

树的应用 —— 二叉树 二叉树&#xff08;Binary Tree&#xff09;是n &#xff08;n ≥0&#xff09;个节点构成的集合&#xff0c;或为空树&#xff08;n 0&#xff09;&#xff0c;或为非空树。 对于非空树T &#xff0c;要满足&#xff1a; ①有且仅有一个被称为根的节点…

FFmpeg入门详解之20:视频编码原理简介

视频为何需要压缩&#xff1f; 原因&#xff1a;未经压缩的数字视频的数据量巨大 ● 存储困难 ○ 一G只能存储几秒钟的未压缩数字视频。 ● 传输困难 ○ 1兆的带宽传输一秒的数字电视视频需要大约4分钟。 主要压缩了什么东西&#xff1f; 原始视频压缩的目的是去除冗余信息&a…

结构体的理解

结构体前言结构体&#xff1f;定义变量如何赋初值&#xff1f;结构体的访问结构体的嵌套使用注意事项结构体的大小内存对齐默认对齐数的修改为什么存在内存对齐&#xff1f;结构体传参位段什么是位段&#xff1f;位段的内存分配深入剖析位段“存”数据位段的“取”位段的跨平台…

Idea工具中,使用Mapper对象有红线

背景&#xff1a; IDEA开发工具&#xff0c;springboot mybatis项目 &#xff08;这个是不需要改的&#xff0c;也不算是问题&#xff0c;因为项目并不会报错&#xff0c;只是作者好奇找了下问题&#xff0c;并记录一下&#xff09; 问题描述 mapper对象在service层有红线&a…

8 位卷王!总结 1135 页 Java 核心面试手册,硬钢 BATJ 一线大厂面试官

又到了金九银十求职季&#xff01; HR 开始拼业绩&#xff0c;招聘网站也开始释放出大量岗位&#xff0c;转行跳槽、毕业求职的人都开始行动起来&#xff01; 此时&#xff0c;对于大多数程序员来说&#xff0c;最大的目标就是&#xff1a;进大厂&#xff01; 大厂为什么这么…

ArcGIS Map Sdk for unity使用

本文主要讨论离线模式。 目录 1.底图tpk文件制作 2.3D图层slpk文件制作 3.导入使用 1.底图tpk文件制作 软件&#xff1a;91卫图助手 Arcgis Pro 操作步骤&#xff1a; 打开91卫图助手&#xff0c;更换底图为高德影像/腾讯影像。(百度影像的地理投影格式有自身加密&#xff…

剖析容器运行时

特别说明&#xff1a;一部分转载自大佬文章&#xff1a;https://blog.csdn.net/weixin_39246554/article/details/120926174&#xff08;不得不说大佬总结的真好啊&#xff01;&#xff01;&#xff01;&#xff09; 剩下的听老王公开课总结。 k8s官网关于运行时的说明&#x…

Typora Mac版本安装Pandoc导出文件为word格式(windows可通用)

我们在用Typora时导出的格式常常为PDF格式&#xff0c;但是如果我们要将文件导出为word格式的时候却需要安装插件PanDoc&#xff0c;我目前使用的是Mac版本的Typora&#xff0c;给大家分享一下如何安装Pandoc以及导出word格式文件。 1.根据Typora中的说明进入GitHub下载Pandoc…

Maven安装配置

Maven安装配置一、下载 apache-maven-3.6.1Maven官网:https://maven.apache.org/download.cgi(或)直接下载maven-3.8.6:https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.zip解压到当前文件夹二、配置 maven 环境变量右键此电脑 - 属性 - 高级…