3.进程创建

betball贝博app 进程 262 次浏览 没有评论

其他的操作系统:提供了产生(spawn)进程机制,首先在新的地址空间创建进程,读入可执行文件,然后开始执行

Unix中采用了与众不同的实现方式,分解到两个函数中执行:fork()和exec()

  • fork()

  • 拷贝当前进程创建一个子进程(区别仅仅在于PID,PPID和某些资源和统计量(挂起的信号等))

  • exec()

  • 读取可执行文件,将其载入地址空间开始执行

  • 写时拷贝

  • 传统的fork()

  • 直接把所有的资源复制给新创建的进程,过于简单且效率低下,因为拷贝的数据也许并不共享。

  • 如果新进程打算立即执行一个新的映像,那么所有的拷贝将前功尽弃。

  • 写时拷贝页(copy_on_write)

  • 可以推迟甚至免除拷贝数据

  • 贝博betball网页并不赋值整个进程地址空间,而是让父子进程共享同一个拷贝

  • 只有需要写入的时候,数据才会被赋值,各个进程又有各自的拷贝。在此之前,以只读的方式共享。

  • fork()的实际开销就是复制父进程的页表并给子进程创建唯一的进程描述符。

  • fork()

  • Linux通过clone()实现fork() 通过调用一系列参数标志来指明父子进程需要共享的资源,fork(),vfork(),_clone()库函数偶读根据各自需要的参数标志去调用clone(),然后由clone()去调用do_fork()

  • vfork()

  • vfork()基本与fork()相同,但不会拷贝父进程的页表项。

    子进程将作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞直到子进程退出或执行exec()

    子进程不能向地址空间写入。

    在3BSD时期,没有用写时拷贝来实现fork()该优化比较有意义。现在的好处在于不拷贝父进程的页表项。

    如果将来Linux的fork()有了写时拷贝页表项,那么vfork()将彻底没用了。

    一般情况下最好不要调用vfork()

    发表评论

    邮箱地址不会被公开。

    Go