在用户空间实现的线程

  在现代操作系统当中,线程发生了一些微妙的变化。现在的进程更象是一个资源的组织者,而线程才是任务的执行者。

  在传统内核当中,由于没有设计线程,所以任务的执行和资源都是进程享有。也可以说是传统的内核的设计是每一个进程里面只有一个线程。线程的并发原理与进程是一样的,不 过不存在上下文切换和页面置换(线程共享地址空间)等等,所以线程并发的开销比较小。

  线程的实现有两种方式,一种是把线程放在内核内实现,由内核来管理线程(比如说管理线程表),另外一种是把线程放在用户空间,通过库函数来实现线程。当线程放在内核空间实现的时候,由于每一个线程都会有独立的栈空间,而线程数量往往是庞大的,当数量达到一定程度时,内核空间资源就会很紧张。而把线 程放在用户空间的实现,第一是避免了内核修改,第二是允许自己设计线程调度算法。但是一方面,如果把线程放在用户空间实现,当一个线程阻塞的时候,整个线程都会阻塞。因为在用户空间实现的线程对内核来说是不可见的,内核无法插手线程的调度,线程的调度是在进程空间进行的。在单处理器上,宏观的并发在微观上是串行的,虽然对于线程来说它们都享有一个CPU抽象,但是在某一时刻来说,如果线程阻塞,则不能让出实际的CPU(不能进行CPU切换,类似中断现场恢复),导致整个线程停止运行(阻塞)。这时侯内核可见的是进程,对于内核来说此时相当于内核阻塞,于是内核启动调度,换出进程,如此一来,在用户空间实现的线程,其中一个线程阻塞就会导致进程的阻塞。

  应对方法:1 以非阻塞方式访问(某些情况下会牺牲性能) 2 使用轮询机制(调用select/poll)。

你可能感兴趣的:(linux,线程,操作系统,栈,linux内核)