进程和线程

226 阅读3分钟

今天偶然的机会被问到:如果我是一个非计算机专业的小白,你如何用小白的话讲下什么是进程、什么是线程?

刚好《半小时漫画计算机》中的《两个程序的进化旅程》有讲到,又翻出了书理解了一遍

批处理

  • 很久以前,有两个程序,暂且称他们为小狗小猫
  • 小狗和小猫者两个程序都有很长的代码,他们都会在CPU上执行,读写硬盘内存,把运行结果告诉人类。
  • 可由于CPU是稀缺资源,只有一个,他们俩就需要排队,轮流使用
  • 人类把这个处理方式叫做批处理

341648137532_.pic.jpg

进程

  • 直到后来,CPU变得越来越快,居然比内存还要快几百倍!比硬盘快几百万倍!!!

  • 在这样的情况下,某一天小狗在CPU上执行的时候,遇到了从硬盘读取数据的指令,于是小狗就占用着CPU等待数据返回

  • 此时小猫提出:小狗,你一直霸占着CPU又不使用,多浪费。不如你下来,让我用呗

  • 小狗(占用CPU)说:不行啊,我一撤出CPU,所有东西都会丢失!再进来的时候就不知道执行到哪一行指令了,还有CPU寄存器中的数据,打开了什么文件等...我就没法回到原来的地方执行了

  • 此时操作系统跳出来说:这有何难,在你退出CPU之前,我把你说的这些东西都保存在一个地方,再次进入CPU的时候恢复一下就好了不是吗

  • 从此以后,小狗和小猫不仅仅是简单的程序代码了,还包括运行代码所需的“上下文”,这就是“进程”,操作系统为每个进程都建立了一个数据结构:进程控制块(PCB)

351648138838_.pic.jpg

  • 作为进程不能长时间占据CPU,一个进程只能在CPU上执行一小会,然后立马切换到别的进程去执行

361648139457_.pic.jpg

小狗和小猫不以为然,不就是执行一会,歇一会,然后继续执行吗?他们不知道的是,由于CPU运行速度非常快,不断切换的过程中,在人类那缓慢的世界看来,小狗和小猫好像同时执行一样,这就是并发

线程

  • 没过多久,小狗这个程序进化出了界面,还能访问网络,每当联网的时候(这也是非常耗时的操作)就会把CPU让给小猫

  • 当小猫结束调用,回到小狗,小狗的资源还是没有下载完成,还是什么都做不了。这个时候在人类看来,界面根本无法操作,出现了“假死”

  • 这样的情况是内部只有一个执行的流程,如果流程中有非常耗时的操作就等待,出现假死现象

  • 如果此时内部搞了两个执行流程(线程),一个用来读写硬盘(Tread1),另外一个用来处理界面操作(Tread2)

  • 然后和操作系统商量好,如果Thread1在读写硬盘,就可以调度我的Tread2来执行,这样界面至少不会出现“假死”

  • 于是:一个进程中至少有一个执行的流程(主线程),也可以开启新的执行流程(线程)

线程变成了最小的调度单位,进程反而变成了一个容器,也就是资源分配的最小单位

另外:线程调度共享的内容,还会面临的问题,这个不在今天的讨论范围之内

并行、并发的区别

  • 并发:上面有说到,两个进程之间不停的切换(任务执行没有发生在同一时刻,同一时刻),完成了两个任务,就并发
  • 并行:多个事件在同一时刻发生,在多个CUP中同时执行