Fork me on GitHub

进程对象

本文是Python通用编程系列教程,已全部更新完成,实现的目标是从零基础开始到精通Python编程语言。本教程不是对Python的内容进行泛泛而谈,而是精细化,深入化的讲解,共5个阶段,25章内容。所以,需要有耐心的学习,才能真正有所收获。虽不涉及任何框架的使用,但是会对操作系统和网络通信进行全局的讲解,甚至会对一些开源模块和服务器进行重写。学完之后,你所收获的不仅仅是精通一门Python编程语言,而且具备快速学习其他编程语言的能力,无障碍阅读所有Python源码的能力和对计算机与网络的全面认识。对于零基础的小白来说,是入门计算机领域并精通一门编程语言的绝佳教材。对于有一定Python基础的童鞋,相信这套教程会让你的水平更上一层楼。

一 初识并发编程

1. 我想对你说

通过上一阶段的学习相信你已经清楚了并发和并行的概念,那么我们为了让服务端服务于更多的客户端就要使服务端并发,如何实现并发呢?这就是我们接下来要讲解的内容:并发编程。
并发编程首先我们要讲解的是一些理论:操作系统的发展史,不要以为是历史就不重要,操作系统的发展史直接决定了后面学习并发编程的好坏,因为进程的概念起源于操作系统。可能有一部分同学以前就知道并发编程,也大概会用一些,那么我告诉你:忘记吧!

并发编程的真正难度不是难在写代码上面,而是难在理解上面,因为这里面全都是抽象的东西

2. 进程的理解

一提到并发编程,大家可能多多少少会有了解,用多进程和多线程来解决并发编程的问题,我们首先介绍的是多进程,在学习多进程之前我们应该先清楚进程的概念。
什么是进程?
根据字面意思理解,进程就是:一个正在进程的程序,指的就是一个程序的运行过程,很明显这是一个抽象的概念,是一个状态。为了对比,我们也思考一下,程序的概念。
什么是程序?
程序就是一堆代码,或者说是一堆文件。
什么叫起了一个进程?

你下载了一个软件叫做 QQ,这就是一个程序
你运行这个 QQ 和别人的女朋友聊天,这就叫做起了一个 QQ 进程
你正在运行这个 QQ ,这个 QQ 整个的运行过程叫做一个进程

为了使进程的概念更加形象,Windows系统的用户可以使用按键盘的【Ctrl+Alt+Del】组合键打开任务管理器,当然也可以使用按键盘的【Windows键+R键】,输入框内输入taskmgr.exe并回车打开任务管理器,对于MacOS系统的用户可以使用【command键+空格键】,输入活动监视器并回车打开活动监视器。如下图所示,以下以MacOS系统为例进行说明。

当我关掉网易有道词典之后,这个进程就不存在了,如下图所示

综上所述,我们可以得出一个结论:进程是一个抽象的概念。这个概念起源于操作系统,因为你电脑上面运行的程序和你自己写的 SharedNetworkDisk 程序都是要让操作系统来执行这个工作(第一章内容回顾:写程序是为了让机器取代人力,让机器无休止地为你工作,你还不给他工资),操作系统最后还是要给你的机器上面的硬件来进行具体的执行任务,这个硬件的核心也就是计算机的CPU。你写的程序不能直接操作硬件,需要调用操作系统控制硬件的接口,也就是向操作系统发请求,由操作系统控制CPU来运行你写的程序。

# 一个程序的执行过程
1 最开始程序就是一个文件,他是放在硬盘里面的
2 当我启动这个程序的时候,就是把这个程序从硬盘读入内存,目的是为了让CPU从内存直接处理这个程序
3 但是应用程序并不能直接调用硬件,而是先把指令发给操作系统
4 由操作系统调用CPU执行这个程序

所以执行程序的过程其实是由操作系统的调度来完成的,那么也就可以理解为进程是由操作系统控制的。

二 操作系统

1. 操作系统简介

通过上面的图你可以看到:一个操作系统,要执行的进程肯定不只有一个, 我们先暂且说他要执行的进程是20个,但是硬件只有一个或者说只有一套,有这么多进程要执行,肯定是不能让这些进程自己去抢的,所以必须要分配一下任务,那么这个分配任务的工作一定是由操作系统来完成的。那么接下来我们就要把操作系统的工作原理搞明白。
什么是操作系统?

