计算机组成原理、操作系统、数据结构和计算机⽹络--转
本⽂摘⾃知乎。
作者:Raynor
链接:
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
计算机组成原理
这门学科告诉你什么是计算机。宋慧乔和玄彬
⾸先,我们可以把计算机分解成最原始的部件——晶体管。晶体管是⼀种半导体材料,其最重要的作⽤就是半导:可以通过电流的变化,实现电路的切换。⽐如计算机最基础的与或⾮运算,都可以通过晶体管组成的电⼦元件实现。⽽通过晶体管的电位差不同,就可以体现"⼆进制数据",即0和1。再加上电容和电阻,就能把这种⼆进制数据临时保存起来。
综合这些特性,⼤⽜们发现把晶体管⽤作精密的数学计算,可以极⼤的提⾼运算的效率。⽐如我有2个电容,分别是充满电和没有电,对他们同时释放电信号,电容就会把其中的电⼦放出来,经过特定的逻辑电路,如与门,得到了0的结果。要计算1+1,实际上也是类似的原理。我先设计⼀个加法电路,把若⼲电容组合成的"数字"流过这个电路,把结果存⼊⽬标电容,就得到了结果。⼤规模的复杂运算以此类推。
最早期的计算机真的就是⽤许多结晶体管实现的复杂电路结构,通过控制输⼊电流得到希望的输出结果。后来⼈们发现,这种计算可以⽤某些形式抽象成多种指令,不⽤针对每次计算设计复杂的电路,只要调⽤指令就可以实现任何⼀种计算组合,于是诞⽣了cpu。只有cpu,每次都要⾃⼰配置输⼊信号,实在太痛苦,就做了纸带输⼊给计算机。后来⼜发现纸带还是很⿇烦,于是发明了输⼊终端和对应的存储设备。后来⼜发现很多数据要临时保存起来,供连续计算使⽤,于是发明了内存。再后来pc的发展经历了⽆数次的变⾰,让计算机⼀步步到了今天的地步,也就是你现在看到的这样。
其中的历程⾮常曲折,也许有机构能够把他们全部组织成⼀本漫长的历史,但个⼈肯定是⽆能为⼒的。
操作系统
综上所述,计算机发展到⼀定程度,什么东西都靠⼈⼯也未免太累了。
⽐如通过输⼊设备组织指令给cpu去计算,你希望能够⼀个快速的输⼊设备(⽐如键盘),在能看到结果的地⽅输⼊(⽐如屏幕),然后再⽤很⽅便的⽅式提交给cpu(⽐如按键或者指令),让cpu去算好了,再把结果展⽰出来(⽐如屏幕)。
理想很美好,但是这么复杂的流程,⼈⼯管理起来不还是很⿇烦吗?除⾮我构造⼀个设备,把这些所有设备都管理起来,于是主板就诞⽣了。
现在主板解决了我们⼤量的问题,但是我发觉我的需求还远远不够!
我希望我写过的程序能在任何⼀台机上运⾏。
我希望我能边听⾳乐边⼲活——即同⼀时间可以运⾏多个程序。
我希望别⼈写的傻×东西不要影响到我的⼯作——即多任务控制。
我希望计算机⾥⾯的各种资源都能得到良好的组织,更快的访问。
我希望我的⽤户界⾯更好看,使⽤更⽅便,功能更强⼤!
我是个⼩⽩⽤户,啥都不懂,别跟我扯这些有的没的,我就像随便操作两下就能达到我想要的!
如果这些需求全部都做在主板bios⾥⾯,那将是⼀场灾难!除⾮bios经过极⼤的调整和改动,划分出⼀⼤块区域存放操作系统,并且完成复杂的体系结构改⾰。
计算机发展到这种程度,早就已经有很多的机构和⼚商介⼊其中,试图从中渔利。他们当然不会求着计算机标准委员会和主板⽣产⼚商去做所谓的主板改⾰,⽽是编写⾃⼰的程序——操作系统,来解决这些所有的问题。
⽽操作系统问世之后,⼀⽅⾯接管了主板对于系统资源的管理,加⼊了⾃⼰的中间层——驱动程序,另⼀⽅⾯⼜充分发挥了⼈机交互的接⼝——gui界⾯,成为了计算机必不可少的组成部分。
操作系统通过bios引导,即作为应⽤程序开始运⾏。我们知道程序的本质上就是在cpu上运⾏种种指令,⽐如操作系统需要把硬盘上的模块放⼊内存,实际上就是运⾏了⼀系列复杂的cpu指令,cpu指令通过主板bus(实际上就是传递指令的电路)发送指令给硬盘(⽐如从哪个扇区偏移多少读多少数据),硬盘再通过芯⽚组转动磁头,把数据读到缓存中,完成后给cpu发送⼀个信号(即中断),cpu收到这个信号,就在寄存器中寻址该信号对应的地址(即我们说的中断向量表),运⾏该地址中的指令,发现该指令是发送拷贝指令给主板芯⽚组,主板就会在cpu的指导下不断的发送信号,告诉硬盘缓存放电,再把接收的电信号存到指定的内存位置去,如此反复,直到完成cpu的⼀系列指令为⽌。
操作系统说⽩了,就是这样通过种种cpu指令,实现⾃⾝的所有功能。
当然这些指令也不是⼀条条写进去的,⽽是通过编程语⾔完成⼈类较容易识别的逻辑,然后再通过编译器把这些逻辑翻译成cpu指令,这就涉及编译原理的东西了。
既然操作系统对硬件的访问都是通过cpu指令来完成的,那为什么⼤家都感觉是操作掌管了硬件呢?这就涉及操作系统最本质的功能之⼀:对系统资源的管控了。
我们运⾏的所有程序,实际上都是操作系统帮我们运⾏的。操作系统背后进⾏了很多的⼯作,如虚拟地址空间的分配,cpu分时调度,硬件中断信号的响应等。这样对于硬件资源的访问,也是通过操作系统安排的。⽐如操作系统会通过把短时间内硬盘读写合并成顺序的⽅式,以提⾼磁头的利⽤率,降低磁头转向的时间。再⽐如对内存地址的访问也是由操作系统管控的,某个程序中的内存地址具体落到内存条的哪个位置,还是硬盘中的虚拟内存,就看操作系统的⼼情了。
⾄此,操作系统和硬件的交互也介绍的差不多了,更详细的东西建议参考操作系统相关的书籍吧,⽐如《深⼊理解计算机系统》,《linux 内核设计与实现》,《unix环境⾼级编程》之类的。
数据结构
数据结构的作⽤,就是为了提⾼硬件利⽤率。
⽐如操作系统需要查⽤户应⽤程序"office"在硬盘的哪个位置,盲⽬的搜索⼀遍硬盘肯定是低效的,
这时候搞个b+树作为索引,搜索office这个单词就很快,然后就能很快的定位office这个应⽤程序的⽂件信息,再到⽂件信息中对应的磁盘位置了。
脾胃虚弱吃什么食物可以补脾胃数据结构的东西本《算法导论》,《数据结构与算法分析》之类的看吧。
计算机⽹络
计算机⽹络分为3块:
杜海涛给权志龙下跪
1. 硬件高周元
⽹卡,⽹线,交换机这些,⽤来处理数据的。
强化武器技巧2. 协议
数据在⽹络中通信如何组织?如何识别?如何保证数据的正确性?
这2块我就不多说了。
3. 操作系统
这就是如何把计算机⽹络和操作系统结合起来的问题了。
对于操作系统来说,⽹卡也是⼀种硬件资源。但是⽹络不单只是⼀种硬件,⽽是⼀种媒体⼊⼝。⽐如操作系统管理硬盘,当然不是简单的记⼀下硬盘有多⼤,然后⼀切操作都交给硬盘芯⽚去做,更多的需要组织硬盘的扇区,分区,记录⽂件和扇区/偏移的关系等等。
操作系统对于⽹络来说也是如此,要记录⾃⾝在⽹络的标识(ip),可被他⼈访问的⼊⼝(port),以及对⽅的信息(remote ip/port)。连接,断开,数据确认等操作也是由协议控制。
传递⾃⾝消息给对⽅,类似访问硬盘⼀样把内存中的数据传递给⽹卡缓存,再发消息给⽹卡让⽹卡去传数据,⽽是否发送成功这些保证不再由硬件中断信号反馈,⽽是通过⽹络协议完成。接收对⽅消息,也是接收到⽹卡中断,再把数据从⽹卡缓存移动到内存中,再通过协议给予对⽅反馈。
简单来说就是这样,如果以后有时间,我再把osi七层协议中的内容和操作系统的交互再详述⼀遍吧。鲁豫有约 郑秀文
⽹络⽅⾯的就推荐《tcp/ip详解》,《uinx⽹络⾼级编程》吧。