pthread线程库简介
1.线程实现 线程是在进程的基础上进一步的抽象,也就是说一个进程分为两个部分:线程集合和资源集合.线程是进程中的一个动态对象,它应该是一组独立的指令流,进程中的所有线程将共享进程里的资源.但是线程应该有自己的私有对象:比如程序计数器、堆栈和寄存器上下文. 线程分为三种类型: (1).内核线程: 它的创建和撤消是由内核的内部需求来决定的,用来负责执行一个指定的函数,一个内核线程不需要和一个用户进程联系起来.它共享内核的正文段核全局数据,具有自己的内核堆栈.它能够单独的被调度并且使用标准的内核同步机制,可以被单独的分配到一个处理器上运行.内核线程的调度不需要经过态的转换并进行地址空间的重新映射,因此在内核线程间做上下文切换比在进程间做上下文切换快得多. (2).轻量级进程: 轻量级进程是内核支持的用户线程,它在一个单独的进程中提供多线程控制.这些轻量级进程被单独的调度,可以在多个处理器上运行,每一个轻量级进程都被绑定在一个内核线程上,在它的生命周期这种绑定都是有效的.轻量级进程被独立调度并且共享地址空间和进程中的其它资源,但是每个LWP都应该有自己的程序计数器、寄存器集合、核心栈和用户栈. (3).用户线程: 用户线程是通过线程库实现的.它们可以在没有内核参与下创建、释放和管理.线程库提供了同步和调度的方法.这样进程可以使用大量的线程而不消耗内核资源,省去大量的系统开销.用户线程的实现是可能的,用户线程的上下文可以在没有内核干预的情况下保存和恢复.每个用户线程都可以有自己的用户堆栈,一块用来保存用户级寄存器上下文以及如信号屏蔽等状态信息的内存区.库通过保存当前线程的堆栈和寄存器内容载入新调度线程的那些内容来实现用户线程之间的调度和上下文切换. 内核仍然负责进程的切换,只有内核具有修改内存管理寄存器的权力.用户线程不是真正的调度实体,内核对它们一无所知,而只是调度用户线程下的进程或者轻量级进程,这些进程再通过线程库函数来调度它们的线程.当一个进程被抢占时,它的所有用户线程都被抢占,当一个用户线程被阻塞时,它会阻塞下面的轻量级进程,如果进程只有一个轻量级进程,则它的所有用户线程都会被阻塞. Linux线程是通过进程来实现.Linux kernel为进程创建提供一个clone()系统调用,clone的参数包括如 CLONE_VM, CLONE_FILES, CLONE_SIGHAND 等.通过clone()的参数,新创建的进程,也称为LWP(Lightweight process)与父进程共享内存空间,文件句柄,信号处理等,从而达到创建线程相同的目的. 在Linux 2.6之前,Linux kernel并没有真正的thread支持,一些thread library都是在clone()基础上的一些基于user space的封装,因此通常在信号处理、进程调度(每个进程需要一个额外的调度线程)及多线程之间同步共享资源等方面存在一定问题.Linux 2.6的线程库叫NPTL(Native POSIX Thread Library).POSIX thread(pthread)是一个编程规范,通过此规范开发的多线程程序具有良好的跨平台特性.尽管是基于进程的实现,但新版的NPTL创建线程的效率非常高.一些测试显示,基于NPTL的内核创建10万个线程只需要2秒,而没有NPTL支持的内核则需要长达15分钟. 在Linux中,每一个线程都有一个task_struct.线程和进程可以使用同一调度其调度.内核角度上来将LWP和Process没有区别,有的仅仅是资源的共享.如果独享资源则是HWP,共享资源则是LWP.而在真正内核实现的
NPTL的实现是在kernel增加了futex(fast userspace mutex)支持用于处理线程之间的sleep与wake.futex是一种高效的对共享资源互斥访问的算法.kernel在里面起仲裁作用,但通常都由进程自行完成.NPTL是一个1×1的线程模型,即一个线程对于一个操作系统的调度进程,优点是非常简单.而 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |