分享

操作系统、驱动程序、进程之间的关系

 昵称11935121 2018-11-19

进程这个词语是操作系统为我们封装抽象出来的概念,且这个概念非常重要。

(如果不了解操作系统内核工作原理,很难真正意义上了解进程的本质,但还是可以用类比的方式解释一下)

最初的“计算机”,“程序”都是提前固定写好的,你只能干某件事情。

比如下图中的算盘:

操作系统、驱动程序、进程之间的关系

操作系统、驱动程序、进程之间的关系

操作系统、驱动程序、进程之间的关系

发明算盘的原因是什么?

社会发展,对数学的要求越来越高,超出了个人心算的能力,用算盘可以提高人类计算数字的能力和效率。

历史上,除了算盘,人类还发明过很多其他计算设备,比如:“星盘”,用来计算船在海上的纬度,计算尺等工具,日冕仪。

操作系统、驱动程序、进程之间的关系

操作系统、驱动程序、进程之间的关系

操作系统、驱动程序、进程之间的关系

人类历史上,发明创造的计算工具,很难统计有多少种。

算日出,算天体位置、算潮汐、或者纯粹拿来计时。

总之就一件事情:怎么样让人可以更省时间,更简单、更准确的完成计算所需要的工作,降低门槛。

每一样新工具的诞生,都会解放更多的生产力,所需要的劳动力也会越来越少,但这些工具还不能叫做“计算机”,只能叫做“辅助计算工具”。

随着工业革命的推进,人类掌握了机械技术,通过机械技术,又设计出了各种各样的“计算机”:

操作系统、驱动程序、进程之间的关系

让一个聪明的人,浪费时间每天算数,简直太浪费了,毕竟这是有规律,需要重复的工作。

聪明的人应该去干发明创造的人。

所以,人只要能简单口算一些简单的数字计算,足够应付日常生活就行了,复杂的计算应该丢给计算机完成。

让一个普通人,用一个计算器也能准确计算,没必要把数学家和物理学家的时间浪费到这里每天大量的算数工作上。

可是计算器从哪里来呢?指望天天放牛,种地的农民伯伯吗?也不现实。

农民伯伯的工作是让大家吃饱饭,所以还是得靠数学家和物理学家去想办法干这事情。

最基本的数学运算就是“加减乘除”了。

一代又一代的数学家和物理学家努力发明各种计算机,从最初的木头、机械、继电器、电子管、晶体管,集成电路……这里面不知道有多少人类中的聪明者,投入了大量的精力。

其中有一些“计算机”,甚至计算速度还没有人拿笔算的快,不要嘲笑科学家的努力。伟大的发明都是从一个大胆的想象开始。

在《计算机原理》系列视频课程中,这些心酸的事情,我给大伙分享了不少。

总之,这些“计算机”,都不是“通用计算机”,只能干“指定”的一些事情,比如计算人口,计算导弹轨迹、破解敌方加密通讯。

如果你想玩个“英雄联盟”和“吃鸡”,那是不可能的。

那个时候的“计算机”,连“显示器”都没有。

后来有个聪明人叫“冯诺.依曼”,他提出了一种思想,把计算机分成五大件:“运算器、控制器、存储器、输入设备、输出设备。”

操作系统、驱动程序、进程之间的关系

在《计算机原理》中,这五大块是怎么推导出来的,已经给大家用软件模拟演示过了。

我们回忆一下:把指令和数据放到存储器中,控制器(在脉冲信号的激励下)一条一条从存储器中获取指令,译码器(译码)执行,最后把结果输出。

输入设备和输出设备,在计算机历史上,已经发生过很多次改变,从最初的纸带,到今天的键盘、鼠标和显示器,打印机等。

(计算机存储器里面的1和0就可以抽象成两个概念:需要被计算的数据,如何计算这些数据。)也就是指令和数据

这样一来,就实现了“通用计算机”。

不管你是统计人口,计算导弹,模拟原子弹爆炸,计算国家税收,在一台机器上就可以完成。

世界上第一台通用电子计算机,那是很大很大滴。

操作系统、驱动程序、进程之间的关系

