r****o 发帖数: 1950 | 1 【 以下文字转载自 Linux 讨论区 】
发信人: roufoo (五经勤向窗前读), 信区: Linux
标 题: 问道OS的面试题。
发信站: BBS 未名空间站 (Thu Apr 22 22:03:27 2010, 美东)
fork一个进程的时候,内核里面发生了什么?
我前天被问到这道题目,我只知道子进程会拷贝父进程的内核空间,结果答的很烂。请
问这里的大牛,这道题应该怎么回答比较好?
多谢! |
k***e 发帖数: 556 | 2 detailed answer can be found in understanding linux kernel |
r****o 发帖数: 1950 | 3 大侠你怎么什么都精通啊,呵呵。
【在 k***e 的大作中提到】 : detailed answer can be found in understanding linux kernel
|
k***e 发帖数: 556 | 4 不算精通
这些都是死记硬背
你必须知道fork后那些和parent share 哪些是child特有的
真的牛人可以从汇编跳转 设置ldt gdt什么的这些开始讲起 里面的东西海了去了
没做过项目很容易被人问露馅
问到os方面的问题 不熟悉就承认 不然随随便便就被人问趴下
【在 r****o 的大作中提到】 : 大侠你怎么什么都精通啊,呵呵。
|
w*********l 发帖数: 1337 | 5 这个问题太笼统了,没什么信息量。内核里基本就是copy所有的进程相关的数据结构。
【在 r****o 的大作中提到】 : 【 以下文字转载自 Linux 讨论区 】 : 发信人: roufoo (五经勤向窗前读), 信区: Linux : 标 题: 问道OS的面试题。 : 发信站: BBS 未名空间站 (Thu Apr 22 22:03:27 2010, 美东) : fork一个进程的时候,内核里面发生了什么? : 我前天被问到这道题目,我只知道子进程会拷贝父进程的内核空间,结果答的很烂。请 : 问这里的大牛,这道题应该怎么回答比较好? : 多谢!
|
w*********l 发帖数: 1337 | 6 linux不用段,所以段表都是不动的--只有一个表,但是这题没限定是linux,所以属于
比较扯的那种open题目。这里面比较有意思的是copy页表设置copy on write。如果是
我的话可能会问问cow可能的实现方法。另外一个稍微比较没意思的问点是,如果让你
做决定,parent和child哪个先从系统调用返回,为什么。
【在 k***e 的大作中提到】 : 不算精通 : 这些都是死记硬背 : 你必须知道fork后那些和parent share 哪些是child特有的 : 真的牛人可以从汇编跳转 设置ldt gdt什么的这些开始讲起 里面的东西海了去了 : 没做过项目很容易被人问露馅 : 问到os方面的问题 不熟悉就承认 不然随随便便就被人问趴下
|
w******1 发帖数: 520 | 7 google 出来的一个解释
NAME
fork - create a child process
SYNOPSIS
#include
#include
pid_t fork(void);
DESCRIPTION
fork creates a child process that differs from the parent process only in
its PID and PPID, and in the fact that resource utilizations are set to 0.
File locks and pending signals are not inherited.
Under Linux, fork is implemented using copy-on-write pages, so the only
penalty incurred by fork is the time and memory required to duplicate the
parent's page tables, a |
w******1 发帖数: 520 | 8 GOOGLE 出来的:
fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父
进程, 具有良好的并发性,但是二者之间的通讯需要通过专门的通讯机制,如:pipe
,popen&pclose、协同进程、fifo,System V IPC(消息队列、信号量和共享内存)机
制等, 另外通过fork创建子进程系统开销很大,需要将上面描述的每种资源都复制一
个副本。这样看来,fork是一个 开销十分大的系统调用,这些开销并不是所有的情况
下都是必须的,比如某进程fork出一个子进程后,其子进程仅仅是为了调用exec执行另
一个执行文件,那么在fork过程中对于虚存空间的复制将是一个多余的过程(由 于
Linux中是采取了copy-on-write技术,所以这一步骤的所做的工作只是虚存管理部分的
复制以及页表的创建 ,而并没有包括物理也面的拷贝);
vfork系统调用不同于fork,用vfork创建的子进程共享地址空间,也就是说子进程完全
运行在父进程的地址空间上,子进程对虚拟地址空间任何数据的修改同样为父进程所见
。但是用 vfork创建子进程后,父进程会被阻塞直到子进 |
s******s 发帖数: 3694 | 9 汇编跳转的, 你看现在有几个赚大钱的?
没用的,现在的产业分工没几个公司需要这些东西了。最多把 bootup 的几段搞清楚就
够了
【在 k***e 的大作中提到】 : 不算精通 : 这些都是死记硬背 : 你必须知道fork后那些和parent share 哪些是child特有的 : 真的牛人可以从汇编跳转 设置ldt gdt什么的这些开始讲起 里面的东西海了去了 : 没做过项目很容易被人问露馅 : 问到os方面的问题 不熟悉就承认 不然随随便便就被人问趴下
|
s******s 发帖数: 3694 | 10 赞勤奋, COW 确实是很重要, 关键是这种想法
pipe
【在 w******1 的大作中提到】 : GOOGLE 出来的: : fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父 : 进程, 具有良好的并发性,但是二者之间的通讯需要通过专门的通讯机制,如:pipe : ,popen&pclose、协同进程、fifo,System V IPC(消息队列、信号量和共享内存)机 : 制等, 另外通过fork创建子进程系统开销很大,需要将上面描述的每种资源都复制一 : 个副本。这样看来,fork是一个 开销十分大的系统调用,这些开销并不是所有的情况 : 下都是必须的,比如某进程fork出一个子进程后,其子进程仅仅是为了调用exec执行另 : 一个执行文件,那么在fork过程中对于虚存空间的复制将是一个多余的过程(由 于 : Linux中是采取了copy-on-write技术,所以这一步骤的所做的工作只是虚存管理部分的 : 复制以及页表的创建 ,而并没有包括物理也面的拷贝);
|
l*******y 发帖数: 1498 | 11 没必要看understanding linux kernel,很多地方都讲的太详细。
linux kernel development就很好,没那么多细节,但是重要的东西都有了。
【在 k***e 的大作中提到】 : detailed answer can be found in understanding linux kernel
|
r****o 发帖数: 1950 | 12 多谢。是不是child先从系统调用返回比较好。因为child可能会共用parent的内存空间
(如果没有write操作的话)。
【在 w*********l 的大作中提到】 : linux不用段,所以段表都是不动的--只有一个表,但是这题没限定是linux,所以属于 : 比较扯的那种open题目。这里面比较有意思的是copy页表设置copy on write。如果是 : 我的话可能会问问cow可能的实现方法。另外一个稍微比较没意思的问点是,如果让你 : 做决定,parent和child哪个先从系统调用返回,为什么。
|
w*********l 发帖数: 1337 | 13 个人认为啊,看lkd还不如看操作系统教科书。ulk还好,真做东西的话其实这本书讲的
还是不够细。
【在 l*******y 的大作中提到】 : 没必要看understanding linux kernel,很多地方都讲的太详细。 : linux kernel development就很好,没那么多细节,但是重要的东西都有了。
|
l*******y 发帖数: 1498 | 14 真做东西当然是不够的,不过对于找工作对付面试我觉得已经够了
lkd和专门的操作系统书还是不一样的吧,我觉得linux那个O(1) 的 process
scheduling algorithm 操作系统书里应该没有把(我也不确定),因为这个具体的实
现不同的OS算法不一样的吧。
【在 w*********l 的大作中提到】 : 个人认为啊,看lkd还不如看操作系统教科书。ulk还好,真做东西的话其实这本书讲的 : 还是不够细。
|