我已经解决了这里关于Pthreads
Linux 主题的所有问题,但有一个基本的疑问对我来说仍未解决:
在各种回复中都提到,当我们在 Linux 上创建 POSIX 线程时,用户线程和内核线程之间存在 1:1 的映射关系。
我的疑问是当我们pthread_create()
在Linux中使用时,是否有1个用户线程和一个相应的唯一内核线程隐式创建(即总共2个线程,其中一个对用户不可见)?
或者
只创建了一个内核线程,并且在较新的 Linux 内核中不再有任何称为用户线程的内容?
我已经解决了这里关于Pthreads
Linux 主题的所有问题,但有一个基本的疑问对我来说仍未解决:
在各种回复中都提到,当我们在 Linux 上创建 POSIX 线程时,用户线程和内核线程之间存在 1:1 的映射关系。
我的疑问是当我们pthread_create()
在Linux中使用时,是否有1个用户线程和一个相应的唯一内核线程隐式创建(即总共2个线程,其中一个对用户不可见)?
或者
只创建了一个内核线程,并且在较新的 Linux 内核中不再有任何称为用户线程的内容?
NPTL(本机 POSIX 线程库)和较旧的 LinuxThreads 都使用 1:1 模型,其中用户创建的每个线程(或进程)对应于内核中的一个可调度实体。
但是,您可能对用户级线程或光纤感到困惑,它们是通过调用创建的执行线程makecontext()
,swapcontext()
具有 N:1 模型,内核不知道用户级线程,它们的调度是在用户中完成的空间。
pthread_create() internally calls fork(), and vfork()/fork() internally calls clone(). So in most of the case it is 1:1 mapping.