我试图理解叉子在叉子上是如何工作的,但我在某处误解了某些东西。
去年我的教授给了我一个测试,但是我无法回复它:我们有3个任务(进程或线程),使用以下伪代码:
Th1 { display "Hello 1" } Th2 { display "Hello 2" } Th3 { display "Hello 3" } main() { Fork(Th1);Fork(Th2);Fork(Th3); }
问题是: Which is the order of the execution of these tasks? Why?
Which is the order of the execution of these tasks? Why?
我怎么回复这个? 是否有任何指南或任何有用的资源我可以理解叉子,信号量和内存分配?
我是低级编程的真正新手。
您询问的详细信息是故意未指定的 。 您应该想象它发生的方式是,在每次“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
的规范中有这句话:
在fork()之后,父进程和子进程都应该能够在任何一个终止之前独立执行。
但你必须知道如何阅读标准知道这意味着我所说的一切。 我能想到的其他一切都是教科书长度,例如W. Richard Stevens 在Unix环境中的高级编程,如果您的图书馆有副本,您可能希望看到它。
Fork不是C的一部分。在一些直接支持fork概念的操作系统(特别是太监变体)中,它是一个系统服务。 在其他操作系统中,fork是一个模仿“fork概念”的库调用。
问题是:执行这些任务的顺序是什么? 为什么?
这是未定义的。 创建顺序为1,2,3,但无法预测它们执行的顺序,尤其是在多处理器系统中。
在forking模型中,每个fork创建父进程的副本。 然后,孩子通常会加载新的可执行文件并运行它。 在您的简单伪代码中,您可以执行您想要的操作而无需运行新的可执行文件,但除了打印消息之外的任何重要事项都可能要求每个子进程都有一个单独的可执行文件运行。
由于程序的执行不是直线发生,因此您的订购问题受到了破坏。 即使在单处理器系统中,1,2,3也不可能在没有中断的情况下从头到尾运行,每次执行“显示”时,您的进程可能会使CPU进入另一个进程。 您的进程也可能有页面错误,也会产生错误。 如果你确实加载了另一个可执行文件,那将增加可变性。
在多处理器系统中,序列问题甚至更大。 假设您有四个处理器,并且每个子进程都分配给一个单独进程的工作队列。 执行顺序取决于每个处理器工作队列前面发生的事情。
如果你在一个模仿太监叉模型的系统上这样做,那么可变性会更大,因为进程复制语义会有所不同。
以上就是c/c++开发分享叉子(); C中的方法:确定顺序相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522020.html