操作系统是位于计算机硬件与应用软件之间的,用于协调,管理和控制计算机硬件与软件资源的一种控制程序

操作系统的两大作用

1 把复杂丑陋的硬件操作都封装成美丽的接口,提供给应用程序使用
     说明:
    (1)假如没有操作系统,你要写程序要先研究计算机的CPU,内存,硬盘和网卡等等一系列硬件
        的工作原理,等你研究明白了,程序也没必要写了,因为公司已经倒闭了
    (2)既然每个程序员写程序都要控制硬件,那么为了提升开发效率,最好是有人专门写好这一系
        列的调用硬件的接口,写应用软件的程序员直接调用这一系列接口就可以了
    (3)至此,操作系统诞生,其实这个思想也就是我们从第二阶段的项目就开始涉猎的程序架构设计
        的思想,不要把所有的功能全部揉到一起而要分层去实现。
    (4)应用软件其实就是在调用操作系统提供的接口,比如操作硬盘的接口就是你以前学过的文件操作,
        操作网卡的接口就是你以前学过的网络编程。这些其实都是面向对象的思想之一,叫做封装。
2 把进程对硬件的竞争变得有序化
     说明:
    (1)应用程序写好了需要运行,那么也就是在操作系统上起一个进程,操作系统上面肯定有多个进
        程,如果不加以控制,就会出现以下错乱的情况
    (2)当需要打印的时候,你的 Word 程序和 Excel 程序都执行打印操作,计算机打印了一行Word
        文件,又打印了一行Excel文件,最终你的打印结果就乱了
    (3)比如说,我现在有一块蛋糕,我不切开分成块,整个蛋糕让你们大家一块吃,那么你就有可能
        咬到别人女朋友的舌头,这就尴尬了。
    (4)共享带来的问题就是竞争,竞争带来的问题就是错乱

2. 操作系统发展史

(1) 第一代计算机(1940~1955):真空管和穿孔卡片

介绍操作系统的发展史也就是整个进程的发展史,你知道了进程是怎么由来的,
在以后使用过程中自然也会得心应手,最后达到的目标是:你写的每一行代码,
你自己都清楚他背后是经历了哪些操作。

我们所介绍的操作系统的发展史是从人类进入电的时代开始的,这整个的发展过程其实也就是人类懒的过程,从最开始的算盘一直到现在的我们使用的计算机,如需了解更多历史,可点击链接 计算机硬件历史 访问。
产生背景
第一代之前人类是想用机械取代人力,第一代计算机的产生是计算机由机械时代进入电子时代的标志,从Babbage失败之后一直到第二次世界大战,数字计算机的建造几乎没有什么进展,第二次世界大战刺激了有关计算机研究的爆炸性进展。lowa州立大学的john Atanasoff教授和他的学生Clifford Berry建造了据认为是第一台可工作的数字计算机。该机器使用300个真空管。大约在同时,Konrad Zuse在柏林用继电器构建了Z3计算机,英格兰布莱切利园的一个小组在1944年构建了Colossus,Howard Aiken在哈佛大学建造了Mark 1,宾夕法尼亚大学的William Mauchley和他的学生J.Presper Eckert建造了ENIAC。这些机器有的是二进制的,有的使用真空管,有的是可编程的,但都非常原始,设置需要花费数秒钟时间才能完成最简单的运算。在这个时期,同一个小组里的工程师们,设计、建造、编程、操作及维护同一台机器,所有的程序设计是用纯粹的机器语言编写的,甚至更糟糕,需要通过成千上万根电缆接到插件板上连成电路来控制机器的基本功能。没有程序设计语言(汇编也没有),操作系统则是从来都没听说过。
使用说明
早期的计算机非常笨重,需要单独一个屋子才能装得下,尽管如此,并影响它的宝贵,也只有站在科学最前沿的科学家才有机会使用,那个时代的计算机没有操作系统,有的甚至连010101这个东西都没有,真的是要跑到你计算机机房从硬件到连线到编程都要会才可以写程序。所以说:那么时代的计算机科学家那真的是科学家,真的是牛人,一般人根本做不了,你真的应该感谢和谐社会救了你,你都会写程序了。正因为这些伟大的前辈的钻研精神,才带来了技术的高速发展,可你能想象到他们以前是怎么样工作的吗?
由于计算机的稀缺,使用计算机需要排队预约,到了自己上机的时候,也许只有两个小时是属于自己的,需要事先把自己的程序刻到插线板这么一个硬件上,然后自己连接到计算机的各个组件,最后跑一跑自己写的程序。由于计算机当时的硬件非常简陋,叫做真空管,一台计算机的真空管大概是2万多个,他在运行程序的过程中一定要保证这两万多个真空管一个都不要烧毁,而真空管的特性就是极容易烧毁,所以他运行程序的时候烧毁了就要停下来把真空管换一下,再重新运行程序。所以,在早期写程序是非常非常麻烦的一件事。

  • 特点:没有操作系统的概念,所有的程序设计都是直接操控硬件。
  • 优点:每个程序员独享,可以自己调试代码,找到bug。
  • 缺点:浪费计算机资源,同一时间段内只有一个人使用。

