驗證Linux多進程時間片切換的程序

??
在這里插入圖片描述

一、軟件需求

在同時運行多個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/nrecordnrecord=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 := sched.c
CPPFLAGS := -pthreadall: $(TARGET)@echo "make successful"$(TARGET): $(SRC)@echo $(SRC)gcc $(CPPFLAGS) $^ -I. -o $@clean:rm $(TARGET)

四、實驗結果

nproc   ms      step
---------------------
2       0       2
2       1       4
2       2       6
...
2       172     100
---------------------
nproc   ms      step
---------------------
0       10      2
0       11      4
...
0       176     100
---------------------
nproc   ms      step
---------------------
1       6       2
1       7       4
...
1       203     100

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74932.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74932.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IvorySQL:兼容Oracle數據庫的開源PostgreSQL

今天給大家介紹一款基于 PostgreSQL 開發、兼容 Oracle 數據庫的國產開源關系型數據庫管理系統&#xff1a;IvorySQL。 IvorySQL 由商瀚高軟件提供支持&#xff0c;主要的功能特性包括&#xff1a; 完全兼容 PostgreSQL&#xff1a;IvorySQL 基于 PostgreSQL 內核開發&#xf…

樹莓派超全系列文檔--(13)如何使用raspi-config工具其二

如何使用raspi-config工具其二 raspi-configPerformance optionsOverclockGPU memoryOverlay file systemFan Localisation optionsLocaleTime zoneKeyboardWLAN country Advanced optionsExpand filesystemNetwork interface namesNetwork proxy settingsBoot orderBootloader…

QT音樂播放器(1):數據庫保存歌曲

實現功能&#xff1a;用數據庫保存本地導入和在線搜索的歌曲記錄 目錄 一. 保存本地添加的歌曲 1. 使用QSettings &#xff08;1&#xff09;在構造函數中&#xff0c;創建對象。 &#xff08;2&#xff09;在導入音樂槽函數中&#xff0c;保存新添加的文件路徑&#xff0c…

自動化發布工具CI/CD實踐Jenkins常用工具和插件的使用

1、安裝常用工具 名稱版本備注jdkjava8代碼打包所需git1.8.3.1maven3.6.3注意配置私服內容nvm0.39.3多Node.js環境管理工具Node.jsv14.18.0 / v16.17.1包管理工具yarn1.22.15包管理工具 1.1 安裝jdk Jenkins 需要使用java11 及以上&#xff0c;但是代碼打包依賴jdk8&#xff…

shared_ptr和 weak_ptr的詳細介紹

關于 shared_ptr 和 weak_ptr 的詳細介紹及使用示例&#xff1a; 1. shared_ptr&#xff08;共享所有權智能指針&#xff09; 核心特性 引用計數&#xff1a;記錄當前有多少個 shared_ptr 共享同一個對象。自動釋放&#xff1a;當引用計數歸零時&#xff0c;自動釋放對象內存…

Spring AI MCP 架構詳解

Spring AI MCP 架構詳解 1.什么是MCP? MCP 是一種開放協議&#xff0c;它對應用程序向大語言模型&#xff08;LLMs&#xff09;提供上下文信息的方式進行了標準化。可以把 MCP 想象成人工智能應用程序的 USB-C 接口。就像 USB-C 為將設備連接到各種外圍設備和配件提供了一種…

騰訊系AI應用,可以生視頻,3D模型...

以下注冊手機后就可以使用了。 騰訊智影 智能抹除-在線去水印去字幕-抹除水印字幕-騰訊智影 混元&#xff08;文字&#xff0c;圖片生成3D&#xff09; 騰訊混元3D 混元視頻&#xff08;文字生成視頻&#xff0c;可惜右下角有文字&#xff09; https://video.hunyuan.tencen…

數據結構(并查集,圖)

