在32位平台下,进程的地址空间及fork()与vfork()

  1. 进程的地址空间

从下到上依次为正文代码,初始化数据,未初始化数据,堆,共享区,栈,命令行参数环境变量,内核空间1G。
由此可以看出,我们在写程序时,数据它有它特定的位置。

  1. fork()函数做了些什么?
    复制父进程的正文段,数据段,堆,栈这四个部分,并为3个部分分配物理块,除正文段和父进程共享外,其余三个部分都会被分配物理空间。复制之后其内容是相同的。内核除了做这些,内核还会以父进程为模板为子进程创建pcb,用于管理进程。还有页表,之后,会把子进程添加到系统进程列表当中。最后fork返回,开始调度器的调度。
  2. Linux下的写时复制技术
    父进程创建子进程时,会创建pcb,页表,但其余的,会和父进程共享,只是在需要改变子进程段的内容时,才会拷贝一份副本,不需要拷贝时,则和父进程共享同一块虚拟地址空间。 .

  3. vfork()函数
    该函数和fork()函数一样都是创建子进程,只不过该函数比fork函数做的少得多了,该函数采用的是共享。不为子进程创建虚拟地址空间,其和父进程共享虚拟地址空间即也就共享了进程的物理空间。但它会创建pcb,(pcb是控制进程执行的)。之后该函数会返回,并把子进程添加到系统进程列表中,且其会保证子进程先运行。
    在Linux下,我们的线程也是通过vfork这个函数来实现的。
    在这里我还想说一下,计算机真的太快了,快到我们以为他是并发处理任务的,但实际他是一件一件处理的。

猜你喜欢

转载自blog.csdn.net/weixin_40797414/article/details/81474329