注意:同一时刻只有一个程序在内存中被CPU调用执行,那么程序只能是一个一个执行,这种工作方式叫做串行。

(2) 第二代计算机(1955~1965):晶体管和批处理系统

产生背景
由于当时的计算机非常昂贵,人们使用计算机的时间也很宝贵,所以很自然的想办法减少使用计算机过程中产生的时间的浪费,所采用的方法就是批处理系统,这也就是操作系统的前身。
主要区别:
主要区别其实最后还是要体现在工作过程上面,第二代计算机运行程序它的计算机硬件分成了三台和两大类机器,三台机器分别是 1401,7094,1401,两大类机器指的是 1401机和 7094机,这些数字指的是计算机的型号。需要运行程序时,程序员不需要到机房去了, 之前写程序是写到插线板上,后来出现了穿孔卡片,程序员可以将程序写到穿孔卡片上, 穿孔卡片的思路其实是起源于中国的提花纺织机,提花纺织机是一种提花设备,能在织物上织出花纹的织机,提花纺织机是在1971年长沙马王堆汉墓出土的。提花纺织机的工作原理是依赖于机器上的图案模型,在这一点上和穿孔卡片类似,都是人们用固定的形状来控制机器运行的轨迹。所以程序员每次写程序都是在穿孔卡片上打好孔,那么这些孔就对应着程序二进制的概念。


程序运行过程:
运行程序的时候程序员就把自己写好的卡片放到前面的 1401 机的读卡机中,这时程序并不是立即运行, 读卡机不是读一张卡片,冰糖葫芦也不是只放一颗山楂,把所有人的程序都插入到读卡机中,把程序攒在一起,攒满了就会读到磁带机上,最后的产物就是一卷磁带,接下来中间这个小姑娘就会手动把磁带取下来并放入到 7094机上运行这一堆程序,但是在读取这些程序员写的一堆程序之前,这个小姑娘会先在 7094 机上读一卷系统磁带,这也就是体现出了操作系统的概念。其实这个 7094机器和我们现代的计算机的原理也是非常类似的,也有硬盘,内存和CPU,磁带就相当于硬盘,他先把系统磁带读入到这台机器的内存中去,然后CPU就可以运行了,这也就是一个操作系统先运行起来了。这个操作系统叫做批处理操作系统,接下来计算机的工作就是把应用程序的磁带里面的程序一道一道地读入到内存,注意:是一道一道的,每次只读一道,这一道程序读完之后他就会把结果传送给输出磁带,然后再度下一道程序。直到把输出结果攒一大波,最后这个小姑娘会把这个满了的输出磁带取下来并放到后面的1401机进行脱机打印。这个过程有点像串冰糖葫芦和吃冰糖葫,最后是吐出来冰糖葫芦里面的山楂核放到垃圾桶,最后倒掉垃圾桶里面的垃圾。串冰糖葫芦的时候你要攒一串冰糖葫芦串起来,吃的时候你是一颗一颗的从上往下吃,吐核的时候你要攒一桶的垃圾一块扔,你可以自己想象这个画面。

  • 特点:把代码都攒到一块,让一个CPU去执行,但是还是一个一个的去运行,还是顺序算法(串行)
  • 优点:批处理,节省了计算机使用时间。
  • 缺点:有人的参与进来了,搬过来搬过去的麻烦,拖慢程序运行的速度

