用户级线程和内核支持线程
用户级线程:仅存在于用户空间中,与内核无关。内核管理用户级线程对应的整个进程,它感觉不到用户级线程的存在。每个线程的控制块都设置在用户空间中,所以无须内核的支持就可以实现多线程,而且线程的切换不需要陷入(trap)到内核,所以切换线程的开销小,速度快。缺点是进程的一个线程被阻塞后整个进程中所有的线程都被阻塞,并且无法享有多处理机带来的好处。
内核支持线程:内核支持线程是由内核负责管理的,线程控制块也在内核中。所以线程的创建、切换。撤销等操作都是通过系统调用在内核中完成的。内核支持线程的好处是进程中的一个线程被阻塞后该进程中的其他线程还可以继续执行不会被阻塞掉,而且多处理机的计算机中可以把一个进程的多个线程分别调度不同的处理机中,以提高执行的效率。主要缺点是即使是同一个进程内的不同线程之间的切换也要陷入(trap)到内核,所以速度和效率比不上用户级线程。
多线程模型
1)多对一模型
多对一模型将多个用户级线程映射到一个内核线程。
优点:线程管理是在用户空间进行的,因为效率比较高。
缺点:当一个线程被阻塞,整个进程都会被阻塞;多个线程不能并行地运行在多处理机上。
2)一对一模型
一对一模型将每个用户级线程映射到一个内核线程。
优点:当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强。
缺点:每创建一个用户线程需要创建一个内核线程与其对应,这样创建线程的开销比较大,会影响应用程序的性能。
3)多对多模型
多对多模型将n个用户级线程映射到m个内核线程上,其中要求m<=n
特点:在多对一模型和一对一模型中取了个折中,克服了多对一模型的并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核线程。开销太大的缺点。又拥有多对一模型和一对一模型各自的优点,可谓集两者之所长。
互斥量和信号量的区别
1. 互斥量用于线程的互斥,信号量用于线程的同步。
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
以上区别是主要想记住的。
note:信号量可以用来实现互斥量的功能
2. 互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。
3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
Ref:http://www.cnblogs.com/lbsx/archive/2009/08/03/1537698.html