(这么占地方的大家伙,你如果在北京和上海买个房子放下它,那可得不吃不喝奋斗好多年啊。)

可是它的运算速度,还没有你今天花300块钱买的一部十八手智能手机计算速度快。

我突然想起了网上的一句笑话:“你的手机运算能力比阿波罗登月时NASA所有计算机运算能力的总和还要快。但NASA把人类发射到了月球,你却用来玩愤怒的小鸟。”

操作系统、驱动程序、进程之间的关系

当然啦,任何顶尖的高科技产品刚刚研究出来,最初往往是用到军事领域上,由政府投资买单研究(用来破解敌方的信息,算一下原子弹的爆炸威力,弹道轨迹等)

慢慢技术普及,成本降低,可以进行大批量生产的时候,普通老百姓才能享受到这东西。

大概在20世纪,40年代,50年代,通用计算机虽然有了,但每次计算机只能运行一个程序。

很多特别牛的人(他们都要用到计算机完成手里的计算工作)怎么办呢?

他们先写好一个程序,比如写到打孔纸带上。(牛不牛,那可是用二进制写代码)

操作系统、驱动程序、进程之间的关系

写完以后,还得向领导申请啊:“王院长,我要用一下计算机。”

王院长拿起电话(那个时候到底有没有电话啊?不要在意这些细节)问了一下计算科室的管理员:“电脑闲着吗?张科长要用计算机算下东西。”

操作系统、驱动程序、进程之间的关系

计算机管理员看了一下长长的队伍:“呀呀呀,都有好几个人排队呢,你等等吧。”

轮到谁的时候,谁就把自己写的程序交给电脑管理员,电脑管理员,看着这些二进制,一条一条的输入到计算机存储器中。

(当然这是为了方便大家理解,给大家讲故事呢,真实的情况是,牛人很忙,先把程序放下,等程序运行完毕,有了计算结果,电脑管理员再通知过来拿结果)

输入完程序以后,计算机管理员合上开关(启动工作),CPU的一些指令寄存器自动复位到固定的内存地址。

CPU就开始一条一条的从存储器里面获取指令和数据进行运算了。

(今天的计算机启动过程依然还是这个原理)

在《计算机原理》课程中,我给大伙设计了一台通用计算机。

(其实就是模拟演示这个过程的)

只不过,我们是直接把机器指令写到了存储器中,并且半自动一条一条执行指令。

而当时是,由计算机管理员,把其他人写好的程序,输入到存储器中,再合上一个开关,计算机自动获取执行一条一条指令,直到停机,说明运算结束了。

操作系统、驱动程序、进程之间的关系

那个时候的计算机,运行速度比较慢,一个程序往往可能几个小时,甚至几天,甚至几周,才能出结果。

(其实今天的超级计算机,也是这样的,普通人依然没机会使用。科学家使用也得经过申请。今天的超级计算机一小时的计算量比世界上第一台计算机一亿年的计算量还要多)

操作系统、驱动程序、进程之间的关系

(如:祖国的:天河二号、神威.太湖之光 日本:地球模拟器,富士通K 美国的:ASC Purple和Blue Gene/L)

但技术不会一直停歇不前,从继电器到电子管到晶体管到集成电路,计算机是占地面积和空间越来越小,速度是越来越快。

负责电脑的管理员,一天本来只需要输入2个程序,现在需要输入20个程序了,电脑管理员也是人啊,他也会累啊。

而且计算机速度越来越快,那么负责编程的人,肯定为了充分利用计算机的运行效率(榨干资源),程序也会越来越复杂。

所以,电脑管理员的工作越来越苦逼,因为二进制代码是变的越来越长,很繁琐的。

(其实那个时候,应该已经有了汇编语言,虽然可能跟我们在《汇编语言》课程中学习的汇编程序有所不同,但都是助记符)

(我更倾向于,大牛们用汇编语言在纸上写好程序,有专门的工作人员拿着一个翻译本,把汇编语言用打孔机打成纸带)

(最原始的“汇编器”,其实都是人工加机械半自动化完成)

操作系统、驱动程序、进程之间的关系

操作系统、驱动程序、进程之间的关系