与第一代相比它的区别:

  • 从真空管到晶体管,首先硬件会有一种革新
  • 其次设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这就是我们可能听过的“大型机”
  • 有了操作系统的概念
  • 有了程序设计语言:FORTRAN语言或汇编语言,写到纸上,然后穿孔打成卡片,再将卡片盒带到输入室,交给操作员,然后喝着咖啡等待输出结果。

对于程序员来说,计算机的资源不是独享的,拿到结果出了bug可以立即处理,但是要想再次运行还需要把程序攒一大波,这也就是造成了程序员无法对程序进行即时的调试。对于操作系统来说,第一点:基本可以实现半自动的程序批量处理,但是中间有人的参与,是肯定会极大降低程序执行效率,第二点:依然没有解决并发执行程序的问题,程序的执行依然是串行的。

(3) 第三代计算机(1965~1980):集成电路芯片和多道程序设计

产生背景
基于第二代计算机,我们可以看出来 1041机 主要是做的 读和写的操作,也就是我们常说的 IO操作(I是小写字母i的大写形式,指的是input输入,O指的是output输出,IO操作除了我们直接了解到的输入输出,还有time.sleep模拟的IO操作,还有基于网络通信数据传输的网络IO,我们手机上运行着的软件,基本上大部分时间都是在做网络IO),7094机 主要是用于计算操作,现代的计算机也是这两个工作:IO和计算。对于一个生产厂商来说,同时维持两条生产线,而这两条生产线其实是为了造出同一套产品, 这样的话成本是相对比较高的,那么就不如将这两个生产线合并成一条,把这量个生产线的产品集成到一块去,生产出来的机器既有计算功能又有IO功能,这也就是现代计算的由来。这个计算机生产厂商就是IBM公司,你要了解计算机硬件的发展史就去了解IBM公司的发展史。
20世纪60年代初期,大多数计算机厂商都有两条完全不兼容的生产线。一条是大型的科学计算机,如IBM 7094,见上图,主要用于科学计算和工程计算,另外一条是商用计算机,如IBM 1401,见上图,主要用于银行和保险公司从事磁带归档和打印服务。IBM公司试图通过引入system/360系列(这个系列就是现代服务器的前身,所以高端服务器都是IBM公司生产的)来同时满足科学计算和商业计算,360系列低档机与1401相当,高档机比7094功能强很多,不同的性能卖不同的价格。360是第一个采用了(小规模)芯片(集成电路)的主流机型,与采用晶体管的第二代计算机相比,性价比有了很大的提高。这些计算机的后代仍在大型的计算机中心里使用,此乃现代服务器的前身,这些服务器每秒处理不小于千次的请求。
第三代计算如何解决第二代计算机人参与计算机工作的问题?
卡片被拿到机房后能够很快的将作业从卡片读入磁盘,于是任何时刻当一个作业结束时,操作系统就能将一个作业从磁带读出,装进空出来的内存区域运行,这种技术叫做SPOOLING技术,这个看似是一个英文单词其实是一个简写,全称是:Simultaneous Peripheral Operations On-Line,意思是:外部设备联机并行操作,指的是:它是关于慢速字符设备如何与计算机主机交换信息一种技术,通常称为“假脱机技术”。通俗的说就是:自动读入读出。当采用了这种技术后,就不在需要IBM1401机了,也不必将磁带搬来搬去了(那俩小姑娘就不再需要了)。
第三代计算机如何解决第二代计算机串行工作的问题?
早期的计算机一个CPU只有一个运算核心,这就是单核CPU,没有多核或者多CPU的概念,后来有了双核CPU就相当于两个CPU同时工作,现在普及的一般都是四核CPU,那就是相当于四个CPU在同时工作。
CPU就相当于是一个干活的人,假如你是一个CPU,那么你同一时间能干几个活?假如现在我同时给了你5个任务,首先确定的是你不可能实现并行,因为CPU只有一个核,但是有没有可能实现并发呢?并发也就是看起来好像是同时都在做,假如现在你要做的是以下这五个任务:

  1. 看书
  2. 打刺激战场
  3. 听歌
  4. 和别人的女朋友聊天
  5. 和别人的男朋友聊天

