线程是最小的任务调度单位,是依赖于进程而存在的迷你进程。和进程同样,线程也有三种状态——运行、就绪、阻塞。我认为,线程是进程中任务真正的执行者,而进程提供了内存空间、CPU、程序计数器以及寄存器让线程使用。算法
对于进程来讲,多个进程之间没法分享内存空间,对于一些应用而言,共享内存空间的能力是必须的,而同一个进程下的多个进程,是共享进程的内存空间的。同时,因为这一特性,线程的建立相较于进程,要快得多。缓存
还有一点,可能也是不少人误解的,那就是线程能够加快程序的运行速度。这是一种错误的观点。多线程并不能加快程序执行的速度,而是能充分利用 CPU,从而给咱们形成了程序速度变快的假象。例如,在 I/O 处理时,线程阻塞另外一个线程开始,而不须要等待 I/O 完成。多线程
这里,咱们应该知道,在单 CPU 的状况下,某一时刻只能有一个进程运行,只能有一个线程运行。并发
线程有两种,一个是内核态线程,一个是用户态线程。性能
当在一个进程中建立一个内核态线程时,这个线程便陷入了内核中,同时占据 CPU、寄存器和程序计数器,而且和进程同样,将线程表存在内核中。内核对这个线程是有感知的,而且内核直接参与线程的调度。操作系统
而用户态线程的状态是存储在进程中的。进程中有一个专门的运行时系统,用于调度用户线程。因此,每一个进程能够本身实现本身的调度算法,从而能够增长程序的灵活度。例如,在一个线程要作可能会形成阻塞的事情时,会通知运行时系统,由运行时系统来经过进程中的线程表的线程的状态,来决定调度线程。线程
可是,因为内核不直接参与调度用户线程,那么就有一个问题,进程调度线程须要线程主动让出,这样用户线程的权利是很是大的。若是一个线程作了形成本地阻塞的事情而不通知进程,那么就会使整个进程一直处于阻塞状态,即便进程中其它线程是就绪状态。协程
这里插一句,好像上面的事情和如今说的比较多的协程很类似。没错,我认为,协程就是用户态线程,它有至关高的主动权,来经过进程的堆栈来调度,能够有效解决并发的问题。进程
能够看到,内核线程和用户线程都有各自的优势和缺点。内存
内核线程由内核直接调度,在多处理机系统中能够实现同时运行。并且因为是内核调度,线程没有主动权,能够避免线程占据 CPU 过久而致使其余线程没法运行。可是因为内核线程是内核直接调度的,在调度时会陷入内核,这个代价是很是大的。
用户线程由进程中的运行时系统来调度,全部的线程的数据都保存在进程栈中,而不须要陷入内核,不须要上下文切换,也不须要对缓存进行刷新,因此这样的调度时很是快的。同时用户线程由进程实现调度算法,有很强的扩展性。可是因为用户线程的主动权很是大,可能会致使线程阻塞但其它就绪的线程没有机会运行。并且因为线程的数据均保存在进程的内存中,若是线程不少,可能会占用至关多的内存,从而发生一些问题。
既然内核线程和用户线程由各自的优势,那么能够将它们的有点集合起来。例如,可使用内核线程,而且内核线程和用户线程多路复用,经过内核线程来控制和使用用户线程。
调度程序激活的目标是模拟内核线程的功能,可是为线程提供在用户空间中才能实现的更好的性能以及更强大的灵活性。
进程的运行时系统,将线程分配在处理器上。当内核了解到一个线程阻塞时,它启动运行时系统,以此当作通知,让运行时系统决定如何调度本身的拥有的线程。
在某个用户线程运行的过程当中,发生了一个硬件中断,此时 CPU 进入内核态。若是进程中的线程须要这个中断,进程对中断感兴趣,那么进程将被中断的线程挂起并保存在堆栈中,而后选择线程进行调度。若是不感兴趣,则恢复被中断的线程。
本文是做者阅读《现代操做系统》的一些总结与理解,仅此记录下来已被往后翻阅。同时,也分享给各位但愿了解这些知识的同道者们。因为做者水平有限,若有错误之处,望不吝赐教,谨表感谢。