怎么样让计算机能够自动把程序输入到计算机,自动执行。(听起来矛盾吗?)

就好比一个婴儿,不会吃饭,但会消化,爸爸妈妈负责喂他食物。

后来婴儿长大了,不仅会消化,还会自己把食物放进肚子里面。

于是,有个叫做“操作系统”的家伙诞生了。(Operating System:简称OS)

说起来轻巧,这里面有多少苦逼的历史。

操作系统首先,要接管原来(人肉计算机管理员)的工作,也就是接管计算机的硬件。

并且操作系统还要完成一个工作,把程序自动扔进存储器,并且告诉CPU去执行这个程序,操作系统一般也是计算机开机以后,自动加载的第一个程序。

其他程序都是小弟,都得听“操作系统”这个老大的话。

假设有3个程序,A、B、C。

操作系统先让A程序进入到存储器中,CPU运行完A程序,把输出结果保存好。

接下来操作系统通知B程序进入到存储器中,CPU运行完B程序,把输入结果保存好。

…………这叫做批处理运行操作系统。(像排队一样执行程序)

利用搜索引擎搜素关键字:“批处理操作系统”,可以得知很多相关资料。

后来的事情,大家知道了不少。 电脑速度越来越快。

而计算机中有很多设备,比如打印机(早期的打印机相当于今天的显示器,读卡器相当于把纸带上的二进制程序放到存储器中。)

(纸带后来就被我们今天的硬盘替代了,也是外部存储器)

不同的厂商,生产不同的硬件,而这些硬件内部的电路结构都不一样。

这就意味着,你的这个程序,在A计算机上可以控制A厂家生产的A打印机。

换成B打印机,你的程序就无法正常工作了。 (计算机的硬件配置不同,程序无法适应不同的硬件设备)

这对于,早期编写程序的人来说是极其痛苦的一件事情。(兼容性)

计算机上连着的其他设备,统称“外部设备”,与外部设备交互是很底层的。

在《汇编语言》中,我带领大家读写8259芯片完成RTC中断,很繁琐的一件事。

换一个芯片,那代码就又不一样了,因为内部的端口和寄存器包括控制比特位也会发生改变。

所以,底层硬件细节太多,程序员要控制一台外部硬件设备,必须详细了解硬件细节。

但厂家的设备那么多,你不可能写完代码,把所有的设备都买一套,连接到计算机上,来测试一下代码是否可以正常工作。

一般都是拿着厂家的设备文档手册,写代码,至于能不能成功运行,那只能祈祷了。

为了让程序员不要这么苦B,解放生产力。

(开始哲学总结啦:大家发现没有,解放生产力是人类一直努力追求的一件事情。)

(而抽象封装是解放生产力中过程中必然出现的一个概念)

从原始社会->农耕社会->工业革命->信息技术革命……

知识越来越多,人的寿命又不可能无限长,也不可能一辈子上学读书。

100多年前,认识字就是有文化了,现代的人要求学习的东西越来越多,所以有了社会大分工。

不分工的话,那么多知识一个人学不完啊。分工的背后,就是分专业,分技能,分领域,也是为了适应现代社会节奏。

以前的人,生活焦点更多的是放到吃喝拉撒上,现代人的基本温饱解决了,追求更高的生活品质,更高的教育。

但这也引发了心理危机,很多人活着容易焦虑,信息交换速度的提高,人们更容易攀比,因为看到太多比自己混的好的人。

网上有句话说:“有钱人的快乐,你是根本想象不到的。”在古代真的无法想象,没机会接触嘛,不知道也就不盼望,不盼望,也就不焦虑。

现代的人,通过各种书籍,视频,手机知道了各种各样物质带来的快乐,按奈不住那颗跃跃欲试的心,但能力和物质不匹配,想要又得不到,人就容易焦虑。

操作系统、驱动程序、进程之间的关系

其实,在我们今天,这种事情依然还存在。在2006年到2012年这段期间(前几年Web开发领域的前端程序员,为了让网站页面,可以在不同的浏览器上正常显示,比如IE6,IE7,IE8,IE9,IE10,IE11,火狐,Goole Chrome)

