做饭与进程线程之间的关系
做饭与进程线程之间的关系
what ?做饭和进程与线程有关系。fuck一句之后,我们来看看他们之间的关系是什么。技术文章有时候用专业名词会显得自己逼格比较高,更加专业一点,但是对于初学者往往是很深的壁垒。所谓名词,就是以前没有,为了方便人们形成统一的认识,起了一个客观的名字。一旦一个东西客观起来,就变得不那么生动了,不那么形象了。理解某些前人高人的晦涩名词的时候,不妨用生活中的常见概念来替换。理解其中的原理是最重要的,不要因文废义。
上图就是大家都见过的做饭的场景。
先讲明今天要澄清的概念:
进程
进程是程序的上下文,包含要执行程序的代码。
一个进程的简化执行过程如下:
1、加载程序到内存
2、CPU执行程序
3、执行结束或将进程的上下文内容保存。
线程
线程是进程的可执行单元。
一个进程中可以有多个线程,进程如果阻塞之后,将被CPU至为阻塞态,此时线程被切出内存。
以炒菜为例理解进程和线程
假如你现在是一名大厨,每天的工作是炒酸辣土豆丝(我太喜欢了)。
好了,现在我开始为你分配资源:
削土豆皮的一人:张三
切土豆丝的一人:李四
切葱姜蒜的一人:王二
给你点火的一人:马大哈
负责盛盘子的一人:马二哈
进程是这样工作的,首先你将这些人都赶进厨房(内存)里,于是这些人有条不紊的进行干活,直到你把这盘土豆丝炒好,被马二哈端走。但是呢,遇到了突发状况,上级突然来检查(阻塞态),于是你只能让手下的兄弟,都暂停工作,并保留已经工作的成功,切好的土豆丝总不能扔了吧,要用一个盘子盛起来(保留程序上下文)。上级检查走后,将未完成的工作拿出来,继续进行。一盘土豆丝炒好之后,开始进行下一盘土豆丝。
上面的描写是进程的概念。
现在我抛给你一个问题:那张三土豆皮削过之后呢,要一直等到炒下一份土豆到来吗?对的,在进程中是这样的,以上所有的流程在程序中被称之为程序计数器,计数器里面存放的是程序命令的地址。一条一条的从计数器拿,拿完就加1。当这些步骤成为一个整体的时候,张三很空闲,李四很空闲,下面的人没有得到高效的利用。那么如果此时第一盘土豆丝没有炒完,又来第二盘土豆丝该怎么办,那只有等待了。
于是我们有了线程:
将一个进程中可以独立成单元的部分单独拿出来:
削土豆皮的一人:张三
切土豆丝的一人:李四
切葱姜蒜的一人:王二
给你点火的一人:马大哈
负责盛盘子的一人:马二哈
每个人都是一个线程。线程有自己的程序计数器,不用相互依赖。比如小土豆皮和切葱姜蒜没有关系,在多核CPU中就可以同步执行。
好,厨房现在开始干活了。
削土豆皮的张三,加载了一框子土豆。使用了CPU的一个核心,努力的削土豆皮。同时切葱姜蒜的王二,加载了许多原材料,也使用了一个CPU核心,努力的切葱姜蒜。张三完成之后,李四拿到张三削好的土豆(共用程序的内存地址空间),用了CPU的一个核心(有可能是张三也有可能是王二空闲下来的核心),飞快的将土豆切成丝。这时候准备工作已经结束了,开始炒菜了,马大哈点火了。这时候突然,店小二说,顾客又叫了10分土豆丝。于是在这一份土豆丝未结束的情况下,张三已经空闲,接过订单,努力的削土豆,以此类推。在很短的时间内,就炒出了11份土豆丝。每个人都得到了高效的利用。
本文参考: 1、《操作系统精髓与设计原理》 2、知乎:
线程和进程的区别是什么? - 知乎
zhonyong 人生就是修行,在享受中,更在苦难中。 不请自来。 看见上面几位的回答我真的是醉了。说几句我的理解。 首先来一句概括的总论:进程和线程都是一个时间段的描述,是CPU工作时间段的描述。 下面细说背景: CPU+RAM+各种资源(比如显卡,光驱,键盘,GPS, 等等外设)构成我们的电脑,但是电脑的运行,实际就是CPU和相关寄存器以及RAM之间的事情。 一个最最基础的事实:CPU太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM和别的挂在各总线上的设备完全是望其项背。那当多个任务要执行的时候怎么办呢?轮流着来?或者谁优先级高谁来?不管怎么样的策略,一句话就是在CPU看来就是轮流着来。
一个必须知道的事实:执行一段程序代码,实现一个功能的过程介绍 ,当得到CPU的时候,相关的资源必须也已经就位,就是显卡啊,GPS啊什么的必须就位,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。
串联起来的事实:前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是: 先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。。。 。
========= 重要的东西出现了======== 进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。 * 进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文 线程是什么呢?进程的颗粒度太大,每次都要有上下的调入,保存,调出。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:
程序A得到CPU =》CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。
这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这 里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段。
到此全文结束,再一个总结: 进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。