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

#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

用户2266551

发布于 2020-06-01 08:26:11

认证证书有效期以证书上的信息为准,不存在顺延的说法。在实际应用场景中,一般会优先关注更高级别证书的有效期。

和开发者交流更多问题细节吧,去 写回答
相关文章
运维的未来:云服务兴起,运维人员会“下岗”吗?
本文作者 Tyler Treat 是一名软件工程师,他认为运维的未来从很多方面来说都跟质量保证(QA)的未来走向相似。未来,运维要使开发者能够通过工具、自动化和流程实现自助服务。传统的运维( Ops)没有消失,只是在重组。
Debian中国
2018/12/20
3.3K0
做运维的感悟(做运维需要考虑事,运维组织结构,运维学习地图....)
不过大公司会专门做某一部分,例如应用运维不需要关注测试和安全等方面,但建议都学学,触类旁通有好处。 有这些基础,进到公司就可以去完成基础的建设工作了。比如会安排你搭建服务,整理资产报表,清理一些日志,这些基本工作可以帮助你了解公司当前有哪些服务,各种服务之间是如何运作的,之后再慢慢参与到业务中,薪资一线城市可以达到6-10k左右。
iginkgo18
2020/12/23
6.7K0
做运维的感悟(做运维需要考虑事,运维组织结构,运维学习地图....)
有运维专家推荐吗?
因为工作行业的原因,会有很多的同行或朋友找我推荐一些有运维经验的人,或者直接希望要运维专家。
赵成
2018/08/09
2.3K0
IT运维发展进程中不同时期的差异!传统运维、互联网运维、业务运维
从信息化时代到互联网时代,再到如今大幕初启的数字化时代,IT、互联网和移动化已经渗透到工作和生活的方方面面。今年早些时候一群歪果仁评选出中国的新“四大发明”——高铁、网购、支付宝和共享单车,后三样都是来自于IT变革。而运维作为IT运行的有力保障,在不同时期和不同类型的企业中正在发挥着越来越大的支撑和引领作用,今天就让我们聊聊信息化时代的传统运维、互联网时代的互联网运维和数字化时代的业务运维有什么不同!
智能运维圈
2021/05/11
3.8K0
IT运维发展进程中不同时期的差异!传统运维、互联网运维、业务运维
企业IT运维的目的?如何提高运维效率?
在企业IT工程师团队中,对“三分技术,七分管理”这句箴言的信奉者占据了绝大数。当多个行业企业信息化建设走过大规模新建期后,IT运维成为企业IT的常态。系统、数据与业务的日益复杂,都加剧了企业IT运维的难度。
华汇数据
2022/07/01
2.8K0
企业IT运维的目的?如何提高运维效率?
运维向运营转型,会是企业IT传统运维的发展方向吗?
近两年,运维人需要面对不断涌现的新兴技术和架构转型的要求,例如企业上云、分布式、容器化、双中心双活等等。随着传统企业把更多的业务向线上化和数字化发展,IT运维也面临着业务模式改变随之而来的更多要求。做好运维,除了学好新技术,更需要从运维理念、运维方式和运维视角转变等方面去适应变化。以下是我个人的一些思考。
华汇数据
2022/04/20
2.5K0
运维向运营转型,会是企业IT传统运维的发展方向吗?
运维助力敏捷交付-我们的运维看板
导言: 在许多工作场景中运维经常遇到的很多问题实际上和研发、质量、测试是有关联的,运维作为产品交付的最后环节遇到的很多问题其实和研发遇到的也非常类似。于是我向廖君仪老师询问能不能把敏捷看板带到运维团队内部,使用敏捷的方法来解决这些问题。 接下来我们会从上到下跟大家分享以下五部分:运维面临的挑战,敏捷开发方法,还有我们的运维看板,以及敏捷软件生命周期,最后是我们的结论:运维也可以敏捷。我们希望通过这次分享向大家交付两个内容,第一点,理解敏捷是什么,第二点大家回去后能尝试进行看板实践。 运维的挑战 运维到底能在
DevOps时代
2018/02/02
3K0
运维助力敏捷交付-我们的运维看板
【kafka运维】Leader重新选举运维脚本
1 指定Topic指定分区用重新PREFERRED:优先副本策略 进行Leader重选举
石臻臻的杂货铺[同名公众号]
2021/12/31
3.4K0
2.【kafka运维】ConfigCommand运维脚本
删除配置: --delete-config k1=v1,k2=v2 添加/修改配置: --add-config k1,k2 选择类型: --entity-type (topics/clients/users/brokers/broker- loggers) 类型名称: --entity-name
石臻臻的杂货铺[同名公众号]
2022/04/13
2.6K0
2.【kafka运维】ConfigCommand运维脚本
运维管理与运维自动化
2.环境管理,包括开发环境、测试环境、生产环境等; 3.部署,将应用或系统部署至不同环境; 4.监控,对基础设施、应用或系统进行监控; 5.告警响应,对告警通知的响应及处理; 6.性能优化,对系统及相关组件性能进行优化; 7.系统高可用,对应用系统中的单点进行高可用升级; 8.SLA保障,保证业务系统的可用性,可根据SLA实现自动扩缩容;
iginkgo18
2023/07/21
1.5K0
【运维故事】运维小白黑化记
来源:运维人那些事儿 ID:jzjytd2016 【01】换工作 2017年8月份的某一个晴朗慵懒的下午,我在望京中环南路7号西家大院E楼5层最角落且紧靠大落地窗的工位上掐指一算,我在研究院竟然已经工作7年了! 在一个不太忙的外企成为老员工的好处就是有很多特权,比如可以霸占最好的工位,可以有一群情(chou)深(wei)意(xiang)切(tou)的小伙伴每天天南海北胡吃胡侃,可以自由决定上班时间,领导base在国外,有事情还有小弟顶班,简直是现世安稳,岁月静好,于是,我做出了一个重大决定,换个工作吧。
小小科
2018/06/20
2.4K0
运维杂谈
我一直把运维团队的定位是在技术服务团队,个人也要朝着技术服务的方向去发展。单纯的服务定位对整个团队的发展不是非常有利,会逐渐沦为救火队员和保姆的角色,有点高级人员干着低级的活的感觉。
用户1593318
2019/11/18
6.8K1
运维相关
服务器配置: 数据库rds、redis、nacos、nginx、node、git、域名、OSS、java、maven 安装Java\maven\nginx\Mysal JAVA yum install java-1.8.0-openjdk : java -version vim /etc/profile.d/java.sh JAVA_HOME=“/usr/lib/jvm/java-1.8.0-openjdk” source /etc/profile.d/java.sh 验证:echo $JA
六个周
2022/10/28
2.9K0
运维相关
运维的境界
怎么说我也算个出道十年的运维老兵,连笔记在技术博客上也做了九年了,可是最近与一位业外人士交流时怎么都不能用大白话讲清楚运维具体是做什么的?
三杯水Plus
2020/06/02
6160
ceph 运维
一、集群扩展 1、添加OSD节点 image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png 2、删除OSD节点 image.png image.png image.png 3、添加mon节点 image.png image.png image.png image.png image.png i
用户5760343
2022/05/18
2.4K0
ceph 运维
Docker 运维
1、在线扩容 2、#单主机容器通信由 --icc控制,设置为false,容器间不能通信,默认为true ~设置link ~通过虚拟IP和端口 3、单主机容器网络:none,host,bridge https://www.cnblogs.com/justinli/p/11679270.html 4、docker 跨主机通信 ~flannel通信 ~overlay方式 ~macvlan方式 ~weave方式 ~calico方式 5、docker 更改容器日志驱动 docker run -d --log-driver=syslog redis -v 方式处理日志 日志收集 6、监控 docker stats
用户5760343
2019/12/13
1.6K0
linux运维
对于 web 服务,不管是上新,还是平时产品运营,节假日活动等,在这之前都需要评估现网压力承受能力,提前进行扩容,并做到防患于未然。所以对网站性能压力测试是必不可少的,这样才能充分了解自己部署的 web 服务 QPS。
py3study
2020/01/03
15.4K0
运维流程管理:保障运维管理效能的推手
任何的管理活动中都有流程,IT运维管理也是。而在企业中流程管理的工具很多,常见的有OA、BPM、专用工作流平台,以及一些管理系统中也会自带流程模块(如:HR系统、ITSM系统)。
嘉为蓝鲸
2020/04/08
7.8K0
运维流程管理:保障运维管理效能的推手
美创运维日记|MySQL运维必备神器
俗话说:工欲善其事,必先利其器!如果你是做MySQL DBA或运维的,Percona-toolkit我相信这是你日常工作中必备的神器,能够高效的帮助您完成日常的工作;
数据安全
2020/08/19
3.7K0
美创运维日记|MySQL运维必备神器
2.【kafka运维】ConfigCommand运维脚本(2)
删除配置: --delete-config k1=v1,k2=v2 添加/修改配置: --add-config k1,k2 选择类型: --entity-type (topics/clients/users/brokers/broker- loggers) 类型名称: --entity-name
石臻臻的杂货铺[同名公众号]
2021/08/03
1.4K0
2.【kafka运维】ConfigCommand运维脚本(2)

相似问题

TCA运维认证延期如何操作?

2671

运维考试认证的收据?

1369

怎样使用AI提升运维效率?

71.9K

linux系统运维人员如何学习python?

6718

什么才是Linux运维自动化?与普通运维的区别?

83.2K
相关问答用户
某公司 | 程序员擅长1个领域
腾讯云TDP | 先锋会员擅长2个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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