2014-11-24 52 views
0

我正在编写一个程序,该程序模拟一个指派的基于unix的操作系统,我有一些问题。关于UNIX中的fork()函数的问题

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

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

回答

0

这是针对FreeBSD的,尽管Linux并没有太大的不同。

created状态标志着一个新的进程仍在构建中。系统调用的第一件事情是在进程表中分配一个插槽,增加最大进程计数器,并分配一个新的进程ID。然后系统的其余部分将知道这一点,而系统调用会完成其他必要的任务来完成进程创建(从父级复制文件描述符,初始化调度程序结构,将进程附加到其父级等)。在这个更长的工作完成之后,该过程转移到ready状态。

我相信FreeBSD和Linux都没有正式的长期或准入调度程序。一旦准备就绪,Linux试图将孩​​子放在父母的前面,FreeBSD只允许正常的日程安排。

do_fork()http://svn.freebsd.org/base/release/10.1.0/sys/kern/kern_fork.c ,并检查了http://www.makelinux.net/books/lkd2/ch03lev1sec2