在Linux中新进程和新线程创建期间共享什么资源以及创建了什么?

时间:2016-03-13 06:53:54

标签: linux multithreading process

在Linux中创建(1>新进程)和(2>新线程)期间是什么(共享1个资源)和什么(2个>资源是新创建的)? 我搜索了它,但没有提到新创建的资源和共享的资源

1 个答案:

答案 0 :(得分:2)

当你调用fork()并创建一个子元素时,在父和子之间调用fork之前所有描述符都在父元素中打开 shared 。例如父级中的套接字,并说父级调用accept,然后调用fork。然后在父级和子级之间共享连接的套接字。通常,孩子然后读取和写入连接的套接字,父母关闭连接的套接字。

在传统的UNIX模型中,当父进程需要由另一个实体执行的某些操作时,它会分叉子进程并让子进程执行处理。虽然这种模式多年来一直运作良好,但也存在一些问题:

  1. fork 昂贵。内存从父级复制到子级,所有描述符都在子级中复制,依此类推。最近几天使用 copy-on-write 进行了一些优化,这避免了复制,直到孩子需要自己的副本。

  2. 虽然从父母到孩子的信息传递很容易,但反过来需要一些工作。并且为了实现传递信息,需要IPC(进程间通信)。

  3. 所以LINUX引入了clone()。 clone()允许子进程与调用进程共享其执行上下文的一部分,例如内存空间,文件描述符表和信号处理程序表。

    然后是线程。它们也称为轻量级进程。您可以猜测,创建线程的速度比进程创建速度快10-100倍。进程中的所有线程共享相同的全局内存。这使得线程之间的信息共享变得容易,但同时需要同步访问。

    总之,所有线程共享以下内容:

    • 流程信息
    • 大多数数据
    • 打开文件(例如描述符)
    • 信号处理程序
    • 当前工作目录
    • 用户和群组ID

    但每个帖子都有自己的:

    • 线程ID
    • 寄存器集
    • 用于局部变量和返回地址的堆栈
    • 错误号
    • 信号掩码
    • 优先