由fork()带来的疑惑促成了我的linux内核之旅
fork()可以创建新进程,新进程是父进程的一个拷贝,这是大家都知道的.
fork()有一些有趣的特点:
1、调用一次,返回两次
父进程调用fork()之后,由fork系统调用进入内核,内核根据父进程复制出一个子进程.此时有两个一模一样(真的一模一样吗?)的进程等待着从内核返回。是父进程先返回还是子进程先返回,还是这两个进程都等待,取决于内核的调度(内核调度的依据是什么?)。但只要父进程或子进程被调度执行了,从内核返回后就从fork函数返回,也就是说子进程会在这返回,fork之前的代码都不执行(内核怎样做到的?).所以,在父进程中调用一次,在父进程和子进程中各返回一次也就是返回两次,如下图所示:
图片来自《linux c编程一站式学习》
2、父进程返回值是子进程的pid,而子进程返回值是0,一模一样的两者返回值却不一样(内核怎样做到的?)。这保证了正确区别父子进程自己的控制流程。
3、 历史上的linux 在fork()时完整的复制了父进程的进程空间及相应物理页面(什么是页面?),这带来的消耗是可观的,更糟的是,往往程序猿fork()之后紧接着就exec()执行新的程序,刚才复制的东西全白复制了。现在的linux采用了“写时复制”的技术,fork()仅仅复制一些描述进程空间的数据结构 及 父进程页表(页表是什么?),从而共享物理页面。当某个进程写某页面时,再单独复制一份该页面给它。
带着诸多疑问,我开始了我的linux内核之旅,我的疑惑将在那里得到解答。我旅途的第一站是:分页机制
发表评论
要发表评论,您必须先登录。