目录
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总线
10.冯诺依曼体系结构计算机的基本原理:存储程序和程序控制
练习
不属于冯诺依曼体系结构必要组成部分是( )
A.CPU
B.Cache
C.RAM
D.ROM
分析:
Cache指的是缓存,虽然原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,但并不是冯诺依曼体系结构必要组成部分,因为Cache是现代计算机的优化,用于提升CPU访问数据的速度
ROM指的是Read-Only Memory只读存储器,只能读,不能写入,而且这个概念比较模糊:
1.如果 ROM 是 焊在主板上,它是内存; 如果 ROM 是 插在 USB 接口上(如 U 盘),它是外存(外设部分)
2.早期的游戏机想要运行游戏必须要卡带,而卡带里面是游戏的ROM,而且卡带可以插入或拔出游戏机,可以理解为输入设备
选B(D比较模糊,暂不确定)
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),从而能直接访问软硬件资源
(其实,如果笼统来说,当任务执行自己的代码时,它处于用户态;当任务需要使用内核的服务时,要进入内核的代码执行,此时处于内核态. 任务又称为进程,在OS17.【Linux】进程基础知识(1)文章有提到)
完成任务时,会从内核态切换为用户态,确保安全
而且处于用户态的程序如果崩溃,是不会影响到操作系统的,处于内核态的程序如果崩溃,会影响到操作系统的,可能导致其崩溃;可见用户态具有安全性
出于安全考虑(数据安全,正常为用户提供服务),程序需要借助系统调用来间接访问操作系统提供的资源
常见的系统调用通过C/C++实现
也可以看看《深入理解计算机系统》对此的描述:
结论:所有访问操作系统的行为只能借助系统调用
也可以看看《Linux内核设计与实现 第3版 》中译版的 第一章 Linux内核的简介 1.1.UNIX的历史 对此的描述:
当然,本书的主题是内核。用户界面是操作系统的外在表象,内核才是操作系统的内在核心。系统其他部分必须依靠内核这部分软件提供的服务,像管理硬件设备、分配系统资源等。内核有时候被称作是管理者或者是操作系统核心。通常一个内核由负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。对于提供保护机制的现代系统来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。相对的,应用程序在用户空间执行。它们只能看到允许它们使用的部分系统资源,并且只使用某些特定的系统功能,不能直接访问硬件,也不能访问内核划分到人的内存范围,还有其他一些使用限制。当内核运行的时候,系统以内核态进入内核空间执行。而执行一个普通用户程序时,系统将以用户态进入以用户空间执行。
在系统中运行的应用程序通过系统调用来与内核通信。应用程序通常调用库函数(比如C库函数)再由库函数通过系统调用界面,让内核代其完成各种不同任务。一些库调用提供了系统调用不具备的许多功能,在那些较为复杂的函数中,调用内核的操作通常只是整个工作的一个步骤而已。举个例子,拿printf()函数来说,它提供了数据的缓存和格式化等操作,而调用write()函数将数据写到控制台上只不过是其中的一个动作罢了。不过,也有一些库函数和系统调用是一一对应的关系,比如,open()库函数除了调用open()系统调用之外,几乎什么也不做。还有一些C库函数,像strcpy(),根本就不需要直接调用系统级的操作。当一个应用程序执行一条系统调用,我们说内核正在代其执行。如果进一步解释,在这种情况下,应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。这种交互关系——应用程序通过系统调用界面陷入内核——是应用程序完成其工作的基本行为方式。
库的含义
1.对部分系统调用进行适度封装,从而形成库,库有利于更上层用户或者开发者进行二次开发
2.头文件提供方法的声明,而库文件提供方法的实现
例如linux系统中最底层的api是glibc,它是GNU发布的libc库,是C运行库;几乎其它任何运行库都会依赖于glibc
库函数和系统调用的关系
1.简单理解:两者都是函数,系统调用是函数,这些函数是有linux内核所提供的;而库函数一般是C语言标准库所提供(两者的提供方不同)
2.库函数只能通过调用系统调用接口才能访问操作系统的资源
结论:库函数和系统调用是上下层的调用和被调用的关系
例如执行C语言的printf函数,需要库文件的支持,而库含有部分系统调用,通过系统调用来访问显存,这样就能在显示器上看到打印的信息了
在printf函数内部实际会调用系统所提供的write函数来完成实际的往屏幕上展示数据的操作,因此printf对于系统调用write进行了二次封装和调用
-->任何语言的本质就是对系统调用接口进行一定的封装才形成的语言
3.不一定所有的库函数都会调用系统调用,但如果库函数想访问软硬件资源,一定会包含系统调用
不一定所有的库函数都会调用系统调用:例如math.h的pow()函数,不需要访问硬件资源
原文首发于CSDN,点击阅读全文即可查看