当前位置: 首页 > Linux

Linux进程-线程相关概念梳理

时间:2023-04-06 22:58:21 Linux

Linux的线程模型自Linux诞生以来就有了三种LinuxThreads。最早的模型仅部分实现了POSIX线程标准NGPT、NextGenerationPOSIXThreads、terminatedNPTL和NativePOSIXThreadLibrary。2.6内核以来使用的模型在NPTL中,Linux使用线程模型,对应用户线程和内核线程1:1的关系。这也是许多其他系统采用的模型,如win32、Solaris、NetBSD、FreeBSD、macOS、iOS等。1:1模型的实现相对N:1和M:N更简单。在调用pthread库创建线程时,pthread_create会调用clone系统调用,最终会创建一个LWP(轻量级进程)和一个内核线程。NPTL的1:1模型,即1个轻量级线程对应一个内核线程。此时LWP在内核态就有了对应的task_struct(进程描述符),它是一个独立的线程调度单元。Linux进程和线程对于系统来说是不区分进程和线程的,创建进程和创建线程都使用fork系统调用,区别在于传递参数。例如,子进程将拥有自己独立的地址空间,而线程将共享该空间。内核调度的单位是任务。可以认为A线程本质上是一系列共享资源的进程。LWP/userthread/kernelthreadLWP,Light-weightprocess,是轻量级线程,本质上是内核支持的用户线程。内核线程,只访问内核空间,共享同一个内核页表,所有内核线程的内核空间是相同的,而用户线程有自己的地址空间(区别于不在同一个进程的其他线程的空间)。Userthreads,标准意义上的用户线程应该是完全建立在用户空间的线程。用户线程的创建、同步、销毁、调度完全在用户空间完成,不需要内核的协助。这个定义和LWP之间有一定的重叠。上下文切换抢占的LWP需要在用户态保存当前寄存器,然后切换到内核态,保存内核线程对应的寄存器,恢复调度时分别恢复两个站点,这涉及到at至少两次堆栈切换和一定程度的缓存失效。Greenthreads绿色线程,由运行时库或虚拟机调度的“线程”,完全在用户空间管理。在Jdk1.2之前,Solaris等平台上实现的线程模型,属于绿色线型。早期的Linux线程模型也属于绿色线程。另外,该类型常见的实现主要是协程,如Java中的Quasar、Python中的Greenlet等。Coroutine协程是解决非抢占式多任务的广义子程序,本质上是一种程序控制机制。协程可以有多个入口点,可以在指定位置暂停和恢复执行。协程分为非对称协程两种,协程之间存在调用链关系。有两种方法可以转移程序控制(resume/yield)。非对称协程可以看作是从属于其调用者的对称协程。转移程序控制的方法只有一种(coroutine.transfer)纤程“纤程”,基本上可以看做是一个带有调度器的栈式协程的实现Java创建的线程是什么?在Java1.2之前,有些是绿色线程。1.2以后,以linux平台为例,线程的创建最终调用到pthread_create,也就是内核级的线程,这里详见Light-weightprocessThread(computing)