c - 父子进程计时

标签 c process operating-system fork

我编写这个小程序是为了帮助我更好地理解流程:

#include <stdio.h>
#include <unistd.h>

int main()
{
    int pid;
    int i;
    if ((pid = fork()) == 0)
    {
        for (i = 0; i < 100; i++)
        {
            printf("child, pid = %d, i = %d\n", getpid(), i);
        }
    }
    else if (pid > 0)
    {
        for (i = 0; i > -100; i--)
        {
            printf("parent, pid = %d, i = %d\n", getpid(), i);
        }
    }
    else
    {
        perror("failed fork!\n");
        exit(1);
    }
    return 0;
}

当我实际运行该程序时,我很惊讶地看到输出。 父进程首先启动,反过来也可能发生,对吗?在我的机器上,它似乎总是选择父级。 但令我惊讶的是,该过程一旦启动就无法完成输出所有 i 值。为什么是这样?一个进程所花费的时间有这么少吗? 然后更奇怪的是,父级和子级开始轮流使用 printfs,每人仅输出一行,直到父级完成循环,因为它有一个领先优势,然后子级必须打印其余的 i 值。 同样,如何解释这种行为?

这是我得到的输出:

parent, pid = 3246, i = 0
parent, pid = 3246, i = -1
parent, pid = 3246, i = -2
parent, pid = 3246, i = -3
parent, pid = 3246, i = -4
parent, pid = 3246, i = -5
parent, pid = 3246, i = -6
parent, pid = 3246, i = -7
parent, pid = 3246, i = -8
parent, pid = 3246, i = -9
parent, pid = 3246, i = -10
parent, pid = 3246, i = -11
parent, pid = 3246, i = -12
parent, pid = 3246, i = -13
parent, pid = 3246, i = -14
parent, pid = 3246, i = -15
parent, pid = 3246, i = -16
parent, pid = 3246, i = -17
parent, pid = 3246, i = -18
parent, pid = 3246, i = -19
parent, pid = 3246, i = -20
parent, pid = 3246, i = -21
parent, pid = 3246, i = -22
parent, pid = 3246, i = -23
parent, pid = 3246, i = -24
parent, pid = 3246, i = -25
parent, pid = 3246, i = -26
parent, pid = 3246, i = -27
parent, pid = 3246, i = -28
parent, pid = 3246, i = -29
parent, pid = 3246, i = -30
parent, pid = 3246, i = -31
parent, pid = 3246, i = -32
parent, pid = 3246, i = -33
parent, pid = 3246, i = -34
parent, pid = 3246, i = -35
parent, pid = 3246, i = -36
parent, pid = 3246, i = -37
parent, pid = 3246, i = -38
parent, pid = 3246, i = -39
parent, pid = 3246, i = -40
parent, pid = 3246, i = -41
parent, pid = 3246, i = -42
parent, pid = 3246, i = -43
parent, pid = 3246, i = -44
parent, pid = 3246, i = -45
parent, pid = 3246, i = -46
parent, pid = 3246, i = -47
parent, pid = 3246, i = -48
parent, pid = 3246, i = -49
parent, pid = 3246, i = -50
child, pid = 3247, i = 0
parent, pid = 3246, i = -51
parent, pid = 3246, i = -52
child, pid = 3247, i = 1
parent, pid = 3246, i = -53
child, pid = 3247, i = 2
parent, pid = 3246, i = -54
child, pid = 3247, i = 3
parent, pid = 3246, i = -55
child, pid = 3247, i = 4
parent, pid = 3246, i = -56
child, pid = 3247, i = 5
parent, pid = 3246, i = -57
child, pid = 3247, i = 6
parent, pid = 3246, i = -58
child, pid = 3247, i = 7
parent, pid = 3246, i = -59
child, pid = 3247, i = 8
parent, pid = 3246, i = -60
child, pid = 3247, i = 9
parent, pid = 3246, i = -61
child, pid = 3247, i = 10
parent, pid = 3246, i = -62
child, pid = 3247, i = 11
parent, pid = 3246, i = -63
child, pid = 3247, i = 12
parent, pid = 3246, i = -64
child, pid = 3247, i = 13
parent, pid = 3246, i = -65
child, pid = 3247, i = 14
parent, pid = 3246, i = -66
child, pid = 3247, i = 15
parent, pid = 3246, i = -67
child, pid = 3247, i = 16
parent, pid = 3246, i = -68
child, pid = 3247, i = 17
parent, pid = 3246, i = -69
child, pid = 3247, i = 18
parent, pid = 3246, i = -70
child, pid = 3247, i = 19
parent, pid = 3246, i = -71
child, pid = 3247, i = 20
parent, pid = 3246, i = -72
child, pid = 3247, i = 21
parent, pid = 3246, i = -73
child, pid = 3247, i = 22
parent, pid = 3246, i = -74
child, pid = 3247, i = 23
parent, pid = 3246, i = -75
child, pid = 3247, i = 24
parent, pid = 3246, i = -76
child, pid = 3247, i = 25
parent, pid = 3246, i = -77
child, pid = 3247, i = 26
parent, pid = 3246, i = -78
child, pid = 3247, i = 27
parent, pid = 3246, i = -79
child, pid = 3247, i = 28
parent, pid = 3246, i = -80
child, pid = 3247, i = 29
parent, pid = 3246, i = -81
child, pid = 3247, i = 30
parent, pid = 3246, i = -82
child, pid = 3247, i = 31
parent, pid = 3246, i = -83
child, pid = 3247, i = 32
parent, pid = 3246, i = -84
child, pid = 3247, i = 33
parent, pid = 3246, i = -85
child, pid = 3247, i = 34
parent, pid = 3246, i = -86
child, pid = 3247, i = 35
parent, pid = 3246, i = -87
child, pid = 3247, i = 36
parent, pid = 3246, i = -88
child, pid = 3247, i = 37
parent, pid = 3246, i = -89
child, pid = 3247, i = 38
parent, pid = 3246, i = -90
child, pid = 3247, i = 39
parent, pid = 3246, i = -91
child, pid = 3247, i = 40
parent, pid = 3246, i = -92
child, pid = 3247, i = 41
parent, pid = 3246, i = -93
child, pid = 3247, i = 42
parent, pid = 3246, i = -94
child, pid = 3247, i = 43
parent, pid = 3246, i = -95
child, pid = 3247, i = 44
parent, pid = 3246, i = -96
child, pid = 3247, i = 45
parent, pid = 3246, i = -97
child, pid = 3247, i = 46
parent, pid = 3246, i = -98
child, pid = 3247, i = 47
parent, pid = 3246, i = -99
child, pid = 3247, i = 48
child, pid = 3247, i = 49
child, pid = 3247, i = 50
child, pid = 3247, i = 51
child, pid = 3247, i = 52
child, pid = 3247, i = 53
child, pid = 3247, i = 54
child, pid = 3247, i = 55
child, pid = 3247, i = 56
child, pid = 3247, i = 57
child, pid = 3247, i = 58
child, pid = 3247, i = 59
child, pid = 3247, i = 60
child, pid = 3247, i = 61
child, pid = 3247, i = 62
child, pid = 3247, i = 63
child, pid = 3247, i = 64
child, pid = 3247, i = 65
child, pid = 3247, i = 66
child, pid = 3247, i = 67
child, pid = 3247, i = 68
child, pid = 3247, i = 69
child, pid = 3247, i = 70
child, pid = 3247, i = 71
child, pid = 3247, i = 72
child, pid = 3247, i = 73
child, pid = 3247, i = 74
child, pid = 3247, i = 75
child, pid = 3247, i = 76
child, pid = 3247, i = 77
child, pid = 3247, i = 78
child, pid = 3247, i = 79
child, pid = 3247, i = 80
child, pid = 3247, i = 81
child, pid = 3247, i = 82
child, pid = 3247, i = 83
child, pid = 3247, i = 84
child, pid = 3247, i = 85
child, pid = 3247, i = 86
child, pid = 3247, i = 87
child, pid = 3247, i = 88
child, pid = 3247, i = 89
child, pid = 3247, i = 90
child, pid = 3247, i = 91
child, pid = 3247, i = 92
child, pid = 3247, i = 93
child, pid = 3247, i = 94
child, pid = 3247, i = 95
child, pid = 3247, i = 96
child, pid = 3247, i = 97
child, pid = 3247, i = 98
child, pid = 3247, i = 99

