冯诺依曼体系结构
1.整体框架
2.关于存储器(内存)
①输入设备和输出设备相对于CPU来说是非常慢的,那么根据木桶原理,最终整个体系所呈现出来的速度将会是很慢的,效率自然就低了。
②引入内存,内存有个特点就是,比输入设备和输出设备要快很多,但是比CPU慢。现在内存就处于慢设备和快设备之间,是一个不快也不慢的设备,能够在该体系结构当中就起到一个缓冲的作用。
③内存为什么能够提高效率?
(1)内存具有数据存储的能力,那么它就有预装数据的能力,提前把数据准备好,CPU只需要从内存中拿数据进行处理就行。
(2)局部性原理:根据统计学原理,当一个数据正在被访问时,那么下一次有很大可能会访问其周围的数据。所以当CPU需要获取某一行数据时,内存可以将该行数据之后的数据一同加载进来,而CPU处理数据和内存加载数据是可以同时进行的,这样下次CPU就可以直接从内存当中获取数据。
④CPU只和内存进行数据交互
站在数据层面上,cpu不和外设打交道,直接和内存打交道;
外设角度,数据不和CPU直接打交道,直接和内存打交道;
内存:是计算机数据的核心
3.常见外设
输入设备:键盘、鼠标、网卡、硬盘、等
输出设备:显示器、音响、网卡、硬盘、打印机等
4.补充
①为甚程序运行的时候,要先加载进内存?
(1)把数据加载到内存相当于预加载,把程序缓存起来了。
(2)可执行程序〈文件)是在硬盘上(外设)运行程序是需要CPU去执行,CPU运行代码
(3)体系结构决定的,CPU只和内存交互
②寄存器不仅仅在cpu中具有,其他外设也是有的 (例如 : 使用键盘时,键盘是先将获取到的内容存储在寄存器当中,然后再通过寄存器将数据写入内存当中)
③各种硬件单元之间连接用的是:总线(IO总线,系统总线)
④一条消息的发送
你在键盘当中输入消息,键盘将消息相当于数据传输到内存,CPU从内存获取到数据后对数据进行各种封装,然后再将其写回内存,OS会在合适的时候通知网卡去内存中取数据通过网络发送到对方主机
;
然后经过网络传输对端的网卡从网络当中获取到你所发的数据后,将该数据加载到内存当中,然后CPU对从内存中拿取网络数据进行解包把消息提取出来写回到内存中,显示器从内存当中获取消息并显示在电脑上,这就完成了一次通信。(
只有消息对方正确接收,你的消息列表中才会出现这条消息)
如果是文件呢? 只是外设不同,磁盘
操作系统
1.OS是什么:操作系统就是一款进行软硬件资源管理的软件。( OS主要包括两大部分,内核和其他程序(命令行,库,shell) )
2.为什么要有OS:在一套系统中,需要有管理者进行统筹;对上,给用户一个稳定高效的执行环境;对下,管理好软硬件资源,提供稳定的软硬件环境
3.OS如何做管理? 先描述,再组织(组织-用某种数据结构组织起来 ,管理是对数据结构的管理)
4.OS整体框架
①可以用命令行或是图形化界面进行各种操作,这一层被称为用户层
②系统调用接口对我们普通用户来说使用成本又太高了,因为要使用系统调用前提条件是你得对系统有一定了解。所以在系统调用接口之上又构建出了一批库,例如libc和libc++。实际上在语言级别上使用的各种库,就是封装了系统调用接口的,我们就是通过调用这些库当中的各种函数进行程序的编写。
③操作系统为了保护自己,对上只暴露了一些接口,而不会让用户直接访问操作系统,这一系列接口被称为系统调用接口。
④驱动 : 给硬件匹配软件方式,单独控制硬件,让OS和硬件解耦。
(1)
举个例子,如果操作系统自己来完成键盘的读取操作,那么只要你的键盘读取方式进行了改变,那么操作系统的内核源代码就需要进行重新编译,这对操作系统来说维护成本太高了。
于是我们又在操作系统与底层硬件之间增加了一层驱动层,驱动层的主要工作就是单独去控制底层硬件的。例如,键盘有键盘驱动,网卡有网卡驱动,硬盘有硬盘驱动,磁盘有磁盘驱动。驱动简单来说就是去访问某个硬件,访问这个硬件的读、写以及硬件当前的状态等等,驱动层就是直接和硬件打交道的。而驱动一般是由硬件制造厂商提供的,或是由操作系统相关的模块进行开发的。
(2)
理论上OS是不需要直接和硬件打交道的,你要和硬件交互你需要有一套和硬件交互的方法,万一哪一天硬件发生了变化,OS和硬件交互的方法也要跟着变,意味着OS必须变,硬件变了OS就要跟着变,这不是一种好的软硬件设置方案。最理想的设置方案是你变你的,别影响我,彼此之间的变化不会互相影响,这叫做软硬件之间的解耦。驱动程序是直接和硬件交互对硬件进行访问,但是拿到数据怎么管理是OS做的.
(3) 此时操作系统就只需关心何时读取数据,读多少数据,而不用关心数据是如何读取的了,也就是完成了操作系统与硬件之间的解耦。
5. 系统调用和库函数概念
* 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
*
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。