操做系统 - 线程

以前已经讨论过进程了,如今讨论线程。我在想如何用现实中的具体事物来比较进程和线程的关系。面试

举个我认为较恰当的例子。把进程比做一个工厂中的车间,车间中有若干个生产线,可是每条生产线都须要不一样的零件,原料和员工。零件,原料和员工,是全部生产线均可以共同使用的资源。这里就把生产线当作线程吧。这样,每条生产线就只用管本身的生产过程。编程

就如讨论进程同样,这里仍是列举一下线程所包含的实体。数据结构

Program counter多线程

Register并发

Statck学习

State操作系统

不难发现,线程关心的只是下一刻CPU执行所需的必要实体,只须要知道PC等寄存器的信息,当前栈指针,不用关心我有没有子进程啊,个人地址空间在哪里,我打开了什么文件等等的信息。由于这些信息CPU已经知道了。线程

为何要使用线程

在《现代操做系统》中已经说明了使用线程的种种优点,很容易就能看明白。其实根据上文,也能猜到答案。这里就不用说明了。翻译

线程实现的方式

线程能够在内核中实现,也能够在用户空间实现。我本身的理解是这样的:在内核中实现就是操做系统提供线程支持;在用户空间中实现就是用户本身实现。原本觉得JVM的线程就是在用户空间上实现的,可是搜了一下,貌似Linux平台下是调用Pthred库实现的。这里仍是深刻学习一下这两种线程的实现方式,为之后的工做和学习打下基础,说不定何时就用上了。看了几遍《现代操做系统》中的相关章节,但是本身仍是云里雾里的,不是很清楚,这一次就好好的搞明白(不必定搞的明白,目前尚未接触过用户空间实现的线程,也许是我孤陋寡闻)。指针

用户空间实现线程

在这种状况下,内核不知道线程的存在。当一个进程中的线程执行完毕,不须要进行系统调用(Trap),不须要进行上下文交换,因此线程的切换很是快。

可是在发生I/O中断的时候,必需要内核去处理了。那么问题来了,内核会锁住当前线程所在的进程,由于内核不知道线程的存在,只知道进程。解决这个办法有点麻烦。《现代操做系统》中提出了一个解法,在某些UNIX版本中有一个select系统调用,它能够判断I/O操做是否会阻塞。若是阻塞就不执行I/O操做。这样run-time system(用的英文版教材,不少术语不会翻译或者乱翻译,囧)就知道是执行I/O,仍是执行该进程的其它进程。

内核实现线程

内核实现线程和进程区别不大。可是在线程被销毁时,内核并不会销毁线程的数据结构,只是会标记该线程是不可执行的。这样,当新线程被建立时,覆盖不可执行的线程的数据,效率大大的提升了。

还有一个问题,当一个多线程的进程执行fork时,子进程是否须要复制父进程的全部线程仍是个别线程,如何操做。这个,由于不多接触Linux下的C编程,因此暂时放在这里吧。

进程和线程的区别

面试的时候,这个问题多是问的最多的,能够考察概括能力和是否理解进程和线程。这里给出本身的理解。

首先,进程是操做系统资源分配和调度的基本单元,它包含了程序可以执行的必要资源。而线程也叫作轻权进程,只拥有CPU执行所需的必要资源。没有进程,线程没法单独执行。

其次,进程的执行通常是线程的,一条道走到黑。线程只是进程执行的不一样路径,并发的执行。

就写这么多吧。

欢迎你们一块儿交流和学习啊。

-end-

相关文章
相关标签/搜索