用「闪电侠」的例子来解释进程和线程

简介: 艾伦在一次粒子加速器爆炸大事故中获得了极速移动的超能力,因此开始化身为超级英雄“闪电侠”。类比之下,CPU是计算机最核心的部件,它负责指令的读取和执行,每秒可以执行几十亿条指令!其实比闪电侠还要快得多。小闪这种能力很快就被FBI发现了,为了好好利用小闪,FBI雇佣了小闪为其特别行动小组A执行任务。

1.

艾伦在一次粒子加速器爆炸大事故中获得了极速移动的超能力,因此开始化身为超级英雄“闪电侠”。类比之下,CPU是计算机最核心的部件,它负责指令的读取和执行,每秒可以执行几十亿条指令!其实比闪电侠还要快得多。

I Am the Flash

小闪这种能力很快就被FBI发现了,为了好好利用小闪,FBI雇佣了小闪为其特别行动小组A执行任务。

说是特别行动小组,其实除了小闪之外只有一个A博士,小闪日常的工作就是取得A博士的指令并且执行。这就是计算机早期的单进程模型。

2.

特别行动小组,禁止入内

但是A博士从搜集情报到得出正确的指令毕竟需要时间,而小闪执行指令的速度又太快,所以在FBI高层眼里,A博士总是忙忙碌碌,而小闪成天优哉游哉。

为了提高小闪的利用率,FBI在特别行动小组办公室的楼下,着手成立另一个特别行动小组B。

这个着手成立的过程就是编码,而编码的结果就是得到一个能够完成某个特定功能的程序。

很快,特别行动小组B在B博士的独自掌管下开始暗中运行。这就是进程的诞生,进程其实就是运行的程序。现在FBI特别行动小组进入了多进程时代。

3.

虽然都是FBI的特别行动小组,若无特殊情况,A和B通常井水不犯河水,他们都认为自己垄断了FBI的所有资源,但这其实只是FBI的小把戏而已。

背后的含义就是每个进程采用了完全相同的虚拟地址空间,然而经由操作系统和硬件MMU协作,映射到不同的物理地址空间。

不同的进程,都有各自独立的物理内存空间,特别行动小组A和B之间的通信就是进程间通信(IPC)。

4.

小闪虽然速度快,但是依然没办法在同一时刻同时执行A博士和B博士两个人的指令,就好像人不能在向右看的同时向左看。

A博士和B博士常常为此大打出手,谁都想占用小闪更多的时间,好完成自己的KPI。

FBI领导层想了一个办法,新成立了一个调度小组,用来给各个小组分配小闪的使用时间。一开始,调度小组会给每个进程分配相等的一小段时间,然后每个小组轮番地占用小闪执行相应时间的任务。这就是CPU的时间片分配。

如果小闪在这一小段时间内还没执行完,那也必须得停,但是得保存一下执行进度,下次继续从结束的地方开始做。这就是CPU的上下文切换。

这样一来,A博士和B博士的KPI完成了,小闪也忙起来了。说是忙起来,但是花在指令执行上的时间其实也没多多少,基本就是在两个小组之间反复横跳了,小闪的工作依然惬意。

5.

两个博士眼红于小闪依然有大把的空闲时间,居然颇有默契地发起了招聘公告,广揽天下英才,势必要多找点事情给小闪做。

FBI的英雄帖

很快,行动小组内的成员越来越多,并且每个成员的任务都不一样,比如有些人负责查阅资料,有些人负责收取讯息......小组内各个成员分工协作,完成特别小组的共同目标。自此进入多线程时代。

线程就好比是小组内的成员,一个进程可以包含很多个线程。

进程是资源分配的基本单位,比如FBI给特别小组分配办公场所。

线程是CPU调度的基本单位,比如小闪需要执行每个小组成员的指令。

6.

成员多了,管理就成了一个新的问题。如果每个成员只是自说自话,完全不讲究团队协作,极容易造成团队内部冲突。

为此,FBI制定了几个策略。对应的是线程的同步。

7.

给厕所锁死

行动小组内的资源不同,共享的程度也不一样。比如厕所,当有人正在使用的时候,其他人只能等待,如果贸然闯进去必然出现冲突。这表示进程中的某些共享内存同一时间只能由一个线程使用,其他线程必须等待该线程结束使用之后才能继续使用。

一个防止其他人进入的简单方法就是给厕所添加一把锁,首先占用厕所的人上锁,其他人看到有锁之后就在门口排队,直到占用的线程释放锁才能进入。这个策略叫做「互斥锁」,英文叫做Mutex

8.

进入会议室之前先领个小可爱

不同于厕所,会议室就能同时允许10个人进入,如果人数超过10个,多出来的人只能排队等着,除非有人空出位置,其他人才能进入会议室。

为了解决这个问题,FBI在会议室的门口挂了10把钥匙,每个人进入会议室前都要取一把钥匙,出来时把钥匙放回原位。如果后来者发现没有钥匙了,就在会议室门口等待。这种策略叫做「信号量」,互斥锁只允许一个线程进入临界区,信号量允许多个线程同时进入临界区。

9.

兔子不是在睡觉,只是在等待被唤醒

有些时候,行动小组的某些任务比较复杂,需要流水线式作业。上游的人员做完之后把结果交付给下游人员处理,这就是典型的生产者消费者模式。

如果生产者生产得太快,我们可以适当让上游的人员停止作业,等待某个时机唤醒生产者;反之,如果消费者消费得太快,我们可以适当让下游的人员停止作业,等到某个时机唤醒消费者。

这种策略叫做「条件变量」,背后的原理是当线程在等待某些条件时使线程进入睡眠状态,一旦条件满足,就唤醒。

10.

频繁升级的放映机

最后拿行动小组的放映机举个例子。很多成员喜欢在休息时间坐在一起使用放映机看个电影,消遣一下时间,类似于多线程对同一资源进行读操作,这种情况下不管多少人在看电影都不会出现问题。

但是偏偏有人在其他人看电影的时候要升级一下放映机的操作系统,这肯定会影响其他人的观影体验;反之,在升级操作系统的时候,有人要看电影,这同样会对升级人员造成困扰。

这种时候我们可以定一个策略,当观影时,随时欢迎其他观影人员使用观看;当升级时,禁止任何观影人员和任何其他升级人员使用。

这种方式称为「读写锁」,也叫做「共享-独占锁」,“观影”对应的就是线程的读操作,“升级”对应的就是线程的写操作。具体来说一般有两种情况:

  1. 读写锁处于写锁定的状态,则在解锁之前,所有试图加锁的线程都会阻塞;
  2. 读写锁处于读锁定的状态,则所有试图以读模式加锁的线程都可得到访问权,但是以写模式加锁的线程则会阻塞;

公众号「蝉沐风」,欢迎关注,邂逅更多精彩文章

完!

相关文章
|
26天前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
2月前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
58 1
|
26天前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
49 6
|
26天前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
55 5
|
24天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
26天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
48 4
|
1月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
1月前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
1月前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
29 1
|
1月前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
46 2