当你在做这几个任务的时候在这个任务之间来回的切换,那么看起来就好像是同时在做的一样。所以,接下来我们的核心思想就是需要一种技术能够让CPU在多个进程之间来回的切换,这个技术就是第三代计算机产生的一种技术:多道程序技术,简称多道技术。

3. 多道技术

多道技术导入

多道技术的产生背景是:想要在单核CPU的情况下实现多个进程并发执行的效果。

对于第二代计算机而言,所有的程序都是串行执行的,有几个任务要做,那么就一定要按照先后顺序,从前往后执行,直到第一个程序结束了,才会执行第二个程序。再假如如果没有多道技术的单核CPU的情况下,你的Python代码里面写了一个time.sleep(3),那么CPU就只能干巴巴看着等着,等你三秒,或者是你写的程序里面涉及到文件操作,那么不可避免的就会产生IO时间,CPU也是干巴巴看着,等着,其实这两个操作都不会占用CPU的资源,那么CPU在这个时候不工作就是CPU资源的浪费。比如你开了一个公司,公司就招了一个员工,你要求这个员工要给你炒菜,还要给你做饭,还要给你斟茶,假如在整个炒菜的过程中,这个人都不空闲着,那么他的利用率一定高, 假如这三个工作一直不停着,那么你就让他从前往后干这肯定没毛病,但是如果在做第一个工作的时候产生了停顿,那么这个利用率肯定就会降低了,最好是在做第一个工作的时候遇到等的过程就去做第二个任务,再次遇到等的过程就去做第三个任务,这样一遇到等待就来回地切换,就能提高它的工作效率。

思考题(考察小学三年以内的数学):
小明要执行三个任务,这个三个任务需要小明工作的时间和等待的时间分别是:
    任务一:3分钟,3分钟
    任务二:1分钟,5分钟
    任务三:2分钟,4分钟
问:小明最短多长时间能够执行完这个三个任务?
解析:
这是在小学就应该学过的知识,叫做:统筹方法。在多个任务之间遇到等待可以来回切换,由于切换的速度
非常快,切换的时间可以忽略不计,所以最后的答案是所有任务最长的时间

多道技术

1 空间上的复用(多道程序复用内存的空间)
     说明:
         (1)将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序
         (2)最后执行程序的是CPU,程序一定要要先由硬盘加载到内存CPU才能执行这个程序
         (3)我们为了实现并发的效果,一定要保证CPU在多个进程之间高速切换,所以不能从硬盘读数据
2 时间上的复用(多道程序复用CPU的时间片)
     说明:
         当一个程序在等待I/O时,另一个程序可以使用CPU,如果内存中可以同时存放足够多的作业,
         则cpu的利用率可以接近100%,类似于我们小学数学所学的统筹方法

时间上的复用上面说的是遇到 IO 操作就会切换,但是,多道技术并不是仅仅只遇到 IO 就会切换,也有可能3个进程都没有任何的 IO 操作,全是计算的任务,比如,我给计算机三个任务:1 计算1 +++加到1万亿,2 计算1乘乘乘到1万亿,3 计算1---减到1万亿,这三个进程都是纯计算的操作,这种情况下操作系统应该怎么处理?第一个任务计算的时间较长,我们不应该让一个进程占用CPU的时间过长,当他占用的时间过长了,即使没有IO操作也要切换,对于所有的进程来说应该是雨露均沾。遇到IO切换和占用时间过长切换,这个工作是由操作系统来控制的, 这个切换工作一定要快,如果要用代码实现的话其实也就是写一个流程控制程序,Python做不了,C语言也做不了,因为都不够快,要用汇编语言去实现,所以在操作系统里面就会有一段汇编语言写的调度程序,这个调度程序始终会监测着你的机器之上运行着的进程, 一旦某个进程运行时间过长了,操作系统会强行的把它的执行权限拿走给下一个进程,一个进程遇到IO操作了,当然操作系统也会立即把CPU执行权限拿走交给其他的进程。
很明显,遇到IO切换能够提高CPU的使用率,但是如果多个进程全部都是计算操作,其中任何一个进程都没有遇到IO,操作系统也强行地把它的CPU执行权限拿走,这样虽然能够实现并发的效果,但是并不能提升CPU的效率,相反,加上进程切换的时间,一定会比原来消耗更多的时间,所以这种情况是:降低了效率,保证了并发的效果。
至此:
并发编程就算是入门了,接下来围绕程序的执行效率我们再来展开一下。

