fork的问题
我在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切换进程应该是基本上稳定的吧。大大们帮忙解释一下。
//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切换进程应该是基本上稳定的吧。大大们帮忙解释一下。
...全文
相关推荐
a-fork-of-beepbox:消除了意外滚动页面的问题
标题中的"a-fork-of-beepbox"指的是一个对原始Beepbox项目的修改或分支,它是一个在线音乐创作工具,让用户可以使用类似于编程的界面来创作音乐。
多线程下的fork问题(模拟与解决)
本文深入探讨了在多线程环境下使用fork函数可能导致的死锁问题,分析了原因并提供了两种解决方案:一是通过exec函数替换进程程序,二是利用pthread_atfork函数管理锁。通过实例代码展示了死锁的模拟与解决过程。
fork中的死锁问题
在Linux系统中,使用C++通过fork创建子进程时,若父/子进程涉及锁操作,可能产生死锁。这是因为子进程会继承父进程内存空间,锁状态也被继承。文章给出解决方法,如子进程能访问锁则先解锁,否则用pthread_atfork(),还给出编写程序的建议。
fork的使用和多次fork产生的一系列问题
本文通过一道程序题探讨了fork操作如何影响进程中的缓冲区,特别是C库IO函数的缓冲行为。在没有fflush的情况下,由于进程复制了缓冲区,导致最终输出8个'-'。而使用fflush清空缓冲区后,输出减少到6个'-'。当将程序输出重定向到文件时,由于变为全缓冲模式,缓冲区长度改变,再次观察到8个'-'的输出结果。
Linux下C语言的fork()子进程函数用法及相关问题解析
总结来说,`fork()`函数在Linux下是创建子进程的关键,理解其返回值的含义以及在并发环境中的行为是解决相关问题的基础。


