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() ) 的调用者则通过管道将请求信息传给管理线程。
当使用 fork 系统调用产生多进程时,内核调用 do_fork() 不使用任何共享属性,进程拥有独立的运行环境。
当使用 pthread_create() 来创建线程时 , 则最终设置了所有这些属性来调用 __clone() ,而这些参数又全部传给核内的 do_fork() ,从而创建的 " 进程 " 拥有共享的运行环境,只有栈是独立的,由 __clone() 传入。
即: Linux 下不管是多线程编程还是多进程编程,最终都是用 do_fork 实现的多进程编程,只是进程创建时的参数不同,从而导致有不同的共享环境。
Linux 线程在核内是以轻量级进程的形式存在的,拥有独立的进程表项,而所有的创建、同步、删除等操作都在核外 pthread 库中进行。 pthread 库使用一个管理线程( __pthread_manager() ,每个进程独立且唯一)来管理线程的创建和终止,为线程分配线程 ID ,发送线程相关的信号,而主线程 pthread_create() ) 的调用者则通过管道将请求信息传给管理线程。