Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >哪个大佬给我讲解一下?

哪个大佬给我讲解一下?

提问于 2023-09-10 13:35:55
回答 0关注 0查看 126

#define _CRT_SECURE_NO_WARNINGS 1

/*

* 多道程序设计模拟

* 作者:hjz

* 时间:2020/11/8

*

* 本次为操作系统的实验,模拟了A,B,C三个程序的多道程序的执行,比较顺序执行和多道程序设计

* 程序执行的顺序为:计算->IO操作->计算->结束,分为三段

* 例如:

* A先计算30ms,再io操作40ms,再计算10ms。

* B先计算60ms,再io操作30ms,再计算10ms。

* A先计算20ms,再io操作40ms,再计算20ms。

*

* 本次实验只模拟了三个程序和单通道模式

*/

#include<stdio.h>

#include<stdlib.h>

#define true 1

#define false 0

#define CPU 2

#define IO -1

typedef struct {

char id;//任务名称

int cpu_time1;//第一次计算时间

int cpu_time2;//第二次计算时间

int io_time;//io操作时间

short flag;//第一次是否已计算完,计算完为1

}pro;//程序结构体

typedef struct {

pro* arr[3];//队列

int first;//队头

int last;//队尾

int n;//元素数量

}queue;//队列

queue cpu_q;//cpu队列

queue io_q;//io队列

void init(pro*, pro*, pro*);

void input(pro*);

void run_seq();

void run_par();

int enqueue(pro*, int);

pro* dequeue(int);

int empty(int);

int full(int);

int back(int, pro*);

int main() {

pro* pro_a = 0;

pro* pro_b = 0;

pro* pro_c = 0;

init(pro_a, pro_b, pro_c);

run_seq();

run_par();

return 0;

}

/*

* 判定队列是否是空

*

* 参数:

* i:为1判定cpu队列,否则为io队列

* 返回值:如果为空返回正数,否则返回0

*/

int empty(int i) {

if (i == CPU) {

return cpu_q.n == 0;

}

else {

return io_q.n == 0;

}

}

/*

* 判定队列是否满

*

* 参数:

* i:为CPU判定cpu队列,否则为io队列

* 返回值:如果满返回正数,否则返回0

*/

int full(int i) {

if (i == CPU) {

return cpu_q.n == 3;

}

else {

return io_q.n == 3;

}

}

/*

* 入队操作

*

* 参数:

* p:要入队的程序

* i:为CPU入cpu队列,否则为io队列

* 返回值:如果正常入队返回1,否则返回0

*/

int enqueue(pro* p, int i) {

if (full(i)) return false;

if (i == CPU) {

cpu_q.arr[cpu_q.last] = p;

cpu_q.last = (cpu_q.last + 1) % 3;

cpu_q.n++;

}

else {

io_q.arr[io_q.last] = p;

io_q.last = (io_q.last + 1) % 3;

io_q.n++;

}

return true;

}

/*

* 出队操作

*

* 参数:

* i:为1出cpu队列,否则为io队列

* 返回值:返回队头元素或NULL

*/

pro* dequeue(int i) {

if (empty(i)) return NULL;

pro* temp;

if (i == CPU) {

temp = cpu_q.arr[cpu_q.first];

cpu_q.arr[cpu_q.first] = NULL;

cpu_q.first = (cpu_q.first + 1) % 3;

cpu_q.n--;

}

else {

temp = io_q.arr[io_q.first];

io_q.arr[io_q.first] = NULL;

io_q.first = (io_q.first + 1) % 3;

io_q.n--;

}

return temp;

}

/*

* 将元素添加到队列头

*

* 参数:

* i:为CPU则添加到cpu队列,否则添加到io队列

* p:要添加的任务

* 返回值:添加成功返回1

*/

int back(int i, pro* p) {

if (full(i)) return false;

if (i == CPU) {

cpu_q.first = (cpu_q.first - 1) % 3;

cpu_q.arr[cpu_q.first] = p;

cpu_q.n++;

return true;

}

else {

io_q.first = (io_q.first - 1) % 3;

io_q.arr[io_q.first] = p;

io_q.n++;

return true;

}

return false;

}

/*

* 程序计算时间和io时间初始化

*

* 参数:

* p:要被初始化的程序

*/