要写几套不同的代码,每次打开网站,都要检测用户当前使用的浏览器是哪个版本,决定运行不同的代码,后来大家都抛弃IE浏览器了。

但有的Web前端程序员,因为工作等原因,还在苦逼的面对。

包括安卓手机开发程序员,兼容性也是头疼的一件事情。

你可能有一段时间,打开一个网站,会提示你:“为了正常运行本程序,请使用什么浏览器。”

(不知不觉中,我们也成了计算机技术发展历史的见证人,我们这些80后,90后也开始变老了。

在程序对不同硬件无法兼容,导致程序员的工作量太大,太辛苦。

操作系统的职责,就得又进一步升级了。

刚开始,操作系统仅仅是代替“计算机管理员”的工作,负责把程序加载到内存,让CPU运行。

接下来,操作系统要肩负更多的责任,充当软件和更多硬件之间的桥梁。

操作系统给我们抽象出了“接口”,通过这个接口去调用硬件的工作。

接口不会轻易变化,上图:

操作系统、驱动程序、进程之间的关系

比如,你在程序中,调用了一个操作系统提供的一个接口。

打印('1+1=2');

操作系统会调用对应的设备驱动程序,而设备驱动程序会控制指定的I/O端口操作打印机,一步一步交接任务。

最后打印机出来一张纸,上面有一行字 1+1=2。< br="">

你不用考虑这个打印机是哪家公司生产的,如何去控制,如何去兼容,只要正确安装了设备驱动程序就行了。

(设备驱动程序,往往是根据操作系统系统提供的标准接口,由硬件厂商去编写兼容)

(比如Windows系统很流行,硬件厂商为了让更多的Windows用户使用自己的硬件,就根据Windows提供的接口协议,去开发设备驱动程序)

(每个操作系统的接口设计标准是不一样的,所以硬件设备驱动程序也是不通用的,给Windows系统就是给Windows系统写的,给Linux就是给Linux写的,给安卓就是给安卓写的)

(不同的硬件,要安装的设备驱动程序是不一样的)

(我们平常安装一个操作系统,其实除了操作系统本身的功能以外,有很多都是硬件的驱动程序)

(只要足够多的硬件驱动程序,才能保证计算机启动以后可以正常控制你的显示器,鼠标,键盘,音箱,麦克风,打印机,扫描仪,网卡等设备)

就像你用汇编语言,写了一条指令:add ax,bx。

你不用考虑,Inter公司的两款CPU型号不一样,因为Inter公司已经把兼容性问题解决了,哪怕两款CPU的add指令内部的微架构不一样,但机器指令却是一致的。

但我们了解的安卓系统,到了国内各个公司在安卓系统基础上分别拓展出新的ROM,而且不同的手机,硬件什么的,差太多。

这就成了,各自有各自的一套标准和接口,谁也不想兼容谁,又没有足够的权威可以站出来把这件事情兼容。

所以,你在小米手机上的系统,要想刷到华为手机上,难度就非常大了,对于普通人来说,是不可能的一件事情。

那么多不同的硬件,又不可能安装系统的时候,一股脑的全部安装进入,500G的操作系统,你敢想象吗?

这也是安卓非常混乱的原因之一,也许将来会有一个“统一部门”站出来搞定这件事。

又扯了一堆。

计算机操作系统把不同硬件的兼容性问题解决了,接下来又遇到一个新问题,操作系统的功能又得升级。

是什么问题呢?

学过我们之前《计算机原理》和《汇编语言》课程的朋友,肯定知道一件事情。

CPU中的寄存器,缓存和内存还有硬盘,它们因为各种制造工艺技术等原因,是没有办法同步工作的。

1秒=1000毫秒=1000000微秒=1000000000纳秒

现代计算机的CPU的工作速度是以纳秒为时间单位的。

如果把CPU干一件事情的速度用1秒钟计算,那么读写内存就需要好几分钟,因为内存反应太迟钝了,CPU就一直等啊等啊等啊。

这还不是最慢的,把这个时间换算成读写固态硬盘就得两三天,换算成机械硬盘就是几个月,如果是网络传输的话,那就是几年了。

到了20世纪50年代末,计算机的速度已经非常快了。

而操作系统却还是批处理工作,就是一个程序在内存里面运行完毕结束后,再把下一个程序加载到内存中运行。

程序总是要和硬件打交道的,而硬件的工作速度又比较慢。

所以大部分时候,CPU都是闲着~~没事干,就是干等。

比如一个程序要处理一个文件,文件在硬盘上放着,读取文件的过程很慢,CPU相当于干1秒钟,就要休息一天。

我们把这种情况叫做程序I/O阻塞,通俗易懂解释:当程序与外部设备交换数据时,因为其他硬件一时半会不能把数据传过来,就这样干耗着,CPU资源被浪费了。

如果你觉的非常难以理解,想象一下,闪电侠(光速)给你送快递,闪电侠1秒钟就把快递送到你家门口,开始敲门,或者给你打电话,从你穿上衣服到客厅开门,大概需要60秒到600秒左右不等。)

