当前位置:网站首页 > 技术博客 > 正文

fork()&&fork()



虽然篇幅很长,但大多是易懂的代码,不用担心看不完

进程内存镜像

这里的所有操作,都将在下面的代码中有所体现

fork会拷贝当前进程的内存,并创建一个新的进程。如上图,fork函数会将整个进程的内存镜像拷贝到新的内存地址,包括代码段、数据段、堆栈以及寄存器内容。之后,我们就有了两个拥有完全一样内存的进程。fork系统调用在两个进程中都会返回,在父进程中,fork系统调用会返回子进程的pid。而在新创建的进程中,fork系统调用会返回0。所以即使两个进程的内存是完全一样的,我们还是可以通过fork的返回值区分旧进程和新进程。

某种程度上来说这里的拷贝操作浪费了,因为所有拷贝的内存都被丢弃并被exec替换。在大型程序中这里的影响会比较明显。实际上操作系统会对其进行优化。(比如使用COW(copy on write)技术)

fork创建的新进程从fork语句后开始执行,因为新进程也继承了父进程的PC程序计数器。

在xv6中唯一不是通过fork创建进程的场景就是创建第一个进程的时候,之后的所有进程都是通过fork创建的。

以下内容以xv6(教学用Linux操作系统)源代码为例

代码解析
 
附:

alloproc代码

 

Trapframe代码:


                            

版权声明


相关文章:

  • xml注释的写法2024-12-26 11:30:04
  • 武侠之乱世魔枭2024-12-26 11:30:04
  • linux中的nice用法2024-12-26 11:30:04
  • 一句话木马作用2024-12-26 11:30:04
  • java如何给string数组赋值2024-12-26 11:30:04
  • 位图索引和普通索引2024-12-26 11:30:04
  • oracle中的内连接2024-12-26 11:30:04
  • scanf函数的功能是什么2024-12-26 11:30:04
  • c++结构体和c结构体2024-12-26 11:30:04
  • 召回率精确率 准确率2024-12-26 11:30:04