进程 是表示资源分配的基本单位, 又是调度运行的基本单位. 例如, 用户运行自己的程序, 系统就创建一个进程, 并为它分配资源, 包括各种表格, 内存空间, 磁盘空间, I/O 设备等. 然后把该进程放人进程的就绪队列. 进程调度程序选中它, 为它分配 CPU 以及其它有关资源, 该进程才真正运行. 所以进程是系统中的并发执行的单位。

线程 属于进程, 一个进程至少具有一个线程. 线程是操作系统调度的最小单位. 线程比进程更小更轻量. 线程几乎不拥有系统资源, 但是同一个进程下的线程为了能够独自运行, 依然会少量的拥有一些自己的资源, 例如线程拥有自己的程序计数器, 调用栈, 这使得线程能够相对独立的运行. 同时, 分配给每个线程的 CPU 时间相当短, 一旦结束立即挂起该线程, 切换到另一个线程. 同时由于 CPU 速度极快, 所以给人的感觉是线程在 "同步" 执行.

协程 的概念比线程更小. 在一个线程中, 所有东西都是顺序执行, 如果函数 A() 在函数 B()之前, 那么一定是在函数 A() 执行完毕后再执行函数 B(), 即使函数 A() 中发生了极为耗时的 IO 操作, 函数 B() 也必须等待函数 A() 的完成. 而协程的目的是在让程序自己自由控制执行顺序. 比如在函数 A() 中发生耗时 IO 操作的生活, 可以主动调用函数 B(), 而函数 B() 也可以回头来把控制权返还给 A(), 这样也实现了类似于线程的效果, 也就是并不一定按照代码中的先后顺序执行, 而是像线程一样完全确定执行顺序(因为 IO 等操作会带来执行顺序的改变). 协程的好处在于开销更小, 因为即使是线程切换的时候也会带来一定的系统开销(因为线程也有自己的一些资源, 比如上面提到的调用栈, 程序计数器), 而协程说到底还是只有一个线程, 所以并没有类似的开销.


进程 之间不会因为某个进程挂掉而导致其他进程挂掉的情况, 但是进程切换的开销较大.

线程 共享同一个进程的资源, 属于同一个进程, 所以如果某个线程挂掉而没有做相应的处理, 会导致整个进程挂掉. 所以要求多线程开发的时候需要更加注意健壮性. 线程需要分配的独立资源较少, 所以线程间切换的时候开销会小于进程切换.

协程 其实是同一个线程, 只是由程序开发者人为控制在耗时操作的时候主动去改变程序运行流程, 其实并没有任何的系统开销.


程序计数器

简单的理解就是一个指针, 指向当前程序机器码执行的位置. 每执行完一条命令自加, 自动指向吓一跳命令, 使得程序顺序执行. 如果有跳转那就直接指向新的位置

调用栈

主要用于存放返回地址, 同时存放本地变量, 本地参数等.

Comments
Write a Comment