操作系统、驱动程序、进程之间的关系

闪电侠就这样一直等啊,等啊。他真正送1个快递的时间只需要1秒钟,但是等人拿快递的时间就增加了好几分钟。

如果一天有100个快递需要送的话,真正送快递的时间只有100秒,但等待的就是几百分钟。(等待的过程就是I/O阻塞)

CPU等打印机,等键盘,等鼠标,等读卡器。

为了最大化利用CPU的资源,而不是干等着。

所以,又有了新一代操作系统,这个操作系统不仅能完成之前那个操作系统“自动加载程序”,“批处理工作”,还可以实现在一个CPU上同时运行多个程序。

假设内存里面有2个程序在同时运行。

等第一个A程序发生I/O阻塞的时候,CPU会立马切换运行下一个B程序。

等A程序完成I/O阻塞,CPU立马切回来执行A程序。

还是拿闪电侠送快递举例。

闪电侠给第1个人送快递,需要等待(等待时间不确定),闪电侠立马去给第2个人送快递(又需要等待),立马跑去给第3个人送快递(又需要等待)

这个时候第1个人出来了,发现闪电侠不在了,给闪电侠打个电话,闪电侠立马把第1个快递送给了A。(中断)

接下来闪电侠给第4个人送快递,中途第2个人也出来了,要拿快递,给闪电侠打了一个电话,闪电侠立马给第2个人送快递。

所以,CPU在计算机中,快速的切换不同的程序,使得我们可以一边听音乐,一边聊天,一边玩游戏,鼠标和键盘,音箱都在“同时”工作。

其实我们之所以认为是“同时”工作,很多时候是错觉,CPU只是快速的切换,制造出一种“同时”的感觉。

操作系统的这种能力叫“多任务处理”。

说起来挺简单的,但实际上要实现这个过程还是很复杂的,有很多不同的策略都能模拟出多“任务”的效果,但各有利弊。

多个程序在内存中,还有一个问题,每个程序都要占用一部分内存,操作系统就得把不同的程序分配到不同的内存区域。

但是有的程序占用空间大,有的程序占用空间小,时间久了以后,就会产生(内存碎片)原理跟我们在《汇编语言》中谈过的《磁盘文件碎片》原理是一样的。

所以一个程序,可能在内存中真正运行的时候,被分割到了十几个地方,就像一个程序,可能在硬盘上,被分割到了十几个不连续的扇区上存放着。

这对于程序员来说,又是一个麻烦事。

所以,操作系统使用了一种“虚拟化”技术,配合CPU,比如保护模式。

让每个程序都产生一种错觉,好像内存里面,只有自己一个程序在运行,压根不存在其他程序一样,又是一层抽象。

比如我写了一个程序,从内存地址:0x0000000到0x0000 0005 这几个地址读取数据。

但实际上,这几个内存地址都是操作系统给我虚拟出来的,当我从这几个地址读取数据的时候,操作系统会把这几个地址转换成真正的物理地址。

真正的物理内存地址,被操作系统隐藏和抽象了。

对于程序员来说,这几个地址好像是连续的,数据是挨在一起存放着,这就够了。

操作系统、驱动程序、进程之间的关系