void input(pro* p) {

printf("请输入程序%c第一次计算的时间:", p->id);

scanf("%d", &(p->cpu_time1));

printf("请输入程序%c所需要的io时间:", p->id);

scanf("%d", &(p->io_time));

printf("请输入程序%c第二次计算的时间:", p->id);

scanf("%d", &(p->cpu_time2));

p->flag = 0;

putchar('\n');

}

/*

* 队列和多道程序初始化

*

* 参数:

* a:被初始化程序1

* b:被初始化程序2

* c:被初始化程序3

*/

void init(pro* a, pro* b, pro* c) {

printf("---------程序初始化---------\n");

a = (pro*)malloc(sizeof(pro));

b = (pro*)malloc(sizeof(pro));//动态分配内存

c = (pro*)malloc(sizeof(pro));

a->id = 'A';

b->id = 'B';

c->id = 'C';

input(a);

input(b);

input(c);

cpu_q.arr[0] = a;

cpu_q.arr[1] = b;

cpu_q.arr[2] = c;

cpu_q.first = 0;

cpu_q.last = 0;

cpu_q.n = 3;

io_q.first = 0;

io_q.last = 0;

io_q.n = 0;

}

/*

* 顺序执行模式

*/

void run_seq() {

printf("---------顺序执行模式---------\n");

int i, sum = 0;

for (i = 0; i < 3; i++) {

printf("程序%c计算%dms,io%dms,计算%dms\n",

cpu_q.arr[i]->id, cpu_q.arr[i]->cpu_time1, cpu_q.arr[i]->io_time, cpu_q.arr[i]->cpu_time2);

sum = sum + cpu_q.arr[i]->cpu_time1 + cpu_q.arr[i]->io_time + cpu_q.arr[i]->cpu_time2;

}

putchar('\n');

printf("总耗时%dms\n", sum);

}

/*

* 多道执行模式

*/

void run_par() {

printf("---------多道程序模式---------\n");

pro* temp, * temp1;

int time, sum = 0;

while (!empty(CPU) || !empty(IO)) {

//如果io队列为空,则进行计算

if (empty(IO)) {

temp = dequeue(CPU);

if (temp != NULL) {

time = (temp->flag == 0) ? (temp->cpu_time1) : (temp->cpu_time2);

printf("程序%c计算%dms\n", temp->id, time);

sum += time;

if (temp->flag == 0) {//如果是第一次计算,放入io队列,否则该程序结束

temp->flag = 1;

enqueue(temp, IO);

}

else free(temp);

continue;

}

exit(0);

}

//如果cpu队列为空,则进行io调度,io调度完成后继续完成计算至程序结束

if (empty(CPU)) {

temp = dequeue(IO);

if (temp != NULL) {

printf("程序%c进行io%dms\n", temp->id, temp->io_time);

printf("程序%c计算%dms\n", temp->id, temp->cpu_time2);

sum = sum + temp->io_time + temp->cpu_time2;

free(temp);

continue;

}

exit(0);

}

//如果io队列和cpu队列都不为空,则io操作和计算同时进行

temp = dequeue(CPU);

temp1 = dequeue(IO);

if (temp->flag == 0) time = temp->cpu_time1 - temp1->io_time;

else time = temp->cpu_time2 - temp1->io_time;

if (time >= 0) {

if (temp->flag == 0) {

printf("程序%c计算%dms的同时,程序%c进行io%dms", temp->id, temp->cpu_time1, temp1->id, temp1->io_time);

sum += temp->cpu_time1;

}

else {

printf("程序%c计算%dms的同时,程序%c进行io%dms", temp->id, temp->cpu_time2, temp1->id, temp1->io_time);

sum += temp->cpu_time2;

}

while (time > 0) {//如果在io操作完成后,正在计算的程序还没完成计算,继续调度io队列中的下一个

int temp_time;

if (!empty(IO)) {

pro* temp2 = dequeue(IO);

temp_time = temp2->io_time;

if (temp_time > time) {//如果下一个io操作所需的时间过长,则先进行一段io操作,再放回队首,下次再调度

printf(",程序%c进行io%dms", temp2->id, time);

temp2->io_time = temp2->io_time - time;

back(IO, temp2);

break;

}

else {

printf(",程序%c进行io%dms", temp2->id, temp_time);

time -= temp_time;

enqueue(temp2, CPU);

}

}

break;

}

enqueue(temp1, CPU);

if (temp->flag == 0) {

temp->flag = 1;

enqueue(temp, IO);//如果是第一次计算,则进入io队列

}

else free(temp);

putchar('\n');

}

else {

sum += temp1->io_time;

if (temp->flag == 0) {

printf("程序%c计算%dms的同时,程序%c进行io%dms", temp->id, temp->cpu_time1, temp1->id, temp1->io_time);

}

else {

printf("程序%c计算%dms的同时,程序%c进行io%dms", temp->id, temp->cpu_time2, temp1->id, temp1->io_time);

}

time = -time;

while (time > 0) {//如果计算完成后,io操作还在继续,则继续调度cpu队列

int temp_time;

if (!empty(CPU)) {

pro* temp2 = dequeue(CPU);

temp_time = (temp2->flag == 0) ? (temp2->cpu_time1) : (temp2->cpu_time2);

if (temp_time > time) {

printf(",程序%c计算%dms\n", temp2->id, time);

if (temp2->flag == 0) temp2->cpu_time1 = temp2->cpu_time1 - time;

else temp2->cpu_time2 = temp2->cpu_time2 - time;

back(CPU, temp2);

break;

}

else {

printf(",程序%c计算%dms", temp2->id, temp_time);

time -= temp_time;

if (temp2->flag == 0) {

temp2->flag = 1;

enqueue(temp2, CPU);

}

else free(temp2);

}

}

break;

}

enqueue(temp1, CPU);//完成io操作后调入cpu队列

if (temp->flag == 0) {

temp->flag = 1;

enqueue(temp, IO);

}

else free(temp);

putchar('\n');

}

}

printf("总耗时%dms\n", sum);

}

