验证linux多进程时间片切换的程序
一、软件需求
在同时运行一个或多个一味消耗 CPU 时间执行处理的进程时,采集以下统计信息。
・在某一时间点运行在逻辑 CPU 上的进程是哪一个
・每个进程的运行进度通过分析这些信息,来确认本章开头对调度器的描述是否正确。实验程序的设计如下。
1) 命令行参数
・第 1 个参数(n):同时运行的进程数量
・第 2 个参数(total):程序运行的总时长(单位:毫秒)
・第 3 个参数(resol):采集统计信息的间隔(单位:毫秒)
2) 令 n 个进程同时运行,各个进程按照以下要求运行
・在消耗 total 毫秒的 CPU 时间后结束运行
・每 resol 毫秒记录一次以下 3 个数值:
①每个进程的唯一 ID(0~n−1 的各个进程独有的编号);
②从程序开始运行到记录的时间点为止经过的时间(单位:毫秒);
③进程的进度(单位:%),在结束运行后,把所有统计信息用制表符分隔并逐行输出。
在同时运行多个 CPU 密集型进程时,需采集以下统计信息:
- 当前运行在逻辑 CPU 上的进程 ID
- 每个进程的运行进度百分比
实验程序设计要求:
1. 命令行参数
| 参数 | 说明 | 示例值 |
| n | 并发进程数量 | 3 |
| total | 总运行时长(毫秒) | 50 |
| resol | 统计间隔(毫秒) | 1 |
2. 进程行为规范
- 每个进程消耗total毫秒 CPU 时间后结束
- 每resol毫秒记录:
- 进程 ID(0~n-1)
- 累计运行时间(ms)
- 进度百分比((i+1)*100/nrecord,nrecord=total/resol)
二、代码实现
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <err.h>#define NLOOP_FOR_ESTIMETION 1000000000UL
#define NSEC_PER_SEC 1000000000UL
#define NSEC_PER_MSEC 1000000UL/* 获取纳秒差 */
static inline long diff_nsec(struct timespec before, struct timespec after)
{return ((after.tv_sec * NSEC_PER_SEC + after.tv_nsec) - (before.tv_sec * NSEC_PER_SEC + before.tv_nsec));
}/* 每微秒消耗的空循环的次数 */
static unsigned long loops_per_msec(void)
{struct timespec before, after;clock_gettime(CLOCK_MONOTONIC, &before);unsigned long i;for(i = 0; i < NLOOP_FOR_ESTIMETION; i++);clock_gettime(CLOCK_MONOTONIC, &after);return ((NLOOP_FOR_ESTIMETION * NSEC_PER_MSEC) / diff_nsec(before, after));
}static inline void load(unsigned long nloops)
{unsigned long i;for(i = 0; i < nloops; i++ );
}static void chidld_fn(int nproc, struct timespec *buf, int nrecord, unsigned long nloop_per_resol, struct timespec start)
{int i;struct timespec ts;for(i = 0; i < nrecord; i++){load(nloop_per_resol);clock_gettime(CLOCK_MONOTONIC, &ts);buf[i] = ts;}printf("nproc\tms\t step\n");printf("---------------------\n");for(i = 0; i < nrecord; i++){printf("%d\t%ld\t%d\n", nproc, diff_nsec(start, buf[i]) / NSEC_PER_MSEC,((i + 1) * 100) / nrecord );}printf("---------------------\n");exit(EXIT_SUCCESS);
}int main(int argc, char *argv[])
{int ret = EXIT_FAILURE;if( 4 > argc){fprintf(stderr, "usage: %s <nproc> <total[ms]> <resolution[ms]>\n", argv[0]);exit(EXIT_FAILURE);}int nproc = atoi(argv[1]); //同时运行的进程的数量int total = atoi(argv[2]); //程序运行的总时长,ms为单位 int resol = atoi(argv[3]); //采集统计信息的间隔if(1 > nproc) //对进程数量参数过滤非法值{fprintf(stderr, "<nproc> (%d) should be >= 1\n", nproc);exit(EXIT_FAILURE);}if(1 > total) //对程序时长参数过滤非法值{fprintf(stderr, "<total> (%d) should be >= 1\n", total);exit(EXIT_FAILURE);}if(1 > resol) //对采集统计信息参数过滤非法值{fprintf(stderr, "<resol> (%d) should be >= 1\n", resol);exit(EXIT_FAILURE);}if(total % resol){fprintf(stderr, "<total> (%d) should be mutliple of <resol> (%d) \n",total, resol);exit(EXIT_FAILURE);}int nrecord = total / resol;struct timespec* logbug = malloc(nrecord * sizeof(struct timespec)); //堆中开辟内存if(!logbug){err(EXIT_FAILURE, "malloc(nrecord) failed");}puts("estimeting workload which just take one millsecond");unsigned long nloops_per_resol = loops_per_msec() * resol;puts("end estimeting");fflush(stdout); // fflush logpid_t* pids = malloc(nrecord * sizeof(pid_t));if(!pids){warn("malloc (pids) failed");goto free_logbuf;}int i, ncreated;struct timespec start;clock_gettime(CLOCK_MONOTONIC, &start);for(i = 0, ncreated = 0; i < nproc; i++, ncreated++){pids[i] = fork();if( 0 > pids[i]){goto wait_children;}else if( 0 == pids[i]){//子进程执行空间chidld_fn(i, logbug, nrecord, nloops_per_resol, start);}}ret = EXIT_SUCCESS;wait_children:if(EXIT_FAILURE == ret) //杀死所有已创建的子进程.{for(i = 0; i < ncreated; i++){if(0 > kill(pids[i], SIGINT)){warn("kill(%d) failed", pids[i]);}}}for(i = 0; i < ncreated; i++) //等待子进程结束{if(0 > wait(NULL)){warn("wait() failed");}}free_pids:free(pids);free_logbuf:free(logbug);exit(ret);
}
三、编译配置(Makefile)
TARGET := app
#src file #g++ -std=c++11 $(CPPFLAGS) $^ -I. -o $@
SRC := sched.c
#cppflags setting
CPPFLAGS := -pthreadall:$(TARGET)@echo "make successfull"
$(TARGET): $(SRC)@echo $(SRC)gcc $(CPPFLAGS) $^ -I. -o $@clean:rm $(TARGET).PHONY:all,clean
四、实验结果
$ taskset -c 0 ./app 3 50 1
estimeting workload which just take one millsecond
end estimeting
nproc ms step
---------------------
2 0 2
2 1 4
2 2 6
2 2 8
2 3 10
2 3 12
2 4 14
2 5 16
2 23 18
2 24 20
2 25 22
2 26 24
2 28 26
2 37 28
2 38 30
2 40 32
2 50 34
2 52 36
2 53 38
2 55 40
2 56 42
2 74 44
2 76 46
2 85 48
2 86 50
2 87 52
2 88 54
2 89 56
2 90 58
2 90 60
2 91 62
2 92 64
2 109 66
2 110 68
2 112 70
2 113 72
2 131 74
2 132 76
2 133 78
2 135 80
2 142 82
2 143 84
2 144 86
2 157 88
2 159 90
2 167 92
2 168 94
2 169 96
2 170 98
2 172 100
---------------------
nproc ms step
---------------------
0 10 2
0 11 4
0 12 6
0 13 8
0 14 10
0 15 12
0 16 14
0 34 16
0 35 18
0 45 20
0 46 22
0 49 24
0 60 26
0 61 28
0 63 30
0 64 32
0 78 34
0 78 36
0 79 38
0 80 40
0 81 42
0 93 44
0 94 46
0 95 48
0 95 50
0 96 52
0 97 54
0 97 56
0 98 58
0 99 60
0 101 62
0 115 64
0 116 66
0 126 68
0 128 70
0 129 72
0 138 74
0 139 76
0 140 78
0 150 80
0 152 82
0 153 84
0 154 86
0 154 88
0 155 90
0 156 92
0 173 94
0 174 96
0 175 98
0 176 100
---------------------
nproc ms step
---------------------
1 6 2
1 7 4
1 8 6
1 9 8
1 19 10
1 20 12
1 30 14
1 31 16
1 33 18
1 43 20
1 44 22
1 58 24
1 59 26
1 67 28
1 68 30
1 69 32
1 71 34
1 72 36
1 82 38
1 83 40
1 84 42
1 101 44
1 102 46
1 103 48
1 105 50
1 106 52
1 109 54
1 118 56
1 120 58
1 121 60
1 124 62
1 125 64
1 146 66
1 148 68
1 149 70
1 161 72
1 162 74
1 164 76
1 165 78
1 178 80
1 179 82
1 180 84
1 182 86
1 183 88
1 185 90
1 200 92
1 201 94
1 202 96
1 202 98
1 203 100
---------------------
相关文章:
验证linux多进程时间片切换的程序
一、软件需求 在同时运行一个或多个一味消耗 CPU 时间执行处理的进程时,采集以下统计信息。 ・在某一时间点运行在逻辑 CPU 上的进程是哪一个 ・每个进程的运行进度 通过分析这些信息,来确认本章开头对调度器的描述是否正确。实验程序的…...
【Basys3】外设-灯和数码管
灯 约束文件 set_property PACKAGE_PIN W5 [get_ports CLK] set_property PACKAGE_PIN U18 [get_ports rst] set_property PACKAGE_PIN U16 [get_ports {led[0]}] set_property PACKAGE_PIN E19 [get_ports {led[1]}] set_property PACKAGE_PIN U19 [get_ports {led[2]}] set…...
axios文件下载使用后端传递的名称
java后端通过HttpServletResponse 返回文件流 在Content-Disposition中插入文件名 一定要设置Access-Control-Expose-Headers,代表跨域该Content-Disposition返回Header可读,如果没有,前端是取不到Content-Disposition的,可以在统…...
从零开始搭建Anaconda环境
Anaconda是一个流行的Python数据科学平台,包含conda包管理器、Python解释器和大量预装的数据科学工具包。以下是详细的安装和配置步骤: 1. 下载Anaconda 访问Anaconda官方网站 根据你的操作系统(Windows/macOS/Linux)选择相应版本 推荐下载Python 3.x版…...
TDengine 中的命名与边界
简介 本章主要介绍命名的合法字符集和限制规则,这对于正确使用 TDengine,减小报错很重要,这些规则在 SQL 语句中都生效,在使用过程中要注意,避免不必要的错误。 名称命名规则 合法字符:英文字符、数字和…...
软件架构设计中的软件过程模型初识
软件架构设计中的软件过程模型是指导软件开发过程的框架,它们定义了软件开发的不同阶段、活动、任务和角色。结合具体的使用场景,可以更好地理解这些模型如何在实际项目中应用。以下将详细介绍几种常见的软件过程模型,并结合典型场景进行讲解…...
基于ssm的课程辅助教学平台(全套)
互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对《离散结构》课程教学信息管理混乱,出错率高,信息安…...
[创业之路-344]:战略的本质是选择、聚焦, 是成本/效率/低毛利优先,还是差易化/效益/高毛利优先?无论是成本优先,还是差易化战略,产品聚焦是前提。
前言: 一、战略的本质是选择、聚焦 关于战略的本质,触及了商业竞争的核心矛盾:选择成本优先(效率/低毛利)还是差异化(效益/高毛利),本质上是对企业战略方向的终极拷问。 1、战略选…...
洛谷题单1-P5705 【深基2.例7】数字反转-python-流程图重构
题目描述 输入一个不小于 100 100 100 且小于 1000 1000 1000,同时包括小数点后一位的一个浮点数,例如 123.4 123.4 123.4 ,要求把这个数字翻转过来,变成 4.321 4.321 4.321 并输出。 输入格式 一行一个浮点数 输出格式 …...
Typora 小乌龟 git 上传到gitee仓库教程
首先进行资源分享 通过网盘分享的文件:TortoiseGit-LanguagePack-2.17.0.0-64bit-zh_CN.msi等4个文件 链接: https://pan.baidu.com/s/1NC8CKLifCEH_YixDU3HG_Q?pwdqacu 提取码: qacu --来自百度网盘超级会员v3的分享 首先将软件进行解压 看自己电脑的版本进行…...
【新人系列】Golang 入门(八):defer 详解 - 上
✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12898955.html 📣 专栏定位:为 0 基础刚入门 Golang 的小伙伴提供详细的讲解,也欢迎大佬们…...
知识图谱之知识抽取:从数据海洋中 “捞金”
目录 知识抽取:开启知识宝库的钥匙 知识抽取的对象:实体、关系与属性 知识抽取的方法:各显神通的 “淘金术” 基于规则的方法 机器学习方法 深度学习方法 知识抽取面临的挑战:荆棘丛中的探索 数据的多样性和复杂性 语义理…...
RAG - 五大文档切分策略深度解析
文章目录 切分策略1. 固定大小分割(Fixed-Size Chunking)2. 滑动窗口分割(Sliding Window Chunking)3. 自然语言单元分割(Sentence/Paragraph Segmentation)4. 语义感知分割(Semantic-Aware Seg…...
keil中文注释出现乱码怎么解决
keil中文注释出现乱码怎么解决 在keil–edit–configuration中encoding改为chinese-GB2312...
论文阅读笔记——ReconDreamer
ReconDreamer 论文 在 DriveDreamer4D 的基础上,通过渐进式数据更新,解决大范围机动(多车道连续变道、紧急避障)的问题。同时 DriveDreamer4D生成轨迹后直接渲染,而 ReconDreamer 会实时通过 DriveRestorer 检测渲染结…...
鸿蒙harmonyOS:笔记 正则表达式
从给出的文本中,按照既定的相关规则,匹配出符合的数据,其中的规则就是正则表达式,使用正则表达式,可以使得我们用简洁的代码就能实现一定复杂的逻辑,比如判断一个邮箱账号是否符合正常的邮箱账号࿰…...
计算机网络——传输层(TCP)
传输层 在计算机网络中,传输层是将数据向上向下传输的一个重要的层面,其中传输层中有两个协议,TCP,UDP 这两个协议。 TCP 话不多说,我们直接来看协议报头。 源/目的端口号:表示数据从哪个进程来࿰…...
英伟达与通用汽车深化合作,澳特证券am broker助力科技投资
在近期的GTC大会上,英伟达CEO黄仁勋宣布英伟达将与通用汽车深化合作,共同推进AI技术在自动驾驶和智能工厂的应用。此次合作标志着自动驾驶汽车时代的加速到来,同时也展示了英伟达在AI技术领域的最新进展。 合作内容包括:…...
Visual Studio 2022静态库与动态库创建及使用完全指南
在C开发中,库(Library)是代码复用的重要方式。本教程将详细介绍如何在Visual Studio 2022中创建和使用静态库(.lib)和动态库(.dll),每种库类型都会有完整的创建步骤和实际示例。 第…...
C++中常见符合RAII思想的设计有哪些
文章目录 **一、标准库中的 RAII 类**1. **智能指针**2. **文件操作类**3. **锁管理类**4. **容器类**5. **线程管理** **二、自定义 RAII 类的常见场景**1. **数据库连接**2. **图形资源管理(如 OpenGL 纹理)**3. **网络套接字**4. **事务处理**5. **临…...
CUDA Memory Fence 函数的功能与硬件实现细节
CUDA Memory Fence 函数的功能与硬件实现细节 Memory Fence 的基本功能 CUDA中的memory fence函数用于控制内存操作的可见性顺序,确保在fence之前的内存操作对特定范围内的线程可见。主要功能包括: 排序内存操作:确保fence之前的内存操作在…...
CSS学习笔记5——渐变属性+盒子模型阶段案例
目录 通俗易懂的解释 渐变的类型 1、线性渐变 渐变过程 2、径向渐变 如何理解CSS的径向渐变,以及其渐变属性 通俗易懂的解释 渐变属性 1. 形状(Shape) 2. 大小(Size) 3. 颜色停靠点(Color Sto…...
[Java微服务架构]4_服务通信之客户端负载均衡
欢迎来到啾啾的博客🐱,一个致力于构建完善的Java程序员知识体系的博客📚,记录学习的点滴,分享工作的思考、实用的技巧,偶尔分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄…...
基于SpringBoot实现的高校实验室管理平台功能四
一、前言介绍: 1.1 项目摘要 随着信息技术的飞速发展,高校实验室的管理逐渐趋向于信息化、智能化。传统的实验室管理方式存在效率低下、资源浪费等问题,因此,利用现代技术手段对实验室进行高效管理显得尤为重要。 高校实验室作为…...
吴恩达深度学习复盘(1)神经网络与深度学习的发展
一、神经网络的起源与生物学动机 灵感来源 神经网络的最初动机源于对生物大脑的模仿。20 世纪 50 年代,科学家试图通过软件模拟神经元的工作机制(如树突接收信号、轴突传递信号),构建类似人类大脑的信息处理系统。 生物神经元的简…...
用Python实现资本资产定价模型(CAPM)
使用 Python 计算资本资产定价模型(CAPM)并获取贝塔系数(β)。 步骤 1:导入必要的库 import pandas as pd import yfinance as yf import statsmodels.api as sm import matplotlib.pyplot as plt 步骤 2࿱…...
Linux进程管理之子进程的创建(fork函数)、子进程与线程的区别、fork函数的简单使用例子、子进程的典型应用场景、父进程等待子进程结束后自己再结束
收尾 进程终止:子进程通过exit()或_exit()终止,父进程通过wait()或waitpid()等待子进程终止,并获取其退出状态。?其实可以考虑在另一篇博文中来写 fork函数讲解 fork函数概述 fork() 是 Linux 中用于创建新进程的系统调用。当…...
妙用《甄嬛传》中的选妃来记忆概率论中的乘法公式
强烈推荐最近在看的不错的B站概率论课程 《概率统计》正课,零废话,超精讲!【孔祥仁】 《概率统计》正课,零废话,超精讲!【孔祥仁】_哔哩哔哩_bilibili 其中概率论中的乘法公式,老师用了《甄嬛传…...
虚幻基础:UI
文章目录 控件蓝图可以装载其他控件蓝图可以安装其他蓝图接口 填充:相对于父组件填充水平框尺寸—填充—0.5:改变填充的尺寸填充—0.5:改变与父组件的距离 锚点:相对于父组件的控件坐标系原点,屏幕比例改变时ÿ…...
【MySQL篇】事务管理,事务的特性及深入理解隔离级别
目录 一,什么是事务 二,事务的版本支持 三,事务的提交方式 四,事务常见操作方式 五,隔离级别 1,理解隔离性 2,查看与设置隔离级别 3,读未提交(read uncommitted&a…...