4. 程序的执行效率

假如现在你的机器上有 QQ进程,微信进程还有你自己写的 SharedNetworkDisk 进程,这三个进程在操作系统看来都是进程,CPU只有一个核(我们先研究单个CPU,研究明白了之后,多核CPU自然就明白了),那么怎么样就是你自己写的这个程序运行效率高了?一定是CPU更多的时间在运行你写的程序,你写的程序就更多的被处理了,也就是你写的程序执行效率高了,所以你应该尽可能的把CPU和你写的程序绑到一起去,CPU的分配是由操作系统来控制的, 要想占用CPU更多的时长,最直接最简单的解决方案就是尽可能减少你写的程序中的IO操作,所以,以后在写程序的时候就是要尽可能降低程序的IO操作。

5. 进程运行的三种状态

一个进程运行会有三种状态,这三种状态分别是运行态,阻塞态和就绪态。

正在被CPU运行的状态就是运行态,从运行态会切换到阻塞态和就绪态。就绪态就是时刻准备着被CPU运行,进程在运行中遇到IO操作不占用CPU了就会切换到阻塞态,要想重新被CPU运行就要先进入就绪状态才有可能拿到CPU的执行权限被运行。如果是从运行态直接切换到就绪态这是遇到什么问题呢?那么一定是CPU占用时间过长或者是有一个优先级比当前进程更高的进程把CPU抢走了(这种情况后面有讲解),由运行态切换到就绪态这是不可避免的, 但是你可以做到尽可能的减少阻塞状态,这也就意味着进程最大限度的切换到了就绪态, 对于操作系统来说,就绪态是一个时刻准备好的状态,那么他就会尽可能多的去分配CPU的执行权限。所以,再重复一遍:提成程序的执行效率,就是尽可能降低IO操作。
关于串行和阻塞这里需要注意一点:串行执行也有可能会遇到一个进程等待另外一个进程的情况,但是这种等待与阻塞是没有任何关系的。

5. 多道技术补充

第三代计算机产生多道技术非常早,几乎是集成电路芯片一出来,多道技术立马就出来了,有了多道技术之后虽然可以解决第二代计算机的串行的问题,但是并没有立即投入使用,这主要基于两点原因。
第一点:稳定性
这是因为多道技术针对空间上的复用把多道程序同时读入内存中,那么着多个进程就算是起来了,那么这些进程什么时候算死掉呢?就是清理资源,把这个进程占用的内存资源清理掉,假设内存空间是共享的,多个进程都在内存中,彼此之间没有一种互相隔离的概念,一个进程使用这块空间,另外一个进程等会可能也要使用这块空间,那么就有可能产生这种情况:你的系统之上:有QQ,微信和SharedNetworkDisk三个进程,当你想把QQ这个进程清理掉的时候,就有可能把微信的进程也清理了,那么微信这个进程就崩溃了,微信进程崩溃了之后紧接着就要清理微信这个进程,就有可能顺便把SND这个进程给清理了,也有可能把操作系统的进程给清理了,那么你的机器就直接瘫痪了。
第二点:安全性
如果内存级别没有隔离,当你的 QQ 进程和操作系统的进程都在内存中,那就意味着通过QQ能够看到操作系统的数据,你的电脑开机的时候需要输入账号密码,这是由操作系统控制的认证机制,也就是说整个硬件的权限是由操作系统来管理的, 一旦你的QQ被黑客攻破了,那么就有可能黑客沿着你的QQ就能看到你的操作系统存的数据,那么你的电脑的整个安全性就丧失了。
其实这两个问题都是由一个问题导致的,就是多道程序在内存中没有实现隔离,所以第三代计算机多道技术产生的比较早,却并没有立马投入使用,直到后面硬件级别实现了物理隔离。现在你清楚了,你起一个QQ进程在内存空间和操作系统占用的内存空间完全隔离开,而且这种隔离是一个物理层面的隔离。