最佳答案

父进程首先启动。

这里的要点是您正在运行多个进程,它们“并行”运行。现在,在现实生活中它们可能会也可能不会并行运行。在只有一个核心的旧处理器中,并行执行意味着操作系统在可运行进程周围快速循环,并从每个进程中运行一点。这样的“位”称为时间片,一般为10ms左右。

如今,随着多核 CPU 的时代,您可能会看到事物真正并行运行。

所以你可以看到:

  • 首先只有父进程运行一次
  • 然后父级和子级都运行一个时间片
  • 最后只有 clild 运行。

进程之间的实际调度(使用一个或多个内核,何时在进程之间切换)取决于您所使用的操作系统。

关于c - 父子进程计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35989944/

相关文章:

linux - 一个多线程进程的线程ID可以和另一个正在运行的进程的进程ID相同吗?

c - 指定的版本错误

c - 在模块/驱动程序中打开内核驱动程序

java - 从 Java 程序执行批处理文件时出错

c++ - 窗口系统调用

parallel-processing - 大量线程消耗对 ARM(4 核 A72)与 x86(2 核 i5)的影响

architecture - cpu如何知道硬件中断?

.net - 在 .NET 中转换 long double

python - C 中的 "Unpacking"

android - Android 中不同进程上运行的服务之间的通信?