1. 进程产生的背景
计算机刚被创造出来的时候,只能接受一些特殊的指令。操作者每输入一次指令,计算机就会执行对应的操作,这类似于 windows
下的 cmd
。直观上看待这种操作无疑是效率低下的,因为每当用户在思考或输入下一次指令时,计算机都处于空闲等待状态,也就侧面造就了系统资源无法充足利用。
2 批处理系统
批处理系统是在上文的环境下优化出来的,不同的是批处理系统可以提前把所有操作指令写下来,一次性递交给计算机。类似于 windows
下的 bat
后缀文件。
批处理系统在一定程度上提高了计算机的效率,但同一时刻内存中只有一个程序在运行。如果前面的程序涉及到了 I/O,网络等,那么程序程序将会进入阻塞状态,直至对应的指令执行完成。所以批处理系统还需要再被提高。
3 进程的概念
在批处理的环境下,不能同一时间运行多个程序。
于是,进程的概念在此背景下提出。
进程就是应用程序在内存中分配的空间,也就是正在运行的程序。不过各个进程之间互不干扰,同时每个进程保存着程序每一时刻的状态。
进程在此背景下诞生,它给予了系统的并发能力。
问:CPU 是如何运行多个进程的呢?
答:CPU 采用时间片轮转方式运行进程。CPU 为每个进程分配一个时间段(时间片),如果分配的时间片结束时程序还在运行,那么就强制暂停该程序的运行,并且将 CPU 分配给另一个进程(此操作称为上下文切换)。如果进程在时间片结束前阻塞或结束,则 CPU 会立即切换,无需等待时间片用尽。
当进程被暂停时,它会保存当前进程的状态(进程标识,进程使用的资源等),在下一次的执行中会根据保存的状态进行恢复,接着继续执行。
由于时间片太过短暂(5ms ~ 800ms),在宏观上来看也就是同一时间执行多个任务。但事实上,单核 CPU 同一时刻只有一个任务在占用 CPU 资源。
4. 线程的概念
有了进程,但似乎还是不够完善。
如果需要一个应用在同一时间完成多个任务呢?
进程只得逐个执行这些子任务,这貌似又回到了批处理时代。
线程在此背景下诞生,其目的就是为了提供给应用并发能力。
5. 进程与线程的区别
进程:
- 进程是一个独立运行的环境。
- 进程单独占有内存地址与系统资源
- 进程内存隔离,进程间数据共享复杂,同步简单。
- 进程之间各不干扰,任意进程出现问题都不会影响至其它进程。
线程:
- 线程是存在于进程中
- 线程资源共享简单,同步复杂。
- 任意一个线程崩溃都会影响整个程序的稳定性。
问:多进程与多线程统一都是提供并发,为何还需要线程呢?
答:
- 进程之间的通信复杂,而线程通信较为简单。
- 进程是重量级的,而线程是轻量级的。
进程是操作系统分配的基本单位,而线程是操作系统调度的基本单位。