6. 分时操作系统

第三代计算机有了多道技术之后,就产生了一个操作系统叫做:分时操作系统。在此之前,第三代计算机的操作系统仍然是批处理系统。许多老程序员怀念第一代独享的计算机,可以即时调试自己的程序。为了满足程序员们很快可以得到响应,出现了分时操作系统。
CTTS:麻省理工(MIT)在一台改装过的7094机上开发成功的,CTSS兼容分时系统(最初只能支持20个终端设备)第三代计算机广泛采用了必须的保护硬件(进程之间的内存彼此隔离)之后,分时系统才开始流行。MIT,贝尔实验室和通用电气在CTTS成功研制后决定开发能够同时支持上百终端的MULTICS(其设计者着眼于建造满足波士顿地区所有用户计算需求的一台机器),很明显真是要上天啊,最后摔死了。后来一位参加过MULTICS研制的贝尔实验室计算机科学家Ken Thompson开发了一个简易的,单用户版本的MULTICS,这就是后来的UNIX系统。基于它衍生了很多其他的Unix版本,为了使程序能在任何版本的unix上运行,IEEE提出了一个unix标准,即posix(可移植的操作系统接口Portable Operating System Interface)后来,在1987年,出现了一个UNIX的小型克隆,即minix,用于教学使用。芬兰学生Linus Torvalds基于它编写了大名鼎鼎的Linux系统第四代计算机(1980~至今):个人计算机
如何解决第二代计算机批处理系统的问题呢?

分时操作系统的诞生标志着计算机进入了一个新的时代

计算机硬件就一台,单核CPU一个,内存一个,硬盘一个,怎么能让多个人的到一台机器上运行呢?
给每个使用者都发一套联机设备,就像是一些网线,键盘和显示器等等一些设备连接到主机,每当有一个使用者连接到主机上,主机就会起一个进程。假如有20个使用者连接到主机上,他们的目的自然是运行自己写的程序,这些使用者其实就是相当于把自己写的程序放到了自己的进程中,CPU执行这个进程其实就是在执行程序的代码,然后再把结果返回到各自的联机设备上,这样就完美的解决了问题。基于多道技术,操作系统在不同的进程之间来回的切换,这样给用户感觉就是一个人在独享计算机的资源。但是如果这个20个人同时提交程序,CPU的执行其实就会明显的变慢了,这种情况也会随着同时提交程序的人数的增多而变得明显,但是这种情况的可能性很小,至此,你们大家也都是写过程序的人了,你大量的时间其实都是在写bug和改bug,这其实就给CPU在多个进程之间切换留下了充足的时间。

7. 总结

最后,我们使用一个例子,对今天的内容做一下总结,只要你理解了这个例子,并发编程就算是入门了。

在刺激战场这个游戏中,一般都是4V4,当然也有人艺高人胆大,选择1V4,不好意思,我就是啊,因为这样输了也不丢人。。。。。。
1 并发:第一局,我1V4开局,一下遇到4个敌人一队,没有障碍物,正面硬刚,我一定要在打这四个的时候来回切换,最后我凉了,下一盘;
2 并行:第二局,我4V4开局,我们一下遇到4个敌人一队,我们刚好4个人,每人对付一个,刚刚好,完胜!最后我们就吃鸡了,再来一盘;
3 串行:第三局,我1V4开局,在P城打巷战,遇到4个敌人一对,我身单力薄,只能秦王绕柱,把他们逐个击破,又胜!这局还没完
4 阻塞:紧接着,中远距离又遇到4个敌人一队,我AWM率先出击,移动打头,直接干倒一个,然后他就阻塞了,慢慢爬吧。。。
5 就绪:刚才打头击倒的那个兄弟,马上就要被队友救活了,等下我就要接着招呼他了,这局估计不好打。。。
6 运行:我的枪刚好打到哪位兄弟身上,他就是运行态,运行态的感觉怎么样啊,兄弟?
7 非阻塞:非阻塞就是在就绪态和运行态切换,我在中远距离一个人打对方4人,我轮换着打他们,却一个也打不死,我还是先进圈吧,这局未完待续。。。
posted @ 2019-04-09 18:25  马一特  阅读(147)  评论(0编辑  收藏  举报