C脚本应该接受x个CPU绑定的fork和x个IO绑定的fork,所以假设总共有10个进程,如果每个进程都有5个,如果我fork 10次,则其中的5个应该去处理CPU限制的“假工作”,而其中的5个应该去处理IO限制的“假工作”。Waitstats是一个自定义函数,用于在显示rtime和wtime的同时等待。
我的问题是,我已经尝试了多种配置,我不知道如何让进程号printf正确打印,只有10次,如果只有10个分叉?我还觉得我没有正确地为CPU/IO绑定的工作做我的假工作。
任何帮助都将不胜感激!
`
int main(int argc, char* argv[])
{
int cpuNum = atoi(argv[2]);
int ioNum = atoi(argv[4]);
int const MAX_PROC = cpuNum + ioNum;
printf("\nMax Proc %d", MAX_PROC);
int totRunTime = 0;
int totWaitTime = 0;
uint rTime = 0;
uint wTime = 0;
int pid = 0;
//Create Max_Proc Forks
for(int n=0; n < MAX_PROC; n++)
{
pid = fork();
//If Child, Exceute Command
if(pid == 0)
{
break;
}
}
if (cpuNum > 0) {
//CPU Busy Work
for (volatile int i = 0; i < 1000000000; i++){}
cpuNum--;
}
else if (ioNum > 0) {
//IO Busy Work
sleep(200);
ioNum--;
}
for(int p=0; p < MAX_PROC; p++)
{
printf("\n Process %d finished", p);
if(waitStats(0, &rTime, &wTime) >= 0)
{
totRunTime += rTime;
totWaitTime += wTime;
}
}
printf("\nAverage rtime %d, wtime %d", rTime, wTime);
exit(0);
}
`
我尝试了多种配置,但似乎不能让printf打印正确的进程/分支数。例如,分支10次意味着每次这些分支中的一个完成它们的任务时,我都需要printf(总共10次)。
2条答案
按热度按时间vyswwuz21#
显示的代码不打印pid,所以我假设您的意思是“进程号”,如第一个孩子,第二个孩子等。
您的每个进程都在运行以下代码:
因此,看起来每个进程都将打印数字0.. MAX_PROC-1(没有指示正在打印哪个pid)
h6my8fg22#
您是否尝试过将waitStats for循环放在“Create Max_Proc Forks”for循环中?因此,基本上所有内容都应放在第一个循环中,这可能会为您提供跟踪进程号的好方法。