> 文档中心 > 第⼀章 进程与线程的基本概念

第⼀章 进程与线程的基本概念


1、进程产生的背景

最初计算机只能接受一些特定指令,用户输入一个指令,计算机就执行一个指令。由于这样效率太低,随后出现了批处理操作系统,但是批处理系统的指令仍然是串行的,内存中只能有一个程序执行,效率也不是很高。 对于人们对计算机的的性能要求越来越高,于是提出了进程的概念。

进程就是应用程序在内存中分配的空间,也就是正在运⾏的程序,各个进程之间互 不⼲扰。同时进程保存着程序每⼀个时刻运⾏的状态。

此时,CPU采⽤时间片轮转的方式运⾏进程:CPU为每个进程分配⼀个时间段,称 作它的时间⽚。如果在时间⽚结束时进程还在运⾏,则暂停这个进程的运⾏,并且 CPU分配给另⼀个进程(这个过程叫做上下⽂切换)。如果进程在时间⽚结束前阻 塞或结束,则CPU⽴即进⾏切换,不⽤等待时间⽚⽤完。
使⽤进程+CPU时间⽚轮转⽅式的操作系统,在宏观上看起来同⼀时间段执⾏多个 任务,换句话说,进程让操作系统的并发成为了可能。虽然并发从宏观上看有多个 任务在执⾏,但在事实上,对于单核CPU来说,任意具体时刻都只有⼀个任务在占 ⽤CPU资源。

虽然进程的出现,使得操作系统的性能⼤⼤提升,但是随着时间的推移,⼈们并不 满⾜⼀个进程在⼀段时间只能做⼀件事情,如果⼀个进程有多个⼦任务时,只能逐 个得执⾏这些⼦任务,很影响效率。

线程的提出

那么能不能让这些⼦任务同时执⾏呢?于是⼈们⼜提出了线程的概念,让⼀个线程 执⾏⼀个⼦任务,这样⼀个进程就包含了多个线程,每个线程负责⼀个单独的⼦任 务。
总之,进程和线程的提出极⼤的提⾼了操作提供的性能。进程让操作系统的并发性 成为了可能,⽽线程让进程的内部并发成为了可能。

多进程的⽅式也可以实现并发,为什么我们要使⽤多线程?

多进程⽅式确实可以实现并发,但使⽤多线程,有以下⼏个好处:

  • 进程间的通信⽐较复杂,⽽线程间的通信⽐较简单,通常情况下,我们需要使 ⽤共享资源,这些资源在线程间的通信⽐较容易。
  • 进程是重量级的,⽽线程是轻量级的,故多线程⽅式的系统开销更⼩。

进程和线程的区别

进程是⼀个独⽴的运⾏环境,⽽线程是在进程中执⾏的⼀个任务。他们两个本质的 区别是是否单独占有内存地址空间及其它系统资源(⽐如I/O)

  • 进程单独占有⼀定的内存地址空间,所以进程间存在内存隔离,数据是分开 的,数据共享复杂但是同步简单,各个进程之间互不⼲扰;⽽线程共享所属进
    程占有的内存地址空间和资源,数据共享简单,但是同步复杂
  • 进程单独占有⼀定的内存地址空间,⼀个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性⾼;⼀个线程崩溃可能影响整个程序的稳定性,可靠性较低。
  • 进程单独占有⼀定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及⻚调度,开销较⼤;线程只需要保存寄存器和栈信息,开销较⼩。

另外⼀个重要区别是,进程是操作系统进行资源分配的基本单位,线程是操作系统进⾏调度的基本单位,即CPU分配时间的单位 。

2、上下文切换

上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程(或线程) 切换到另⼀个进程(或线程)。上下文是指某⼀时间点 CPU 寄存器和程序计数器的内容。

CPU通过为每个线程分配CPU时间片来实现多线程机制。CPU通过时间片分配算 法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。

但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加 载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。

上下文切换通常是计算密集型的,意味着此操作会消耗大量的 CPU 时间,故线程 也不是越多越好。如何减少系统中上下文切换次数,是提升多线程性能的一个重点课题。