有关UNIX中fork()函数的问题

时间:2014-11-24 20:48:27

标签: unix process operating-system fork

我正在编写一个模拟基于unix的操作系统的程序,我有一些问题。

1)我读到UNIX中新创建的尚未准备好执行的进程处于“已创建”状态,等待分配给处理器的进程处于“就绪”状态。 什么样的事情发生,所以“创造”的过程可以变得“准备好”? 它是否在fork()函数中创建时将其状态从“created”更改为“ready”?

2)当fork()函数完成创建进程时,它会放入进程 在作业队列中,然后长期调度程序选择将哪个进程放入就绪队列。它是否正确?因为在其他地方我读到它将进程直接放入就绪队列中,我很困惑。 长期调度程序如何工作?它使用哪个标准?

1 个答案:

答案 0 :(得分:0)

这适用于FreeBSD,虽然Linux并不是非常不同。

created状态表示仍在构建新进程。 fork系统调用首先要做的是在流程表中分配一个槽,增加最大流程计数器,并分配一个新的流程ID。然后系统的其余部分将知道这一点,而fork系统调用执行其他必要任务以完成进程创建(从父进程复制文件描述符,初始化调度程序结构,将进程附加到其父进程等)。完成此较长时间的工作后,流程将移至ready状态。

我相信FreeBSD和Linux都没有正式的长期或入场调度程序。一旦准备好,Linux会尝试将子项放在父项的优先级之前,FreeBSD只允许进行正常的调度。

请参阅http://svn.freebsd.org/base/release/10.1.0/sys/kern/kern_fork.c中的do_fork() 并查看http://www.makelinux.net/books/lkd2/ch03lev1sec2