并查集 練習版 class UnionFindSet { public:void swap(int* a, int* b){int tmp *a;*a *b;*b tmp;}UnionFindSet(size_t size):_ufs(size,-1){}int UnionFind(int x){}void Union(int x1, int x2){}//長分支改為相同節點int FindRoot(int x){}bool InSet(int x1, int x2)…

數據結構:探秘AVL樹

本節重點 理解AVL樹的概念掌握AVL樹正確的插入方法利用_parent指針正確更新平衡因子掌握并理解四種旋轉方式&#xff1a;左單旋&#xff0c;右單旋&#xff0c;左右雙旋&#xff0c;右左雙旋 一、AVL樹的概念 AVL樹得名于它的發明者G. M. Adelson-Velsky和E. M. Landis&…

電源系統的熱設計與熱管理--以反激式充電器為例

前言 反激電源常用于各種電子設備中&#xff0c;比如充電器、適配器等&#xff0c;它們通過變壓器進行能量轉換。高溫環境可能對電子元件造成影響&#xff0c;特別是像MOSFET、二極管、變壓器這樣的關鍵部件&#xff0c;導致效率變低&#xff0c;甚至可能導致功能失效。還有安…

linux課程學習二——緩存

一.文件io與標準io的一個區別 遇到死循環可以ctrl c結束進程 使用printf輸出&#xff0c;輸出沒有問題 用wirte輸出&#xff0c;參數1&#xff0c;可以理解為上面介紹的linux標準文件描述符的1&#xff08;STDOUT&#xff09;標準輸出&#xff0c;我們加上一個死循環while&…

Kafka中的消息如何分配給不同的消費者?

大家好&#xff0c;我是鋒哥。今天分享關于【Kafka中的消息如何分配給不同的消費者&#xff1f;】面試題。希望對大家有幫助&#xff1b; Kafka中的消息如何分配給不同的消費者&#xff1f; 在 Kafka 中&#xff0c;消息是通過 主題&#xff08;Topic&#xff09; 進行組織的&…

Android的安全問題 - 在 Android 源碼的 system/sepolicy 目錄中,區分 public、private 和 vendor的目的

參考&#xff1a;Google文檔 在 Android 8.0 及更高版本中自定義 SEPolicy 在 Android 源碼的 system/sepolicy 目錄中&#xff0c;區分 public、private 和 vendor 是為了模塊化 SELinux 策略&#xff0c;并明確不同部分的訪問權限和接口邊界。這種設計主要基于以下原因&…

Java NIO之FileChannel 詳解

關鍵點說明 文件打開選項&#xff1a; StandardOpenOption.CREATE - 文件不存在時創建 StandardOpenOption.READ/WRITE - 讀寫權限 StandardOpenOption.APPEND - 追加模式 StandardOpenOption.TRUNCATE_EXISTING - 清空已存在文件 緩沖區操作&#xff1a; ByteBuffer.wrap…

stock-pandas,一個易用的talib的替代開源庫。

原創內容第841篇&#xff0c;專注智能量化投資、個人成長與財富自由。 介紹一個ta-lib的平替——我們來實現一下&#xff0c;最高價突破布林帶上軌&#xff0c;和最低價突破布林帶下軌的可視化效果&#xff1a; cross_up_upper stock[high].copy()# cross_up_upper 最高價突破…

JVM 面經

1、什么是 JVM? JVM 就是 Java 虛擬機&#xff0c;它是 Java 實現跨平臺的基石。程序運行之前&#xff0c;需要先通過編譯器將 Java 源代碼文件編譯成 Java 字節碼文件&#xff1b;程序運行時&#xff0c;JVM 會對字節碼文件進行逐行解釋&#xff0c;翻譯成機器碼指令&#x…

【JavaScript】合體期功法——DOM(一)

目錄 DOMWeb API 基本概念作用和分類 什么是 DOMDOM 樹DOM 對象 獲取 DOM 元素根據 CSS 選擇器來獲取 DOM 元素選擇匹配的第一個元素選擇匹配的多個元素 其他獲取 DOM 元素方法 修改元素的內容對象.innerText 屬性對象.innerHTML 屬性案例&#xff1a;年會抽獎 修改元素屬性修改…

GAMMA數據處理(十)

今天向別人請教了一個問題&#xff0c;剛無意中搜索到了一模一樣的問題 不知道這個怎么解決... ok 解決了 有一個GAMMA的命令可轉換 但是很奇怪 完全對不上 轉換出來的行列號 不知道為啥 再試試 是因為經緯度坐標的小數點位數 de as

Java入門知識總結——章節(二)

ps&#xff1a;本章主要講數組、二維數組、變量 一、數組 數組是一個數據容器&#xff0c;可用來存儲一批同類型的數據 &#x1f511;&#xff1a;注意 類也可以是一個類的數組 public class Main {public static class Student {String name;int age; // 移除 unsignedint…

動態IP:網絡世界的“變色龍”如何改變你的在線體驗?

你知道嗎&#xff1f;有時候我覺得動態IP就像是網絡世界里的“變色龍”。它不像靜態IP那樣一成不變&#xff0c;而是隨時在變化&#xff0c;像是一個永遠在換衣服的演員。你永遠不知道它下一秒會變成什么樣子&#xff0c;但正是這種不確定性&#xff0c;讓它變得特別有趣。想象…