前言
该系列为并发编程,在几乎所有的编程语言中,并发始终是绕不开的坎,可以说学习一门编程语言,学好了并发就说明这门语言你学的还可以.所以接下来就让我们好好看看 python 的并发是怎么实现的吧.
在学习并发之前,有必要学习一下计算机操作系统发展史,因为可以实现并发可操作系统的发展是分不开的.
操作系统发展史
操作系统的发展史在某种意义上来说也是计算机的发展史.操作系统提供对硬件控制的调用和应用程序所必需的功能.
背景
早期的计算机没有操作系统.只有单独的机器,操作者会带着记录有程序和数据的卡片或较后期的打孔纸带去操作机器.程序读入机器后,机器就开始工作直到程序停止.由于程序难免有误,所以机器通常都会中途崩溃.程序一般通过控制板的开关和状态灯来调试.
后来,机器引入帮助程序输入输出等工作的代码库.这是现代操作系统的起源.然而,机器每次只能执行一个任务.在英国剑桥大学,这些任务的磁从前是排成一排挂在衣钩上的,衣钩的颜色代表任务的优先级.
概念意义上的操作系统和通俗意义上的操作系统差距越来越大.通俗意义上的操作系统为了方便而把最普通的包和应用程序的集合包括在操作系统内.随着操作系统的发展,一些功能更强的'第二类'操作系统软件也被包括进去.在今天,没有图形界面和各种文件浏览器已经不能称之为一个真正的通俗意义上的操作系统,但事实上,运行在数据中心和服务器等领域的操作系统往往是没有图形界面的.
第一代计算机(1940~1955):真空管和穿孔卡片
第一代之前人类是想用机械取代人力,第一代计算机的产生是计算机由机械时代进入电子时代的标志,从Babbage失败之后一直到第二次世界大战,数字计算机的建造几乎没有什么进展,第二次世界大战刺激了有关计算机研究的爆炸性进展。
lowa州立大学的john Atanasoff教授和他的学生Clifford Berry建造了据认为是第一台可工作的数字计算机。该机器使用300个真空管。大约在同时,Konrad Zuse在柏林用继电器构建了Z3计算机,英格兰布莱切利园的一个小组在1944年构建了Colossus,Howard Aiken在哈佛大学建造了Mark 1,宾夕法尼亚大学的William Mauchley和他的学生J.Presper Eckert建造了ENIAC。这些机器有的是二进制的,有的使用真空管,有的是可编程的,但都非常原始,设置需要花费数秒钟时间才能完成最简单的运算。
在这个时期,同一个小组里的工程师们,设计、建造、编程、操作及维护同一台机器,所有的程序设计是用纯粹的机器语言编写的,甚至更糟糕,需要通过成千上万根电缆接到插件板上连成电路来控制机器的基本功能。没有程序设计语言(汇编也没有),操作系统则是从来都没听说过。
第二代计算机(1955~1965):晶体管和批处理系统
由于当时的计算机非常昂贵,自认很自然的想办法减少计算机运行时间的浪费.通常采用的就是批处理系统.
特点:设计人员、生产人员、操作人员、程序人员和维护人员直接有了明确的分工,计算机被锁在专用空调房间中,由专业操作人员运行,这便是‘大型机’,有了操作系统的概念.
有了程序设计语言:FORTRAN语言或汇编语言,写到纸上,然后穿孔打成卡片,再讲卡片盒带到输入室,交给操作员,然后喝着咖啡等待输出接口.
工作过程:
第二代计算机解决了第一代计算机的一些问题:
- 把一个人的输入改为批量输入;
- 然后顺序计算(这个仍然有问题);
- 把一个人的输出改为批量输出.
优点:因为是批处理系统,节省了计算机的使用时间,增加的计算机的使用效率;
缺点:
- 整个流程需要人参与控制,将磁带搬来搬去;
- 计算的过程仍然是顺序计算->串行;
- 程序员原来独享一段时间的计算机,现在必须被统一规划到一批作业中,等待结果和重新调试的过程都需要等同批次的其他程序都运行完才可以接着使用.
第三代计算机(1965~1980):集成电路芯片和多道程序设计
在第三道计算机的操作系统广泛的应用了第二代计算机的操作系统没有的关键技术:多道技术.
多道程序设计技术就是指允许多个程序同时进入内存并运行.即同时把多个程序放入内存,并允许他们交替在 CPU 中运行,它们共享系统中的各种硬,软件资源.当一道程序因 I/O 请求而暂停运行时, CPU 便立即转去运行另一道程序.
多道技术:
多道技术中的多道指的是多个程序,多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(比如 CPU)的有序调度问题,解决方式即多路复用,多路复用分为时间和空间的复用.
空间复用:
将内存分为几部分,每个部分放入一个程序,这样,同一时间内内存中就有了多道程序.
时间复用:
当一个程序在等待 I/O 时,另一个程序可以使用 CPU, 如果内存中可以同时存放足够多的任务,则 CPU 的利用率可以接近100%.操作系统采用了多道技术后,可以控制进程的切换,或者说进程之间去争抢CPU 的执行权限.这种切换不仅会在一个进程遇到 I/O 时进行,一个进程占用 CPU 时间过长也会切换,或者说被操作系统夺走 CPU 的执行权限.
详解:
现代计算机或者网络都是支持多用户登录的,多个用户不仅共享硬件,而且共享文件,数据库等信息,共享意味着会发生冲突和运行无序.
操作系统的主要作用为:
- 记录哪个程序使用什么资源;
- 对资源请求进行分配;
- 为不同的程序和用户调解互相冲突的资源请求.
我们将上述操作系统的功能总结为:处理来自多个程序发起的多个(多个即多路)共享(共享即复用)资源的请求,简称多路复用.
在空间复用上的问题为:程序之间的内存必须隔离,这种隔离需要在硬件层面上实现,由操作系统控制.如果内存彼此不分割,则一个程序可以访问另外一个程序的内存,这样一来就会产生应用程序的数据不安全,比如你的 qq 程序可以访问操作系统的内存,这意味着 qq 可以拿到操作系统的所有权限.其次丧失的是稳定性,某个程序崩溃时有可能把其他的程序的内存一起回收了,比如说把操作系统的内存回收,则操作系统崩溃.
第四代计算机(1980~):个人计算机时代
微型处理器的发展使计算机的应用普及至中小企业及个人爱好者。而计算机的普及又推动了硬件组件公共接口的发展(如S-100,SS-50,Apple II,ISA和PCI总线),并逐渐地要求有一种“标准”的操作系统去控制它们。在这些早期的计算机中,主要的操作系统是8080/8085/Z-80 CPU用的CP/M-80,它创建在数字研究公司(Digital Research)先前几个针对PDP-11架构的操作系统的基础上。在此基础上又产生了MS-DOS(或IBM公司的PC-DOS)。这些计算机在ROM(只读存储器)都有一个小小的启动程序,可以把操作系统从磁盘装载到内存。IBM-PC系列的BIOS是这一思想的延伸。自1981年第一台IBM-PC诞生以来,BIOS的功能得到不断地增强。
随着显示设备和处理器成本的降低,很多操作系统都开始提供图形用户界面。如:许多UNIX提供的X Window一类的系统、微软的Windows系统、苹果公司的Mac OS和IBM公司的OS/2等。最初的图形用户界面是由Xerox Palo Alto研究中心70年代初期研发出来的,之后被许多公司模仿,继承发展。
操作系统的作用
- 隐藏了复杂的硬件调用接口,为应用程序员调用硬件资源提供更好,更简单,更清晰的模型.应用程序员有了这些接口后,就可以不用考虑操作硬件的细节,专心写代码即可;
- 将应用程序对硬件资源的竞争请求变得有序.
多道技术
在之前第三代计算机的时候产生了多道技术,可以更高效率的使用计算机的资源.产生背景为:那时候的计算机都是单核,为了能够同一时间运行多个程序产生了多道技术.
多道技术的产生直接影响了计算机的发展方向,多道技术出现后,单核可以实现并发工作了.