进程和线程最通俗的形象比喻
前言
让我们建立一些形象的比喻来讨论线程,进程,时间片以及操作系统中奇妙的“调度概念”
比喻
CPU
:一座时刻运行的工厂
进程
:工厂的一个车间
线程
:在车间里面活动的工人,人是活动的对象
进程的内存空间是线程共享的
:车间的空间是工人们共享的,他们可以使用车间里面的各种房间,生产线,食堂,厨房,洗澡间,厕所等。
临界区
:车间里只能一次进一个人的房间
互斥锁
:防止他人进入单人间的锁。先到的人进去后锁门,后到的人看到上锁,就在门口排队,等锁打开再进去。
信号量
:可以进多人的多人间,门口挂n把开门钥匙
进程和线程
我们假定工厂的电力有限,一次只能供给一个车间(车间相当于进程)使用。也就是说,一个车间开工的时候,其他车间都必须停工。(单个CPU(或者说是单核)一次只能运行一个任务。)
进程就好比工厂的车间,它代表CPU所能处理的单个任务。(任一时刻,CPU总是运行一个进程,其他进程处于阻塞
或者就绪
状态。)
工人可以随意进入车间的各个房间。(进程的线程都可以对进程拥有的内存进行访问)
单线程
也就是车间里面只有一个工人,这个工人想使用这个车间里面的任何空间都行。如果他想使用洗手间,做饭,吃晚饭-随便什么,他都可以继续。
多线程
如果将另一个工人添加到车间中时,情况会发生巨大变化。一个工人不能在任何时间随意进入车间洗手间。他需要先检查以确保另一个工人不在其中!
如果是只有一个工人的情况,不用担心安全性问题,毕竟没有另外一个人动你的东西啊。
但是现在有别的工人也存在,工人自己就需要担心自己的空间,比如自己使用的好好的厨房,被另一个人弄着火了。自己刚使用的加工生产线的配置被另一个人改了,等等。(线程安全)
如果某个工人买进一台新的机器,因为它在车间里,所以其他工人也可以使用 (如果某个线程分配了某些东西,那么所有其他线程都可以立即访问它,因为它存在于进程公共地址空间中)。
如果工厂的车间扩大了,扩张了新的空间,所有工人也都能使用 (同样,如果进程分配了内存,则新的内存也可用于所有线程。)
当然需要注意的是识别内存是否应该对进程中的所有线程都可用。
- 如果是,那么您将需要让所有线程同步它们对其的访问。
- 如果不是,那么我们将假定它特定于特定线程。在这种情况下, 线程可以访问它,我们可以假设不需要同步。
互斥
有些房间最多只能容纳一个人,比如浴室。如果其他人想洗个澡,并且已经有人在浴室,就只能等待了。 (这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。)
如果要洗个澡,想独享浴室。为此,工人通常会进入浴室并从内部锁定门。任何试图使用浴室的人都会被锁锁住。完成后,您将打开门,允许其他人进入。(线程使用一个称为互斥锁的对象(Mutual exclusion,缩写 Mute)。此对象就像门上的锁—一旦线程将互斥锁锁定,其他线程就无法获取该互斥锁,直到拥有线程释放(解锁)它为止。就像门锁一样,等待获取互斥量的线程将被禁止,防止多个线程同时读写某一块内存区域。)
互斥锁和门锁发生的另一个有趣的相似之处是,互斥锁实际上是“建议”锁。如果线程不遵守使用互斥锁的约定,则保护是无用的。在我们的房屋类比中,这就像有人通过一堵墙闯入洗手间而忽略了门和锁的惯例。
从日常生活中我们知道,事情并不是那么简单。现在,我们已经了解了基本特征(摘要:所有内容都是共享的),让我们看一下事情变得更有趣的地方以及原因
优先级
如果浴室当前处于锁定状态,并且有许多人在等待使用该怎么办?显然,所有的人都坐在外面,等着谁在浴室里出来。真正的问题是,“当门解锁时会发生什么?下一步谁去?” (线程调度)
也许我们会认为,允许等待时间最长的下一个人是“公平的”。或者让最年长的人去下一步可能是“公平的”。或最高,或最重要的。当然有许多方法可以确定什么是“公平的”。
通常通过两个因素来解决线程问题:优先级和等待时间。
假设两个人同时出现在(上锁的)浴室门上。其中一个有一个紧迫的截止日期(他们已经开会迟到了),而另一个没有。允许紧迫的最后期限的人再去是没有道理的吗?好吧,当然可以。
唯一的问题是您如何确定谁更“重要”。 这可以通过分配优先级来完成(让我们使用数字最低优先级是1,最高优先级是255)。截止时间紧迫的人被赋予较高的优先级别,那些没有截止时间的人被赋予较低的优先级别。
线程从其父线程继承其调度算法,但可以调用 pthread_setschedparam()
更改其调度策略和优先级(如果有权这样做)。如果有多个线程正在等待,并且互斥锁被解锁,则我们会将互斥锁赋予优先级最高的等待线程。
但是,假设两个人的优先级相同。现在你怎么办?
好吧,在这种情况下,允许等待时间最长的人继续前进是“公平的”。在一堆等待线程的情况下,我们去主要的优先级,其次是通过等待的长度。
信号量
让我们从浴室转移到厨房,因为这是一个社会上可以接受同时容纳多个人的地方。在厨房里,车间可能不想一次让所有人都在那里。实际上,要限制厨房里的人数。假设厨房不能同时有两个以上的人。
计数为1的信号量
浴室可以处于以下两种情况之一,两种状态相互关联:
- 门是开锁的,房间里没人
- 门锁着,一个人在房间里
其他组合是不可能的-不能在房间里没人的情况下将门锁上(我们将如何解锁?),也不能和房间里的某人一起将门解锁(他们将如何确保他们的隐私?)。(这是一个信号量为1的示例-该房间中最多只能有一个人,或者使用该信号量只有一个线程。)
这里的钥匙是我们表征锁的方式。在典型的浴室锁中,您只能从内部对其进行锁定和解锁-没有可从外部访问的钥匙。实际上,这意味着互斥锁的所有权是一个原子操作– 在获取互斥锁的过程中,没有任何其他线程可以获取互斥锁的可能性,否则会导致两个人都拥有该互斥锁的情况。
厨房所需的是另一种类型的锁。
计数大于1的信号量
假设我们在厨房中安装了传统的基于钥匙的锁。该锁的工作方式是,如果您有钥匙,则可以解锁门并进去。使用此锁的任何人都同意,当他们进入室内时,他们会立即从内部锁定门,以便外面的任何人都可以。总是需要一个钥匙。
好了,现在控制我们想要在厨房里有多少人成为一件简单的事情—将两把钥匙挂在门外!厨房总是上锁的。当某人想进入厨房时,他们会看到门外是否挂有钥匙。如果是这样,他们会随身携带,解锁厨房门,走进去,然后使用钥匙锁定门。
由于进入厨房的人在厨房时必须随身带钥匙,因此我们通过限制门外钩上可用的钥匙数来直接控制在任何给定位置允许进入厨房的人数。门。
(对于线程,这是通过信号量实现的。信号量的工作方式就像一个互斥锁——要么持有互斥锁,必须对资源的访问;要么没有互斥锁,就没有权限访问。我们刚才在厨房中描述的信号量是一个计数信号量 -它跟踪互斥锁计数(计数线程可用的钥匙)。)
信号量作为互斥量
我们可以使用信号量作为互斥量吗?
可以。实际上,在某些操作系统中,这正是它们的作用-它们没有互斥锁,只有信号量!那么,为什么还要有互斥体呢?
互斥锁是一种“特殊目的”的信号灯。如果希望一个线程在代码的特定部分中运行,则互斥锁是迄今为止最有效的实现。
进程模型的厨师比喻
进程(process)模型
中,计算机所有的可运行软件都被组织成进程是一个正在执行程序的实例,包括
- 程序计数器的当前值
- 寄存器的当前值
- 变量的当前值
从概念上来说,每个进程拥有它自己的cpu,实际上是cpu来回切换进程
多道程序设计
:真正的cpu在进程之间的来回切换
程序
:做蛋糕的食谱
cpu
:厨师
进程
:厨师阅读食谱,取来各种原料以及烘制蛋糕等一系列动作的总和
保存当前进程的状态
:厨师做蛋糕做到一半,儿子被马蜂蛰了一下喊他,厨师就记录他照着食谱做到哪了,需要保存下面这些内容:
- 食谱进行到哪了
- 程序计数器的当前值
- 下了哪些料
- 变量的当前值
- 寄存器的当前值
进程切换
:
- 厨师从做蛋糕的进程切换到一个优先级更高的进程(医疗救治)
- 医疗救治后,再切换回做蛋糕的进程
关键思想是:一个进程是某一类型的活动,有程序,输入,输出,状态。单个处理器可以被共享,使用调度算法决定何时停止一个进程的工作,并转向另一个进程
注意:
- 操作系统中一个程序被运行两遍,看作是两个进程,操作系统能够使他们共享代码
- 看作是两个厨师共用一个食谱做蛋糕
进程模型的列车比喻
作者:知乎用户 链接:https://www.zhihu.com/question/21535820/answer/411196449
类似“进程是资源分配的最小单位,线程是CPU调度的最小单位”这样的回答感觉太抽象,都不太容易让人理解。 做个简单的比喻:
- 进程=火车,线程=车厢 线程在进程下行进(单纯的车厢无法运行)
- 一个进程可以包含多个线程(一辆火车可以有多个车厢)
- 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
- 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
- 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
- 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢与前一节产生断裂,将影响后面的所有车厢)
- 进程可以拓展到多机,线程最适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
- 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)
互斥锁
- 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-
信号量
参考资料
进程和线程有什么区别?
Processes and Threads
进程与线程的一个简单解释
版权
本仓库遵循 CC BY-NC-SA 4.0(署名 - 非商业性使用 - 相同方式共享) 协议,转载请注明出处,不得用于商业目的。
进程和线程最通俗的形象比喻相关推荐
- 进程和线程的一个简单形象的解释
转眼暑假一过,2015年的校招即将开启大幕,身为计算机专业的朋友们,在面试中是不是经常会被问到一个问题:进程和线程的区别,今日偶然看到阮一峰的博客,他用一个很好的类比把他们解释的清晰易懂,会不会突然让 ...
- 计算机操作系统“进程”与“线程”的通俗解析
进程:进程是系统进行资源分配和调度的一个独立单位. 线程:线程是进程的一个实体,是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源,只拥有一点在系统运行中必不可少的资源,但是它可与同属一个进程 ...
- 进程与线程的超级简单形象解释
转载自:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 这篇文章写的很生动,因此转载. 1. 计算机的核心是CPU, ...
- 形象理解操作系统的进程与线程
在网上看到一个特别形象的举例,让我们理解操作系统中的进程与线程,以及线程同步方式中的"互斥锁"(Mutual exclusion,缩写 Mutex)."信号量" ...
- python多线程调用携程,进程、线程和携程的通俗解释【刘新宇Python】
通过下面这张图你就能看清楚了,进程.线程和携程的关系 多个进程是可以运行在多个CPU当中的,比如你的电脑是4核,可以同时并行运行四个进程,这是真正物理上的并行运行. 每个进程又可以有多个线程,线程是轮 ...
- 进程、线程和携程的通俗解释【刘新宇Python】
通过下面这张图你就能看清楚了,进程.线程和携程的关系 进程: 多个进程是可以运行在多个CPU当中的,比如你的电脑是4核,可以同时并行运行四个进程,这是真正物理上的并行运行. 线程: 每个进程又可以 ...
- 五分钟扫盲:进程与线程基础必知
全文脉络思维导图如下: 1. 进程与线程的简单解释 进程(Process)和线程(Thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握.以下这个解释出自阮一峰老师的博客(http://ww ...
- 漫谈QNX(架构/进程,线程,同步,进程间通信IPC)
(1)架构 说起Blackberry的QNX操作系统, 想必大家都听说过,但到底为什么QNX能如此有名?难道微软的Windows和Linux都不能与之抗衡? 美国NASA的太空接驳飞船也使用QNX操作 ...
- 进程与线程(同步、互斥、通信方式等)
一.并发 并行 同步 异步 多线程的区别(引用:https://blog.csdn.net/cqkxboy168/article/details/9026205) 1. 并发:在操作系统中,是指一个时 ...
最新文章
- linux下g编译文件或目录,【转】在linux下使用gcc/g++编译多个.h文件
- 【AutoML】激活函数如何进行自动学习和配置
- Linux线程(六)
- Magento: 根据产品属性加载产品信息 Load A Category or Product by an Attribute
- 【高斯和拉普拉斯为什么分别对应L2和L1?】差分隐私系统学习记录(五)
- r读取shape文件可视化_使用Python对大脑成像数据进行可视化分析
- 随想录(uclibc的学习)
- mysql ---- DDL(了解)
- ABAP术语-Business Components
- unity 切换场景
- SouthidcEditor编辑器如何支持上传png图片
- 2020开启企业服务新纪元 云测试成为热门赛道
- 欠阻尼二阶系统的单位阶跃响应分析
- 解读2018:13家开源框架谁能统一流计算?
- css控制文本只显示两行
- CSDN博客怎么修改皮肤背景?
- 苹果iOS证书制作教程
- 2018上IEC计算机高级语言(C)作业 第3次作业
- 启用 DHCP 和静态 IP 共存
- B2C电子商务网站是如何打造成功之城
热门文章
- 自然语言处理常见应用领域及研究内容
- 往MySQL中存储图片
- NOIP2021 T1 报数
- Spring Cloud(一):Spring Cloud的优势是什么?
- Win系统 - 这些电脑状态指示灯,你认识几个?
- c语言i10表达式的值是什么,C语言符号的.doc
- 总结:会签任务一票否决
- 抖音最新版安卓 签名算法 设备注册() 最新版本 19.1.0 2021年12月18日发布
- 计算机毕业设计Java微博系统网站(源码+系统+mysql数据库+Lw文档)
- 第一次当招聘者-----如何考察一个测试人员测试思维和测试基础功