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

哪个大佬给我讲解一下?

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

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

}

回答 1

用户10441892

修改于 2023-03-21 05:45:39

您好,请问可以分享一下这篇文章的源码吗,想学习一下

和开发者交流更多问题细节吧,去 写回答
相关文章
React学习相关资料
ECMAScript 6 == ES6,详情查看 WiKi https://en.wikipedia.org/wiki/ECMAScript
治电小白菜
2020/08/25
3320
Python相关学习资料汇总
以下资料按字母表顺序排列 Abseil : https://abseil.io/docs/python/quickstart Abseil 是用于构建 Python 应用程序的 Python 库代码,主要用于处理程序的命令行输入。 Airium : https://pypi.org/project/airium/ Airium 是一个简单易用的 Python 库,让用户能够用 Python 语言书写 HTML 代码。 BeautifulSoup : https://www.crummy.com/
hotarugali
2022/03/13
5640
强化学习系列之二:模型相关的强化学习
本文介绍了模型相关的强化学习,包括马尔科夫决策过程、策略迭代、价值迭代等概念。以机器人找金币问题为例子,介绍了如何使用这些算法进行强化学习。最后,介绍了强化学习的总结性结尾,包括策略迭代和价值迭代等算法,以及它们在机器人找金币问题中的应用。
AlgorithmDog
2018/01/08
1K0
强化学习系列之二:模型相关的强化学习
Spring Boot 相关漏洞学习资料
Spring Boot 相关漏洞学习资料,利用方法和技巧合集,黑盒安全评估 check list
瓦都剋
2020/08/07
4.2K0
Java学习路线以及相关资料
说明 学会利用博客记录自己的学习过程,推荐GitHub或CSDN。 除特殊说明,跟着视频敲每行代码。 学习资料可能存在失效的问题,但解决问题也是必需掌握的能力。 官方文档一定是最好的学习资料,多看文档
devi
2021/08/18
2470
vae 相关论文 表示学习 1
05 Nov 2016 (modified: 18 Apr 2017)ICLR 2017 conference submissionReaders: EveryoneRevisions
CreateAMind
2018/09/27
1.3K0
vae 相关论文  表示学习  1
vae 相关论文 表示学习 2
https://arxiv.org/pdf/1804.02086.pdf Structured Disentangled Representations
CreateAMind
2018/09/27
9820
vae 相关论文  表示学习  2
关于强化学习(1)
来源于Simple statistical gradient-following algorithms for connectionist reinforcement learning
Mezereon
2018/11/07
1K0
关于强化学习(2)
根据 Simple statistical gradient-following algorithms for connectionist reinforcement learning
Mezereon
2018/11/07
6040
Rainbow的相关资料
Rainbow的asp.net  2.0版本还没有正式发布,从他的代码库可看出来,asp.net 2.0的版本将是非常不错的一个产品。 官方网站:http://www.rainbowportal.net/ Download - www.rainbowportal.net/site/3326/download.aspx Features - www.rainbowportal.net/site/3361/features.aspx Documentation - support.rainbowportal.n
张善友
2018/01/22
7680
Gym平台在强化学习实验中的应用
原文出处:https://zhuanlan.zhihu.com/p/114392519.知乎
SL_World
2021/09/18
1.4K0
​图表示学习技术在药物推荐系统中的应用
本文约6500字,建议阅读13分钟 本次分享的题目是图表示学习技术在药物推荐系统中的应用。 主要包括以下四个部分: 研究背景与挑战 判别式药品包推荐  生成式药品包推荐 总结与展望 01、研究背景与挑战 1. 研究背景 医疗资源总体不足,分布不均带来沉重压力 药物推荐是智慧医疗的一个子问题,首先从智慧医疗的大背景说起,在我国智慧医疗存在紧迫性,随着人口增长、老龄化加剧,人们对于高质量医疗服务的需求不断攀升。图中两组数据,一是全国医疗机构的就诊人数在 60.5 亿人次,同比增长 22.4%;二是柳叶刀上关于
数据派THU
2023/02/27
1.1K0
​图表示学习技术在药物推荐系统中的应用
关于学习SEO的一些资料
2016-05-0418:26:53 发表评论 694℃热度 不论任何网站,当然希望越多人访问越好,除了那些私人网站。那么SEO必不可少,我也是问了自己博客才学习SEO,当然ios程序猿只能学学皮毛。分享下我的学习资料。 SEO实战密码:60天网站流量提高20倍 这本书堪称经典,可以说学习SEO这本书就够了。作者也是叼叼的:昝辉,网名Zac。Zac于2006年开始写中文博客<SEO每天一贴>。几个月内该博客成为中国SEO领域被引用最多,受欢迎的行业博客之一,很多文章在网上广为流传。这本书第1版也是2010
timhbw
2018/05/03
7201
QT相关资料
<<C++ GUI Programming with Qt4>>、<<Qt及Qt Quick开发实战精解>>、<<精通Qt4编程>>、<<Qt Creator快速入门>>、《零基础学Qt4编程》。个人比较喜欢老外写的这本书<<C++ GUI Programming with Qt4>>,不仅系统讲解了QT的绝大部分主题,同时还讲解了QT的一些思想和原理。不过最好的参考还是Qt的Demos和帮助文档。
ccf19881030
2019/04/24
7640
【资料总结】| Deep Reinforcement Learning 深度强化学习
  在机器学习中,我们经常会分类为有监督学习和无监督学习,但是尝尝会忽略一个重要的分支,强化学习。有监督学习和无监督学习非常好去区分,学习的目标,有无标签等都是区分标准。如果说监督学习的目标是预测,那么强化学习就是决策,它通过对周围的环境不断的更新状态,给出奖励或者惩罚的措施,来不断调整并给出新的策略。简单来说,就像小时候你在不该吃零食的时间偷吃了零食,你妈妈知道了会对你做出惩罚,那么下一次就不会犯同样的错误,如果遵守规则,那你妈妈兴许会给你一些奖励,最终的目标都是希望你在该吃饭的时候吃饭,该吃零食的时候吃零食,而不是在不合适的时间吃零食。同样,曾经风靡过一段时间的Flappy bird,很多玩家在短时间内达到了高分,是怎么做到的呢?除了非常厉害的玩家是真的自己手动玩的高分,其实很多高分是通过我们用强化学习的方法来训练一个模型,让小鸟自己学习如何不碰到障碍物一直往前飞,获得最高分。此外,大家熟知的Alpha Go,其实也是强化学习训练的模型,不过是深度强化学习。
