Linux Concurrent Programming —— Thread
——by firo 2011.4.26
Reference
man 7 pthreads
Professional Linux Kernel Architecture【PLKA】
Understanding The Linux Kernel 3e 【ULK 3e】
Computer Systems: A Programmer‘s Perspective 2e【CS:APP 2e】
Advanced Programming in the Unix Environment Second Edition 【APUE 2e】
Unix Network Programming The Sockets Networking API VOLUME 1 Third Edition【UNPv1 3e】
The Linux Programming inTerface A Linux and UNIX System Programming Handbook 【TLPI】
Thread Implementation Models——线程实现模型
What is the Kernel Scheduling Entities (KSE)?
Kernel Scheduling Entities内核调度实体。
“A kernel scheduling entity (KSE) is a “virtual CPU” granted to the process for the purpose of executing threads. A thread that is currently executing is always associated with exactly one KSE, whether executing in user space or in the kernel.”(摘自Free BSD man手册)
KSE——虚拟的CPU,使得进程可以执行多个线程;正在执行的线程,无论它是在用户模式还是内核模式,它总是和一个确定的KSE相关联。
TLPI中关于KSE的描述:kernel分配CPU和其他系统资源给KSE。
Many-to-one (M:1) implementations (user-level threads)
关于线程的实现的所有操作(Many):线程创建,结束,Mutex同步,Condition variabled等等都由库(1)来实现。
优点:【1】因为不涉及System call,所有的操作也就非常的快啦~~【2】不需要内核支持,所以移植性非常高,除DOS那一辈的都行~
缺点:【1】你也不能总在用户模式执行吧,所以问题来了,当你执行一个System call时,好家伙,Context switch上下文切换到了kernel模式了,User-level的所有操作都Stop了,甭管你有多少个线程全停——谁叫你是User-level用户模式的,性能损耗不言自明。【2】kernel无法识别到这些用户级的Thread,所以kernel就不能切换他们了,分配他们倒不同的核上了(多核CPU),也无法调整线程的优先级,这些都由库来包办了,显然不是全局最优~~
One-to-one (1:1) implementations (kernel-level threads)
每一个Thread对应一个KSE,所有线程操作自然有内核提供了——System call。
优点:【1】不会出现User-level的一个系统调用阻塞掉所有的其他Thread。【2】实现了全局调度最优~
缺点:【1】因为都是System call 自然就慢下来,why?Context switch呀。【2】对于高性能的服务器来说,上百万的Thread同时对应着kernel需要维护上百万的KSE,这回带来性能损耗的。
Linux的线程实现就是这种~
Many-to-many (M:N) implementations (two-level model)
一个进程可以关联多个KSE,多个线程可以映射到一个KSE。
优点【1】见M:1和1:1模型【2】kernel交叉的分配线程给多核CPU。
缺点【1】见M:1和1:1模型【2】Complexity!调度和信息的传递同时涉及到Kernel-level和user-level Thread了~~
Linux Implementations of POSIX Threads——POSIX线程的Linux版实现
Next Generation POSIX Threads (NGPT)
基于M:N模型的linux线程库,由IBM开发。性能介于LinuxThreads和NPTL,03年终止开发了~~
Linux Threads
Linux的一代功臣,2.6之前的kernel使用的线程库,由Xavier Leroy开发的~~大致的实现过程是:通过clone系统调用,参数CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_SIGHAND 分别用来指明共享创建者的VM虚拟内存(用户空间)、文件描述符、文件系统相关属性(umask,root directory等)、信号处理程序表和阻塞信号表和挂起信号表。kernel创建一个Manager Thread管理所有线程创建与结束等。实现内部使用real-time 实时Singal用来传递操作信息。另外,Linux Threads 与标准差异参见TLPI-33.5.1,这也是它被NPTL取代的原因。
NPTL (Native POSIX Threads Library)