回答

成为首答用户。去 写回答
相关文章
windows 安装vagrant reload 失败; No Virtualbox Guest Additions installation found.[通俗易懂]
问题描述:已经安装vagrant-vbguest 插件,且版本为0.30,使用的box 为centos7
全栈程序员站长
2022/07/19
5670
windows 安装vagrant reload 失败; No Virtualbox Guest Additions installation found.[通俗易懂]
VirtualBox 扩展包卸载或安装失败(VERR_ALREADY_EXISTS)
       最近在卸载VirtualBox出现了无法卸载的错误。提示为Failed to install the extension. The installer failed with exit code 1: VBoxExtPackHelperApp.exe: error: Failed to rename the extension pack directory: VERR_ALREADY_EXISTS.  而且也无法再次成功安装。本文是对此给出的描述及其解决办法。
Leshami
2018/08/13
3K0
VirtualBox 扩展包卸载或安装失败(VERR_ALREADY_EXISTS)
virtualbox安装详解
VBox版本:安装的最新版本 [VirtualBox-5.2.12-122591-Win.exe]
Java架构师必看
2021/03/22
1.2K0
virtualbox安装详解
VirtualBox中Fedora 17安装增强工具失败 Building the main Guest Additions modu
为了在virtualbox里面的Fedora安装增强工具废了不少功夫,如果刚装的fedora上来就安装增强工具,肯定会出现错误:
知忆
2021/06/16
6030
Virtualbox 安装 Alpine Linux
本文介绍使用 VirtualBox 安装 Alpine Linux。 安装 下载 iSO,挂载,配置网络,启动。 用户名 root,默认密码为空。 $ setup-alpine 然后交互式输入信息,完成安装。不要无脑回车,注意一定要设置 DNS 服务器,否则会遇到网络问题而安装失败。 输入 $ poweroff 关机,移除安装 ISO 光盘。 SSH 开机之后在虚拟机窗口登录,修改 SSH 配置之后,使用 SSH 来登录即可开始使用。 /etc/ssh/sshd_config PermitRootLogin
康怀帅
2018/02/28
3.1K1
MAC 下安装 VirtualBox出现"virtualbox for mac安装器遇到了一个错误, 导致安装失败. 请联系软件制造商以获得帮助"
网上很多是说是Mac 安装策略,但是我的不是,之前手残卸载了,然后就死活装不上了,如果你也一样,那么可以参考一下我的解决方式
tanoak
2020/08/11
6.4K0
MAC 下安装 VirtualBox出现"virtualbox for mac安装器遇到了一个错误, 导致安装失败. 请联系软件制造商以获得帮助"
VirtualBox安装CentOS系统
虚拟机软件下载地址: https://www.virtualbox.org/wiki/Downloads
ianzhi
2019/07/31
1.5K0
VirtualBox安装CentOS系统
kali更新源失败解决办法
而后搜寻资料,得知可以通过更新本地虚拟机内的密钥来解决此问题: show u the code:
全栈程序员站长
2022/09/01
9950
MAC OS X下VirtualBox端口转发失败问题
VirtualBox Network:NAT
雷大亨
2017/12/07
1.7K0
Docker安装kali
a1765e8e381e为你的镜像id,-t 让 docker 分配一个伪终端并绑定到容器的标准输入上 ,-p 指定映射端口,如60001端口映射到虚拟机的 5901 端口,-d 保持后台运行, -c 执行一些命令
sakurajiamai
2022/01/02
2.9K0
Docker安装kali
VirtualBox安装centos7
VirtualBox下载地址 https://www.virtualbox.org/
老雷PHP全栈开发
2020/07/02
7170
VirtualBox安装centos7
kali安装KatanaFramework
个人博客:https://suveng.github.io/blog/​​​​​​​
suveng
2019/09/17
6040
kali安装KatanaFramework
kali安装步骤
kali镜像下载地址:http://mirrors.ustc.edu.cn/kali-images/
全栈程序员站长
2022/08/23
2.1K0
kali安装步骤
渗透测试 - kali Linux
渗透测试操作系统 - kali 什么是kali Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。 由Offensive Security Ltd维护和资助。 最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,BackTrack是他们之前写的用于取证的Linux发行版 。 Kali Linux预装了许多渗透测试软件,包括nmap 、Wireshark 、John the Ripper ,以及Ai
苦叶子
2018/04/09
11.4K0
渗透测试 - kali Linux
kali安装MITMF
Mitmf 是一款用来进行中间人攻击的工具。它可以结合 beef 一起来使用,并利用 beef 强大的 hook 脚本来控制目标客户端。下面让我们一起看看如何在 Kali2.0上安装使用 Mitmf 。默认在2.0上并未安装,在之前的版本有安装。 首先,我们先进行工具依赖包的安装。打开 terminal 终端,输入如下命令:
逍遥子大表哥
2021/12/17
1.1K0
kali安装MITMF
在VirtualBox中安装ArchLinux
乐百川
2018/01/09
3.1K0
virtualbox增强功能-VBoxGuestAdditions安装
1、准备virtualbox增强功能VBoxGuestAdditions.iso 默认安装virtualbox时就没有增强功能的iso 自行下载VBoxGuestAdditions.iso备用 如还是没有可以去官网另外下载 http://download.virtualbox.org/virtualbox/5.0.2/VBoxGuestAdditions_5.0.2.iso
全栈程序员站长
2022/09/07
10.1K0
virtualbox增强功能-VBoxGuestAdditions安装
图解VirtualBox安装CentOS 7
VirtualBox是由德国InnoTek软件公司出品的虚拟机软件,现在则由甲骨文公司进行开发,是甲骨文公司xVM虚拟化平台技术的一部分。
万猫学社
2022/12/01
2K0
图解VirtualBox安装CentOS 7
virtualbox ubuntu 下面安装 redmine
然后在 vb 中配置安装 ubuntu ,这里需要注意的是,把网络类型改为 桥接。
零式的天空
2022/03/22
1.2K0
kali装电脑_Kali安装教程(Windows7和kali双系统安装教程)[通俗易懂]
先安装win7,然后安装kali,并且kali的引导项安装在/boot分区而不安装MBR中,因为这样的话就算重装win7,kali系统经过简单引导仍然可以使用。
全栈程序员站长
2022/08/22
3.6K0

相似问题

Ubuntu 安装 virtualBox 报错?

12.2K

如何在云服务器上安装kali系统?

1565

如何把腾讯云服务器安装成kali linux?

23.7K

vmware安装失败?

114

appo安装失败?

0156
相关问答用户
自由工作者
CVM专项擅长1个领域
腾讯科技(深圳)有限公司 | 高级工程师
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档