OS16.【Linux】冯依诺曼体系结构和操作系统的浅层理解
目录
1.冯依诺曼体系结构的定义
2.图示
3.程序的运行
4.从软件的数据流上看冯依诺曼体系结构
4.操作系统的浅层理解
结构图(★★★)
简单理解驱动程序
管理的本质
简单理解系统调用
程序运行的两种模式:用户态和内核态
库的含义
库函数和系统调用的关系
1.冯依诺曼体系结构的定义
冯依诺曼体系结构(Von Neumann architecture)是一种将程序指令存储器和数据存储器合并在一起的存储器结构
2.图示
看看硬件架构:
罗列几个要点:
1.首先要明确:图中的存储器指的是内存,可以理解为硬件基本的缓存空间,不是指U盘、磁盘等存储介质(不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设)
可回顾98.【C语言】存储体系结构文章的存储器层次结构图:
存储器的出现是为了解决磁盘的运行速度(很慢)和CPU的运行速度(很快)差别很大的问题
,存储器的速度介于磁盘和CPU之间,用于提高计算机整体的运行效率-->一个程序如果要运行,必须加载到内存(即存储器)中
2.输入设备和输出设备统一叫外设;除了CPU(即中央处理器)和存储器,其他都是外设
3.输入设备举例:例如键盘、鼠标、摄像头、话筒、磁盘、网卡等
4.输出设备举例:扬声器、显示器、播放器硬件、网卡等
5.有些设备只能是输入设备,有些设备只能是输出设备,但有些设备既是输入设备也是输出设备,例如磁盘可以读取和写入数据
6.CPU中央处理器由运算器和控制器两部分组成
7.运算器:进行算术运算和逻辑运算
8.控制器:控制其他硬件的执行过程,从下图可以看出:
9.各个硬件必须通过"线"连接起来,这个"线''叫总线
总线分为两部分:系统总线和IO总线
3.程序的运行
冯依诺曼体系结构规定: 一个程序如果要运行,必须加载到内存中
4.从软件的数据流上看冯依诺曼体系结构
例如A通过通讯软件给B发送消息,分析整个过程(不考虑网络部分)
画图分析:
A的消息通过键盘(输入设备)发送,而控制器将消息加载到内存中,之后CPU内存中的信息经过处理后发送到网卡中,A的网卡(输出设备)将数据发送到B的网卡(输入设备)中,之后将消息解码,加载到存储器中(也加载到显存中,这样B能通过显示器看到消息)
4.操作系统的浅层理解
浅层理解: 操作系统是一个能管理软硬件资源的软件,其目的是为用户提供一个良好稳定的运行环境
操作系统包含内核和其他程序(例如函数库,Shell程序等)
这里的用户理解为程序员,不是普通用户,程序员开发软件需要使用操作系统,而普通用户使用的是软件,不是操作系统
结构图(★★★)
简单理解驱动程序
情景:一台刚装好新系统的电脑可能不能上网或者发出声音
解决方法是安装驱动软件,可见操作系统不会直接管理软硬件资源,而是通过驱动程序去间接管理软硬件资源(因为操作系统只需要管理软硬件资源的数据)
但严格来说,驱动程序不直接管理硬件资源,驱动程序的作用是翻译,将操作系统的通用指令(如"播放声音")转换为特定硬件能理解的信号
可见这里对"管理"的定义是:管理者和被管理者不需要见面,只需要管理者通过执行者来得到被管理者的数据即可,形象理解: 教务人员可以通过学生管理系统中的学生数据增删改查来管理学生
操作系统:管理者(有决策权)
驱动程序:执行者,作用:获取软硬件资源的数据
被管理者:软硬件资源
管理的本质
通过管理数据来管理实体
管理=先描述再组织
形象理解:管理一个学生=先用一些属性(性别、年龄、年级、专业等等)来描述学生,将这些属性打包成结构体,再将结构体组织起来:用某种数据结构将含有学生数据的结构体连接起来,例如链表,可以通过对链表的增删查改来管理学生们
结论:在操作系统中管理任何对象最终都可以转化为对某种数据结构的增删查改!
简单理解系统调用
系统调用(system call)在图中所处的位置比较特殊,上接用户操作接口,下接操作系统
维基百科上的定义:In computing, a system call (commonly abbreviated to syscall) is the programmatic way in which a computer program requests a service from the operating system(请求运行操作系统提供的服务) on which it is executed.
理解:在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用这部分由操作系统提供的接口叫系统调用
程序运行的两种模式:用户态和内核态
一般而言,应用程序运行在用户态(user mode)
程序处于用户态时,无法直接访问软硬件资源(例如磁盘中的数据),而如果程序想要访问软硬件资源必须借助系统调用(其提供接口来访问操作系统提供的服务,即上方提到的"下接操作系统"),这样程序就能切换成内核态(kernel mode,也称为特权模式: privileged mode),从而能直接访问软硬件资源
完成任务时,会从内核态切换为用户态,确保安全
而且处于用户态的程序如果崩溃,是不会影响到操作系统的,处于内核态的程序如果崩溃,会影响到操作系统的,可能导致其崩溃;可见用户态具有安全性
出于安全考虑(数据安全,正常为用户提供服务),程序需要借助系统调用来间接访问操作系统提供的资源
常见的系统调用通过C/C++实现
也可以看看《深入理解计算机系统》对此的描述:
结论:所有访问操作系统的行为只能借助系统调用
库的含义
1.对部分系统调用进行适度封装,从而形成库,库有利于更上层用户或者开发者进行二次开发
2.头文件提供方法的声明,而库文件提供方法的实现
库函数和系统调用的关系
1.简单理解:两者都是函数,系统调用是函数,这些函数是有linux内核所提供的;而库函数一般是C语言标准库所提供(两者的提供方不同)
2.库函数只能通过调用系统调用接口才能访问操作系统的资源
结论:库函数和系统调用是上下层的调用和被调用的关系
例如执行C语言的printf函数,需要库文件的支持,而库含有部分系统调用,通过系统调用来访问显存,这样就能在显示器上看到打印的信息了
在printf函数内部实际会调用系统所提供的write函数来完成实际的往屏幕上展示数据的操作,因此printf对于系统调用write进行了二次封装和调用
-->任何语言的本质就是对系统调用接口进行一定的封装才形成的语言