Charlotte77
2019/05/25
7230
在Hadoop中ResourceManager是干什么的?
ResourceManager:马克-to-win @ 马克java社区:防盗版实名手机尾号:73203。当应用程序对集群资源需求时,ResourceManager是Yarn集群主控节点,负责协调和管理整个集群(所有NodeManager)的资源。
马克java社区
2021/06/24
8980
在Hadoop中Container是干什么的?
Container:马 克-to-win @ 马克java社区:前面我们总提资源分配。而资源分配的体现就要用到一个抽象概念“容器”(Container)表示,Container将内存、 CPU、磁盘、网络等资源封装在一起,这样可以起到限定资源边界的作用。比如给你一个Container的资源,里面包含3个G的内存,1G硬盘。当销毁 你的Container时,连带的内存,硬盘都没有了。
马克java社区
2021/06/24
8020
Consul相关资料
https://www.consul.io/intro/vs/index.html
IT云清
2019/03/15
6280
JQuery相关资料
将SEO,WEB标准与AJAX进行到底 - JQuery(翻译+学习总结) jQuery——JavaScript冲击波 《15天漫游jQuery》 小试牛刀——一篇jQuery小教程 prototype.js与jQuery两大阵营的唇枪舌剑 Remy Sharp写了一个 jQuery Spy ,一个类似Digg spy(实时监控更新程序)的 jQuery 版本,让网站管理员很容易的利用AJAX(或是AJAH)加上spy展示画面在自已的网站上。这个程序的新版本比旧的版本多增加了以下的功能: · 多项目的支
张善友
2018/01/26
6430
资料 | 区域链相关资料汇总
关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 1、Blockchain For Dummies:初学者指南 http://byteacademy.co/blockchain-for-dummies-a-beginners-guide/ 2、使用Python从零开始构建区块链 - 第1部分 http://blockxchain.org/2017/06/04/building-a-blockchain-with-python-1/ 3
昱良
2018/04/09
8650

相似问题

短视频的发展前景以及未来发展方向?

74.9K

在AI高速发展的时代,架构师未来发展的方向是怎样的?

017

在AI高速发展的时代,架构师未来发展的方向是怎样的?

010

架构师应该如何发展?

011

推荐算法发展前景以及优缺点?

44.5K
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
平安资管 | 架构师擅长4个领域
擅长3个领域
擅长5个领域
腾讯云TDP | KOL擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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