多核cpu运行程序如何交错?

How can the multi-core cpu run the program interleaved?

程序的输出显然不是代码中 printf() 的内容。相反,它看起来像是不规则顺序的字符。我知道原因是因为父进程和子进程是运行ning 同时,但在这个程序中我只看到 pid=fork(),我认为这意味着 pid 只是子进程的 ID。
那么为什么父进程可以打印呢?
两个进程如何运行在一起?

// fork.c: create a new process

#include "kernel/types.h"
#include "user/user.h"

int
main()
{
  int pid;

  pid = fork();

  printf("fork() returned %d\n", pid);

  if(pid == 0){
    printf("child\n");
  } else {
    printf("parent\n");
  }
  
  exit(0);
}

输出:

ffoorrkk(())  rreettuurrnende d 0
    
1c9h

ilpda

rent

我将我的回答重点放在显示观察到的输出如何从显示的程序中产生。我认为它已经为您解决了问题。

这是你的输出。
我对其进行了编辑以很好地猜测什么是 parent (p) 和 child (c):

ffoorrkk(())  rreettuurrnende d 0\n 
cpcpcpcpcpcpcpcpcpcpcpcpccpcpcppccc

1 c9h\n 
pccpcpp
  
ilpda\n  
ccpcpcc

rent
pppp

如果您只使用下面带有“c”的字符,您会得到

fork() returned 0
child

如果你只使用下面带有“p”的字符,你会得到

fork() returned 19
parent

这样拆分,它应该与您对 fork() 工作原理的了解相符。

评论已经提供了标题中三个“?”修饰的问题和您的问题 post 的 body 的实际答案。

伦丁:

It creates two processes and they are executed just as any other process, decided by the OS scheduler.

你自己:

each time fork() is called it will return twice, the parent process will return the id of child process, and child process will return 0

也许是为了在上面加一个更明显的观点:
parent 进程接收到 child ID 并在 fork().
之后继续执行程序 这就是为什么输出出现两次,类似地,交错,PID 值和所选 if 分支不同。

相关的还有,在给定的情况下没有行缓冲。否则就不会有 character-by-character 交错,所有内容都会更具可读性。