操作系统、驱动程序、进程之间的关系

而且,这种“虚拟内存技术”,可以更好的隔离内存里面不同的程序。

一个程序如果出错了,不会影响到其他的程序。(保护模式)

同时,这从某种程度上,也降低了一些病毒(恶意软件)的危害。

到了这一步,我们把在内存里面运行的某个程序,统一叫做“进程”。

进程,就是此时此刻操作系统真正在进行的程序。

同时某个进程随时都可能会被操作系统打断,停下来,保存现场数据。切换到另一个进程运行。

我们前面写的一个hello.exe,运行的时候,就是以进程的方式运行的。

电脑毕竟是奢侈品,人手一台电脑在那个年代也不太现实,所以一台电脑往往是多个人同时使用。

操作系统、驱动程序、进程之间的关系

相当于,把一台计算机,虚拟成了多台不同的计算机,为了不让一个人把电脑资源全部使用完。

开发了分时操作系统,每个用户只能使用电脑的一部分CPU资源和内存等。

由于电脑速度很快,即使你只有10分之1的资源,也足以完成很多任务。

操作系统、驱动程序、进程之间的关系

最初的“终端”只有一个键盘和屏幕~

到了今天,我们的电脑既可以成为那台被共享的计算机,也可以成为一个终端,连接到其他计算机上,使用其他计算机的资源。

比如:Linux操作系统的shell,包括Windows Server操作系统的远程桌面。

今天的操作系统根据功能可以理解为由两大部分构成:

1.操作系统内核。

2.操作系统附带的一些其他程序和工具。(记事本,编译器,数据库,画图软件,钟表,日历)

而操作系统的内核:管理内存,文件,硬件资源驱动,进程通信,中断,网络系统等。

很多喜欢“干坏事”的人,都会多多少少的研究操作系统内核。

因为了解操作系统内核内部的工作原理,就更容易得到更多的权限,调度更多的资源,甚至对其他程序干一些坏事。

内核如果运行不正常了,电脑就真的崩溃了。

为了让计算机速度越来越快。CPU也在努力提高自己的工作效率,引入了各种运行机制,“流水线”,“高速缓存”,“乱序执行”,“寄存器重命名”,“分之目标预测”。

这还只是从硬件层,来提升一个程序的运算速度单位运行时间,那软件层呢?操作系统也在不断进步。

到了20世纪80年代,科学技术的突破,计算机越造越小,成本也越来越低。

个人也能承担起这笔费用了,计算机进入了普通消费者家庭。

所以,有时候,我们把电脑叫做(PC=Personal Computer)个人计算机。

这个时期,计算机,不再仅限于政府,军事,企业或大学教育机构使用了。

但计算机毕竟是专业的工具,操作系统也不是一般人可以驾驭的,需要系统化学习,才能正确使用电脑。

为了让普通人也可以快速上手计算机,又发明了一些操作系统。

比如1981年的MS-DOS(磁盘操作系统)只有160KB,是微软公司开发的,一下子成了家庭电脑最受欢迎的操作系统。

但这个系统,并非(多任务,多用户,并且没有保护模式),所以很容易崩溃。

你还记得多年前的Windows系统,很容易蓝屏吗?

而现在的Windows系统很少蓝屏了。

MS-DOS,虽然让人不舒服,但忍一忍还是可以使用的,因为重启一下就好啦。(网管必杀技,重启技能并非没有道理)

包括后来的两三代Windows操作系统,虽然占据了很大市场,但没有很好的内存保护机制,还是很容易蓝屏。(程序运行出错引起的)

程序崩溃了,就把操作系统也带着崩溃了。

操作系统、驱动程序、进程之间的关系

到了Windows 95就好很多了,一直到现在的Windows10,越来越稳定。

现代操作系统有:Windows 、Liunx、Unix、IOS、Mac OS x、Android。

大部分都是个人使用,并且都有多任务,内存保护的功能,都可以同时运行多个程序。

这可是经过了几十年操作系统的发展和积累,很不容易。

关于操作系统、驱动程序、进程的概念,就简单介绍到这里,在以后的课程中,慢慢深入了解实现机制。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多