深入理解计算机系统003——第一章(进程及并发)

                   有关进程和线程,并发与并行。自感理解不透彻,望高人指点。

                                                                                                                  ——题记

  •          进程的雏形

          在那个需要卡带的计算机时代,要让计算机完成一项工作是很复杂的。因为你的“程序”就是一卷针眼排布无规律的纸带,并且这针眼还需要你自己打在纸带上。为了你能稍稍的进一步理解期间的难度,在这里,再详细一点的说一说(但不是说这就是当时巨匠们操纵计算机的情形):(假设你对诸如机器语言,汇编语言,c语言或类似的语言有一定的了解)以冒泡排序一次比较为例,你编写好了代码,需要生成机器码,机器码就是纸带上针眼序列(对于一小段纸带,有针眼和无针眼正好对应了0/1两种状态)。基本的操作是判定两个数大小,这个比较操作本身也有特定的二进制序列。也就是说,你不仅要将“数据”二进制化,还要将“对数据的操作”二进制化。另外如果,你不小心在一个不应该有针眼的地方,点了个针眼。哈哈,恭喜你,返工吧。

       同时,大家都想用这个庞然大物来为自己服务。早期计算机一次只能运行一个“任务”(具体点讲就是,如果你打开了QQ你就用不了浏览器,听不了歌,看不了电影,玩不了游戏。。。囧不囧!!),而且要在当前“任务”完成后,才能开始下一个“任务”,所以啊,在计算机旁边摆了一堆一堆的纸带。这里的“任务”就是进程的雏形。

      后来啊,计算机处理速度提高很多(1954年LEO I计算机的时钟速度为500kHz,你的计算机应该是GHz级别)时钟速度加快,导致CPU等待Input/Output的时间变得比CPU处理各个指令所需的时间更长(CPU在等待I/O过程中,是什么也不做的,因为当前任务还没有完成)。

     面对这个情况,你会想到什么办法加快任务被处理速度?

       一个自然的想法就是:要是在等待I/O的过程中,CPU能处理下一个任务的部分内容就好了。要想实现这个想法,需要考虑一下的问题:

  •        对于前后执行的两个任务,计算机又该如何区分呢?

        最简单的办法就是在内部给每个任务一个可区分的符号。作用和你的姓名一样。

  •         还有个问题需要解决:如何在上一个任务的I/O完成后,继续上一个任务的后续处理呢?

       CPU需要知道上一个任务在哪个地方暂停了,也就是说,计算机要在切换不同的任务过程中,需要保存一些被切换出去的任务的信息(当前的指令地址,之前运算的结果。。。。。。)

  •        如何使得当前任务让出CPU?(PS:这里的“让出CPU”是非常笼统的讲法)

        要使得I/O完成的时候,给CPU一个信号。这个信号表明数据已经准备完成。

       综合以上三方面的信息,我们就构造了一个粗糙的“任务描述”,以及任务被处理的流程。

  •           进程

          进程就是“任务”的计算机表述。A process is the  operating system's abstraction for a running program.(进程是操作系统对运行程序的抽象——引自wikipedia)

       以输出hello world这个程序为例。当源代码被编译成机器码之后,储存在硬盘上。当我们运行时候,机器码被加载到内存,操作系统会创建一个进程。如果hello, world这个进程(称之为A)被执行,那么在A被CPU处理之前,OS会将当前正在执行的进程(称之为B)的PC(程序计数器),register file(寄存器堆)等等的信息保存起来(OS的栈),同时,将A执行所需要的信息加载到PC,register file etc。这样的一个过程叫做context switching(上下文切换,PS本人感觉就是字面意思,内容切换——相对于CPU而言的)。之后,A进程占用CPU,完成输出。OS会把B的运行信息加载到CPU中继续运行(context switching的目的就是在后续时间点上,恢复被中断的进程的执行)。

     对于熟悉了微软系统的人来讲,当你打开任务管理器(taskmgr.exe)在进程那个选项卡下的就是一个一个的进程了。

     当然了,进程涉及的内容太多了,这里不再详述。有兴趣的人士请移步wikipedia。

    PS:对电路级别上,context switching是如何发生的呢?

  •      线程

       如要说起线程,就不得不提起多任务(multitasking)。多任务是指在一个peirod,有多个processes在运行。具体点讲,就是打开迅雷让它自己下载未下载完成的电影,然后又去上知乎了。多任务极大的提高了计算机的任务吞吐量,为什么呢?

        对于任意一个程序而言,大致涉及以下功能模块:1)输入模块 2)数据处理模块 3)输出模块。而这三种模块在程序中出现的次序并不是严格的按照“输入——处理——输出”顺序出现的,也就是说,在CPU处理某些数据的时候,让输入设备获取即将使用到的数据;或者,在数据送至输出设备显示的过程中,让CPU继续处理部分数据,岂不是节省时间。

       程序猿们试图将应用编写成一组processes的集合。集合中有负责输入的,有负责处理数据的以及输出的,以期加快程序运行速度。(PS:这里的process不是上文中的进程,而是一般意义上的过程

       但是问题来了:负责输入的与负责数据处理的两个processes之间如何进行数据交换呢?一个好的方法就是让它们相互之间能看到对方使用的数据。这就是thread的背后的思想。

       Threads are born from the idea that the most efficient way for cooperating processes to exchange data would be to share their entire memory space.(引自wikipedia)线程根植于“相互协作的过程之间交换数据的最有效的方式是共享它们整个的主存空间”思想。

     PS:对于日常所说的  “服务器进程创建了多个线程”该如何理解呢?这样的线程可以被用户利用获取非法信息吗?

  •       并行与并发(以uniprocessor为例)

      理解并发,就要结合时间尺度上的period。为理解简便起见,以生活中的一个小事做类比:假设一小时后,将有个客人到你家。现在呢,你没热水,杯子没刷、沙发和茶几好乱。为了让客人在做客过程中感到舒服,你要完成烧水,刷杯子,整理沙发和茶几。

      相信你一定首先烧上水,然后,去刷杯子,整理沙发和茶几。你必定想到:等沙发和茶几整理好的时候,水也就烧开了。

      你绝对不会打开煤气灶之后,就啥也不干了,站在那里傻等着水烧开,再去刷杯子。。。。。。

      为明显起见,将烧水这个process拆分为两个阶段:水开前和水开后。

       在这里你就是CPU,烧水、刷杯子、整理沙发和整理茶几都是process(这里的烧水是指,你向水壶中添水,打开煤气阀门,打火以及关火,将热水倒入保温壶中这些需要你参与的动作)。显然,任意两个processes之间不能在同一个瞬间进行,除非你有个副本。

       因此,对于一个小时这样的一个period,对你而言,这四个processes就是并发的,因为它们都在这一小时内开始并结束!!

       而实际上,把这个period再细分(时间粒度变小)你是如何做的呢,你是按照“烧水——刷杯子——整理沙发——整理茶几”的顺序,一个接一个的运行每个process显然,这里面既没有并发,也没有并行。

       好了,现在我们假设,在你开始烧水之前,有个天使出现了,并且假设他仅能看到非生物。

       他看到,在烧水这个process正在进行的时候(热水未倒入保温壶之前,烧水未完成),你完成了刷杯子、整理沙发和茶几这三个processes

       那么在天使看来,烧水这个process和刷杯子等三个processes并行的,因为在每个瞬间,天使看到烧水这个process在进行(水温度慢慢上升,距离热水倒入保温壶越来越近)的同时,要么杯子正在变得干净,要么茶几或沙发正在变得条理干净。


       这里天使的感觉,跟我们这些使用电脑和学电脑的人的感觉一样的。

      那个刷杯子又整理沙发的“你”就是CPU了。

      

     关键的时候到了——那么到底是并行还是并发,还是二者皆不是呢?

    并发的过程必然存在如下的情况之一:

        a)  有某个process在一个更小的时间尺度上再等待其他process让出执行单元。

        b)  执行单元在一个更小的时间尺度上是空转的,前一个process完成了,下一个process还没准备好。

    在指令执行尺度上,就CPU的构成部件而言,并行是不存在的。天使所看到的,本质上是多个processes串行执行,在粗粒度时间尺度上,CPU这个整体给人的假象!!

PS:指令执行可以划分为:取指令、分析指令和执行指令三个小过程。这样一个过程称之为指令周期。就分析指令这个部件而言,不存在这个部件在同一时刻分析两个指令的情况。

      但是呢,从CPU外看,有多个指令正在执行,因为A指令进入分析指令阶段的时候,可以去取B指令了。


PS:写的太粗糙了,总之以上就是我在浏览了多处内容后,自己的理解了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值