Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fork();C中的方法:确定顺序_C_Memory_Fork - Fatal编程技术网

Fork();C中的方法:确定顺序

Fork();C中的方法:确定顺序,c,memory,fork,C,Memory,Fork,我试图理解forks在C语言中是如何工作的,但我在某个地方误解了一些东西 去年我遇到了一个教授给我的测试,但我无法回答: 我们有3个任务(进程或线程),带有以下伪代码: Th1 { display "Hello 1" } Th2 { display "Hello 2" } Th3 { display "Hello 3" } main() { Fork(Th1);Fork(Th2);Fork(Th3); } 问题是:这些任务的执行顺序是什么?为什么? 我如何回答这个问题?是否有任何指南

我试图理解forks在C语言中是如何工作的,但我在某个地方误解了一些东西

去年我遇到了一个教授给我的测试,但我无法回答: 我们有3个任务(进程或线程),带有以下伪代码:

Th1 { display "Hello 1" }
Th2 { display "Hello 2" }
Th3 { display "Hello 3" }

main() {
    Fork(Th1);Fork(Th2);Fork(Th3);
}
问题是:
这些任务的执行顺序是什么?为什么?

我如何回答这个问题?是否有任何指南或有用的资源可以让我了解如何使用分叉、信号量和内存分配


我是一个真正的低级编程新手。

您所询问的详细信息是故意未指明的。您应该想象它发生的方式是,在每次“fork”操作之后,父进程和子进程同时运行,并且它们所做的事情之间没有顺序,除非您显式地进行排序

您展示的伪代码程序可以按任意顺序打印“Hello 1”、“Hello 2”和“Hello 3”,并且每次运行时的顺序可能不同,这取决于系统中其他地方发生的意外情况

对比此伪代码程序:

main { display "Hello main"; fork(Th1); }
Th1 { display "Hello 1"; fork(Th2); }
Th2 { display "Hello 2"; fork(Th3); }
Th3 { display "Hello 3"; }
这一张保证按顺序打印“Hello main”、“Hello 1”、“Hello 2”、“Hello 3”。你明白为什么吗

不幸的是,我无法为您提供清晰、简洁、在线的参考资料。下面是一句话:

fork()之后,父进程和子进程都应该能够在任何一个进程终止之前独立执行


但你必须知道如何阅读标准语,才能知道这意味着我上面所说的一切。我能想到的所有其他东西都是教科书长度,例如W.Richard Stevens的书,你可能想看看你的图书馆是否有它的副本。

Fork不是C的一部分。在一些直接支持Fork概念的操作系统(特别是宦官变体)中,它是一种系统服务。在其他操作系统中,fork是模仿“fork概念”的库调用

问题是:这些任务的执行顺序是什么?为什么?

这是未定义的。创建顺序为1、2、3,但它们执行的顺序无法预测,尤其是在多处理器系统中

在分叉模型中,每个分叉创建父进程的副本。然后,子级通常会加载一个新的可执行文件并运行它。在您的简单伪代码中,您可以在不运行新的可执行文件的情况下做您想做的事情,但任何比打印消息更重要的事情都可能需要每个子进程都有一个单独的可执行文件来运行

程序的执行不是直线进行的,这一事实削弱了您的排序问题。即使在单处理器系统中,1、2、3也不可能从头到尾不间断地运行,每次“显示”您的进程时,都可能将CPU让给另一个进程。您的进程也可能有页面错误,这也会产生错误。如果您确实加载了另一个可执行文件,这将增加可变性

序列问题在多处理器系统中更为严重。假设您有四个处理器,每个子进程被分配到一个单独进程的工作队列。执行顺序取决于每个处理器工作队列前端发生的情况


如果你在一个模仿英国宦官的fork模型的系统上这样做,那么会有更大的可变性,因为过程复制语义会有所不同。

顺序是随机的。所以,如果你需要强制执行一个特定的命令,你需要实现一个锁定机制,比如使用一个信号量。我怎么知道?为什么?fork只是产生了一个新的进程,由操作系统来安排资源,以及何时运行它。好的,得到了,非常感谢。是的,我想我明白了原因:这是因为main()首先调用fork(Th1)。Th1()正在打印“Hello 1”,然后调用fork(Th2),其中显示“Hello 2”,以此类推。根据低级详细信息,这三个任务的输出可能会完全混合,例如
hehehlellel320o1