标签:
本文主要内容:
用户空间:User space,内核空间:Kernel Space。这两个是操作系统的重要概念之一,今天为了线程做一下简单的介绍:
示意图:
用户空间的线程由进程通过一些已有的Library进行创建,非系统调用(system call)内核对此毫无知晓。实现如下图所示。
在用户空间实现线程,线程运行在运行时系统中(run-time system)。内核对此一无所知,对于内核来说,它这是在处理一个单线程的进程而已。在用户空间实现线程时,每一个进程针对自己的线程维护了一个线程表(Thread Table),该表保存了线程运行的各种变量,比如寄存器,PC,状态等等,线程表用进程的运行时系统来维护,当一个线程被block,她的当前运行状态会被保存在线程表中,当再次启动时,也会读取线程表中已经保存的状态,从该状态进行再次运行。
内核空间的线程全部有操作系统内核创建,实现如下图所示。
内核线程同样有线程表(Thread table),不过这个线程表是保存在内核中,其功能和用户空间线程表的功能一样,都是用于保存线程的数据。线程的调度由操作系统内核来实现。
内核线程和用户空间线程基本从性能各方面来说基本是相反地
1。创建线程消耗非常大,需要在用户空间和内核之间切换。
2。当然发生线程的Context切换时,程序也要从用户态和内核态之间互相切换,开销大
上面的两种线程的实现方式都有明显的优缺点,最好的方案其实就是将两者结合,一个程序可以既有用户空间的线程,也可以用内核空间的线程。
具体实现方式是,内核线程可以在其之上有一部分用户空间的线程。内核只调度内核的线程。
至于什么样的比例,怎么实现。 又回到程序=数据结构+算法这个话题了。。。
Operating System-Thread(3)用户空间和内核空间实现线程
标签:
原文地址:http://www.cnblogs.com/Brake/p/Operating_System_Thread_Part3.html