fork的问题

arden1019 2005-07-19 01:42:33
我在linux下写了一个求和小程序看看fork如何工作:
//sum1.c
#include <stdio.h>
#include <stdlib.h>

int sum;

main()
{
int i;
sum=0;
for(i=1;i<=1000;i++)
{
printf("i value is %d\n",i);
fflush(stdout);
sum+=i;

}
printf("sum is %d\n",sum);
exit(0);
}

运行后发现系统在i到190多的时候,有一次cpu进程切换。

我感觉不明显,将程序里面添加了内循环变成1000*1000次:
//sum2.c
#include <stdio.h>
#include <stdlib.h>

int sum;

main()
{
int i,j;
sum=0;
for(i=1;i<=1000;i++)
{
for(j=1;j<=1000;j++)
{
if(900==j){
printf("i value is %d\n",i);
fflush(stdout);
sum+=i;}
}
}
printf("sum is %d\n",sum);
exit(0);
}

结果还是只有一次cpu切换。

这是为什么?在我想象中cpu切换进程应该是基本上稳定的吧。大大们帮忙解释一下。
...全文
157 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
atgjplh 2005-07-21
  • 打赏
  • 举报
回复
我没看到你程度理有什么frok
if ( (pid=fork())==0 )
dophin1003 2005-07-21
  • 打赏
  • 举报
回复
调度的规则有很多种。
运行的情况也不是每次都一样。因为还有其他的进程也在运行
这种推测是没有根据的。
antijpn 2005-07-20
  • 打赏
  • 举报
回复
要知道CPU进行进程切换是有不止一种条件的,最简单的时间分片到达,当前进程调用了阻塞操作等等,要分情况的

另外,建议使用
while(1)
{
pid = getpid();
printf("%d", pid);
}

这样更容易区分到底是哪一个进程
arden1019 2005-07-19
  • 打赏
  • 举报
回复

系统不管分配那个进程,总是要分片的吧. 那么我的输出即使没有那么整齐也应该是分开的.楼上兄弟的意思是说我给cpu的任务太少了?

newbiestar 2005-07-19
  • 打赏
  • 举报
回复
怎么能以这样的方式推断系统的上下文切换呢?再说,你创建的是进程而不是线程(更严格点要求的话,还必须是用户级线程,内核调度的同进程),一个系统里面除了你的这两个进程以外还有其他的进程在运行,你就明确地确定进程调度不会把控制权交给其他的进程?

如果光执行了这点代码,就要求一次切换的话,这个系统也似乎是太慢了点……
arden1019 2005-07-19
  • 打赏
  • 举报
回复
我想如果cpu在i=190的时候分片,那么后面也应该继续分啊。像这样循环下去

ivalue is 192 //切换
ivalue is 1
ivalue is 2
ivalue is 3
...
ivalue is 203
ivalue is 193 //切换回来
ivalue is 194
...
antijpn 2005-07-19
  • 打赏
  • 举报
回复
楼主想要说明什么?
arden1019 2005-07-19
  • 打赏
  • 举报
回复
注: 上面的代码在sum=0;后有一句 fork();

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