Linux内核对多进程和多线程的支持方式

Linux 的线程实现是在核外进行的,核内提供的是创建进程的接口 do_fork() 。内核提供了两个系统调用 __clone() fork() ,最终都用不同的参数调用 do_fork() 核内 API do_fork() 提供了很多参数,包括 CLONE_VM (共享内存空间)、 CLONE_FS (共享文件系统信息)、 CLONE_FILES (共享文件描述符表)、 CLONE_SIGHAND (共享信号句柄表)和 CLONE_PID (共享进程 ID ,仅对核内进程,即 0 号进程有效)。
当使用 fork 系统调用产生多进程时,内核调用 do_fork() 不使用任何共享属性,进程拥有独立的运行环境。
当使用 pthread_create() 来创建线程时 , 则最终设置了所有这些属性来调用 __clone() ,而这些参数又全部传给核内的 do_fork() ,从而创建的 " 进程 " 拥有共享的运行环境,只有栈是独立的,由 __clone() 传入。
即: Linux 下不管是多线程编程还是多进程编程,最终都是用 do_fork 实现的多进程编程,只是进程创建时的参数不同,从而导致有不同的共享环境。
Linux
线程在核内是以轻量级进程的形式存在的,拥有独立的进程表项,而所有的创建、同步、删除等操作都在核外 pthread 库中进行。 pthread 库使用一个管理线程( __pthread_manager() ,每个进程独立且唯一)来管理线程的创建和终止,为线程分配线程 ID ,发送线程相关的信号,而主线程 pthread_create() 的调用者则通过管道将请求信息传给管理线程。

你可能感兴趣的:(linux)