这个问题是我在一个群里看到别人提的问题,然后产生的疑问?故此在这里整理一些关于线程模型的知识
请教一下,用户线程如果阻塞了,同进程的其他线程会阻塞么? 向勇老师的课件是写会的,但课程网站有道习题答案是说不会,是答案错了是么?
然后课程的老师回答是,答案错误,但我想到了在网络编程中经常会有的一个模型,那就是主线程调用epoll阻塞监听事件,工作线程负责处理业务逻辑,这样子,各种线程之间并不干扰啊,所以就产生了疑问,并在群里提问
老师,工作线程阻塞,其他线程也阻塞吗?那比如说用epoll的时候,主线程阻塞住,其他线程不是也可以工作吗
得到了回答:
用户级线程一个线程就作为该进程的代表,这导致会阻塞,也导致了平均每个线程分配的时间片很少,并且不能被同进程的线程抢占。按照这一整套逻辑来说应该是会阻塞的。 Epoll作为内核的调整应该的创建内核线程吧? 内核线程是以线程为单位调度的不会阻塞。
然后就特别不理解,后来查找之后才明白,是Linux的线程模型让我产生了误解,Linux的线程模型是一对一的。
而多线程模型有几常用的有这两种:
多对一模型(图 1)映射多个用户级线程到一个内核线程。
线程管理是由用户空间的线程库来完成的,因此效率更高。不过,如果一个线程执行阻塞系统调用,那么整个进程将会阻塞。再者,因为任一时间只有一个线程可以访问内核,所以多个线程不能并行运行在多处理核系统上。
Green threads 线程库为 Solaris 所采用,也为早期版本的 Java 所采纳,它就使用了多对一模型。然而,现在几乎没有系统继续使用这个模型,因为它无法利用多个处理核。