验证linux多进程时间片切换的程序

news2025/4/2 21:01:21

一、软件需求

在同时运行一个或多个一味消耗 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毫秒记录:
  1. 进程 ID(0~n-1)
  2. 累计运行时间(ms)
  3. 进度百分比((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 log

    pid_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 := -pthread


all:$(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
---------------------

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【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&#xff0c;代表跨域该Content-Disposition返回Header可读&#xff0c;如果没有&#xff0c;前端是取不到Content-Disposition的&#xff0c;可以在统…

从零开始搭建Anaconda环境

Anaconda是一个流行的Python数据科学平台&#xff0c;包含conda包管理器、Python解释器和大量预装的数据科学工具包。以下是详细的安装和配置步骤&#xff1a; 1. 下载Anaconda 访问Anaconda官方网站 根据你的操作系统(Windows/macOS/Linux)选择相应版本 推荐下载Python 3.x版…

基于ssm的课程辅助教学平台(全套)

互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对《离散结构》课程教学信息管理混乱&#xff0c;出错率高&#xff0c;信息安…

[创业之路-344]:战略的本质是选择、聚焦, 是成本/效率/低毛利优先,还是差易化/效益/高毛利优先?无论是成本优先,还是差易化战略,产品聚焦是前提。

前言&#xff1a; 一、战略的本质是选择、聚焦 关于战略的本质&#xff0c;触及了商业竞争的核心矛盾&#xff1a;选择成本优先&#xff08;效率/低毛利&#xff09;还是差异化&#xff08;效益/高毛利&#xff09;&#xff0c;本质上是对企业战略方向的终极拷问。 1、战略选…

Typora 小乌龟 git 上传到gitee仓库教程

首先进行资源分享 通过网盘分享的文件&#xff1a;TortoiseGit-LanguagePack-2.17.0.0-64bit-zh_CN.msi等4个文件 链接: https://pan.baidu.com/s/1NC8CKLifCEH_YixDU3HG_Q?pwdqacu 提取码: qacu --来自百度网盘超级会员v3的分享 首先将软件进行解压 看自己电脑的版本进行…

【新人系列】Golang 入门(八):defer 详解 - 上

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12898955.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Golang 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

RAG - 五大文档切分策略深度解析

文章目录 切分策略1. 固定大小分割&#xff08;Fixed-Size Chunking&#xff09;2. 滑动窗口分割&#xff08;Sliding Window Chunking&#xff09;3. 自然语言单元分割&#xff08;Sentence/Paragraph Segmentation&#xff09;4. 语义感知分割&#xff08;Semantic-Aware Seg…

keil中文注释出现乱码怎么解决

keil中文注释出现乱码怎么解决 在keil–edit–configuration中encoding改为chinese-GB2312

论文阅读笔记——ReconDreamer

ReconDreamer 论文 在 DriveDreamer4D 的基础上&#xff0c;通过渐进式数据更新&#xff0c;解决大范围机动&#xff08;多车道连续变道、紧急避障&#xff09;的问题。同时 DriveDreamer4D生成轨迹后直接渲染&#xff0c;而 ReconDreamer 会实时通过 DriveRestorer 检测渲染结…

鸿蒙harmonyOS:笔记 正则表达式

从给出的文本中&#xff0c;按照既定的相关规则&#xff0c;匹配出符合的数据&#xff0c;其中的规则就是正则表达式&#xff0c;使用正则表达式&#xff0c;可以使得我们用简洁的代码就能实现一定复杂的逻辑&#xff0c;比如判断一个邮箱账号是否符合正常的邮箱账号&#xff0…

计算机网络——传输层(TCP)

传输层 在计算机网络中&#xff0c;传输层是将数据向上向下传输的一个重要的层面&#xff0c;其中传输层中有两个协议&#xff0c;TCP&#xff0c;UDP 这两个协议。 TCP 话不多说&#xff0c;我们直接来看协议报头。 源/目的端口号&#xff1a;表示数据从哪个进程来&#xff0…

英伟达与通用汽车深化合作,澳特证券am broker助力科技投资

在近期的GTC大会上&#xff0c;英伟达CEO黄仁勋宣布英伟达将与通用汽车深化合作&#xff0c;共同推进AI技术在自动驾驶和智能工厂的应用。此次合作标志着自动驾驶汽车时代的加速到来&#xff0c;同时也展示了英伟达在AI技术领域的最新进展。      合作内容包括&#xff1a;…

CSS学习笔记5——渐变属性+盒子模型阶段案例

目录 通俗易懂的解释 渐变的类型 1、线性渐变 渐变过程 2、径向渐变 如何理解CSS的径向渐变&#xff0c;以及其渐变属性 通俗易懂的解释 渐变属性 1. 形状&#xff08;Shape&#xff09; 2. 大小&#xff08;Size&#xff09; 3. 颜色停靠点&#xff08;Color Sto…

[Java微服务架构]4_服务通信之客户端负载均衡

欢迎来到啾啾的博客&#x1f431;&#xff0c;一个致力于构建完善的Java程序员知识体系的博客&#x1f4da;&#xff0c;记录学习的点滴&#xff0c;分享工作的思考、实用的技巧&#xff0c;偶尔分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604…

基于SpringBoot实现的高校实验室管理平台功能四

一、前言介绍&#xff1a; 1.1 项目摘要 随着信息技术的飞速发展&#xff0c;高校实验室的管理逐渐趋向于信息化、智能化。传统的实验室管理方式存在效率低下、资源浪费等问题&#xff0c;因此&#xff0c;利用现代技术手段对实验室进行高效管理显得尤为重要。 高校实验室作为…

用Python实现资本资产定价模型(CAPM)

使用 Python 计算资本资产定价模型&#xff08;CAPM&#xff09;并获取贝塔系数&#xff08;β&#xff09;。 步骤 1&#xff1a;导入必要的库 import pandas as pd import yfinance as yf import statsmodels.api as sm import matplotlib.pyplot as plt 步骤 2&#xff1…

Linux进程管理之子进程的创建(fork函数)、子进程与线程的区别、fork函数的简单使用例子、子进程的典型应用场景、父进程等待子进程结束后自己再结束

收尾 进程终止&#xff1a;子进程通过exit()或_exit()终止&#xff0c;父进程通过wait()或waitpid()等待子进程终止&#xff0c;并获取其退出状态。&#xff1f;其实可以考虑在另一篇博文中来写 fork函数讲解 fork函数概述 fork() 是 Linux 中用于创建新进程的系统调用。当…

妙用《甄嬛传》中的选妃来记忆概率论中的乘法公式

强烈推荐最近在看的不错的B站概率论课程 《概率统计》正课&#xff0c;零废话&#xff0c;超精讲&#xff01;【孔祥仁】 《概率统计》正课&#xff0c;零废话&#xff0c;超精讲&#xff01;【孔祥仁】_哔哩哔哩_bilibili 其中概率论中的乘法公式&#xff0c;老师用了《甄嬛传…

【MySQL篇】事务管理,事务的特性及深入理解隔离级别

目录 一&#xff0c;什么是事务 二&#xff0c;事务的版本支持 三&#xff0c;事务的提交方式 四&#xff0c;事务常见操作方式 五&#xff0c;隔离级别 1&#xff0c;理解隔离性 2&#xff0c;查看与设置隔离级别 3&#xff0c;读未提交&#xff08;read uncommitted&a…