进程线程协程一锅炖

进程

一般来说,进程的定义为操作系统进行资源分配和任务调度的基本单位。很熟悉吧,每次操作系统期末考的必考题 :)

但细想下,还有一些值得反复咀嚼的精华。

1
2
3
$ ps -ef
$ top
$ ls /proc/<pid>/fd

这些简单的命令可以看到操作系统上的很多进程信息,如PID, State, fds(已打开文件描述符)。这些信息均来自一个耳熟能详的名字——PCB(进程控制块,Process Control Block)

不过不幸的是,用户空间很难直接打开PCB查看,PCB一般被放置在内核栈中。 1

那么进程除了PCB,还有啥。进程一般由程序、数据集合和进程控制块三部分组成。 程序即程序, 运行进程的代码块,程序猿们耗费无数青春的地方。 数据集合是程序在执行时所需要的数据和工作区。

由此可产生一个浅显的结论:进程是程序运行的实体。程序本身只是指令、代码及其组织形式的描述,进程则是程序加载到系统、资源、CPU上的运行实例。 因此多个进程可能与同一个程序有关,但每个进程又独立运行,因为PCB不一样。

进程是资源分配的基本单位,那么资源是什么? 资源是最底层的硬件(CPU、RAM、DISK、NET DEVICES)在操作系统视角上的抽象(CPU timestamp, memory, file, ip/port)。

资源分配大多发生在新建进程时,一般我们会把所分配的资源相关信息存放到PCB中。

当然我们也可以在进程运行时分配更多资源,如长期霸占CPU(阻塞IO)、占用更多内存(新建对象,动态分配堆)、打开更多文件,写入数据等等。

Process life circle

从上图可以看到PCB的常见信息,同时还有更大的信息点是进程的生命周期:

实质很简单:既然可以创建进程,自然可以杀死进程,同时操作系统为进行任务调度:即让进程进行运行和等待状态的切换。

这也是为什么进程是操作系统进行任务调度的基本单位。同时,也是操作系统运行了好几十个进程,使用上却一点没有卡顿的感觉的本质。

调度有很多种,但当前操作系统的调度主要是一种:基于时间片的抢占式调度。

基于时间片是指假想把CPU的运行按照时间轴切成一片片的零碎时间,每片时间运行不同的进程。

抢占式是时间片到了,操作系统会强制切换正在运行的进程的状态,好让等待的进程获得运行的机会。

线程

协程

参考资料

https://en.wikipedia.org/wiki/Process_control_block