计算机操作系统之 进程 线程
一、并行和并发
在介绍进程、线程和协程这三个概念之前,有两个操作系统中的相关概念需要简单解释一下:并行和并发。
并行:同一时刻,指多个任务同时执行。
并发:指在一个时间段内,多个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行(即多个任务在同一处理机上交替执行)。
对单核CPU,因为一个CPU一次只能执行一条指令,是无法做到并行,只能做到并发。
二、进程
2.1 什么是进程
进程(process)是一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”,它是系统进行资源分配和调度的基本单位。我们日常使用电脑和手机打开的应用程序就属于进程 。
进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
2.2 进程出现的原因
进程的出现是为了更充分的利用CPU的资源使得能够并发执行任务。假设有两个任务,一个是IO操作,一个是计算任务。如果一个任务接一个任务的执行,CPU在执行IO操作时需要等待数据读取完关闭文件后才能执行下一个计算任务,会使得CPU得不到充分的利用。如果在等待数据读取时让空闲的CPU切换到另一个任务去执行,等数据读取完后再切换回去就可以使CPU得到更充分的利用。要做到任务切换,需要能够识别任务以及保存和恢复任务的状态,而且不同的任务通常需要不同的系统资源,为此进程就被发明出来。系统正是通过进程分配资源、标识任务的。
2.3 进程的优缺点
优点:相对比较稳定安全(进程拥有独立的系统资源,进程间不容易相互影响)
缺点:
- 进程切换的时空开销比较大(涉及到很多系统资源的切换)
- 进程间通信(IPC)较为复杂和耗时
三、线程
3.1 什么是线程
线程(thread)是在进程之后发展出来的概念。线程包含在进程中,也叫轻量级进程。线程是进程中一个单一顺序的控制流,像“线”一样(或许是其译名的由来),它是系统进行运算调度(即如何分配CPU去执行不同任务)的基本单位,一个进程的多个线程在执行不同任务的同时共享进程的系统资源(如虚拟地址空间,文件描述符等),如果把进程比作一个正在生产产品的车间,那么线程就好比是车间里面执行不同任务的工人,也可把进程比作道路,而线程就好比是并行的车道。线程由相关堆栈寄存器和线程控制块组成。一个进程里包含多个线程。
3.2 线程出现的原因
线程的出现是为了减少任务切换的消耗,提高系统的并发性,实现让一个进程也能执行多个任务。例如一个文本程序需要获取键盘输入、显示文本内容并将文本内容保存到磁盘。如果使用多个进程来执行这些任务,需要频繁的进行上下文切换和进程间通信。考虑到这些任务是相互关联且共享资源的(它们都要用到文本内容),用一个进程中的多个线程来执行可以减少上下文切换和进程间通信的消耗。
3.3 线程的优缺点
优点:线程切换的开销比进程切换的开销小,减少了任务切换的消耗,提高了操作系统的并发性能。
缺点:相比进程不够稳定,多线程在操作共享数据时容易出错(比如丢失数据、产生死锁)