深入理解操作系统(1)第一章:计算机系统漫游(包括:位/比特/系统组成/CPU指令操作/缓存/分层结构/操作系统两个基本功能/并发/上下文/虛拟地址空间)

1. 信息就是位 + 上下文

1.1 hello.c

#include<stdio.h>

int main()
{
	printf("hello world\r\n");
}

源文件 hello.c 实际是由0和1组成的位序列,8个位组成一个字节。使用ASCII标准表示文本字符。

如下,每个字节都由一个二进制0和1对应

		 # 		  i		   n		c		 l	u	d	<stdio.h>
十进制: 35		  105	   110      99		 ……
二进制: 00100011 01101001 01101110 01100011 ……

1.2 一切都是比特:

系统中所有的信息,包括磁盘文件,内存中程序,用户数据及网络数据都是一串的比特位表示。

1.3 上下文:

区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。
比如:在不同的上下文中,同样的字节序列可能表示一个整数,浮点数,字符串或者机器指令。

啥意思???

2. 程序被其他程序翻译成不同的格式

2.1 hello.c 到 a.out

gcc hello.c //不加 -o hello 就是模式 a.out 

hello.c 程序被编译器驱动程序翻译成一系列的低级机器语言,
然后这些指令按照一种称为"可执行目标程序"的格式打包,
并以二进制磁盘文件的形式存放起来。

目标程序也可称为可执行目标文件。

2.2 编译系统的四个阶段:预处理,编译,汇编,链接

hello.c-预处理器->hello.i->编译器->hello.s->汇编器->hello.o->链接器->hello

1. 预编译过程主要处理那些源文件中以“#”开始的预编译指令

2. 编译器(ccl)将文本文件hello.i翻译成文件文件hello.s,它包含一个汇编语言程序。
	汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。
	
3. 汇编器(as)将 hello.s 翻译成机器语言指令,
	把这些指令打包成为一种叫做可重定位目标程序的格式,
	并将结果保存在目标文件hello.o中。
	
4.链接器负责处理各个文件的链接并入,结果得到hello文件,它是一个可执行目标文件/可执行文件。 

预处理,编译,汇编,链接
详细参考之前的博客:
预编译,编译,汇编,链接
https://blog.csdn.net/lqy971966/article/details/105146839

预编译:
	1. 将所有的#define 删除,并且展开所有的宏定义
	2. 处理所有条件编译指令,如#if #ifdef #elif #else #endif
	3. 处理#include预编译指令,将包含的文件插入到该预编译指令的位置,这个过程是递归进行的。
	4. 删除所有的注释 // 和 /**/ 
	5. 添加行号和文件名标识,比如 #2 hello.c 2 ,以便调试信息,错误,告警等显示行号
	6. 保留所有的#pragma等编译器指令,因为编译器需要他们

编译过程:
	编译过程一般可以分为6步:扫描、词法分析,语法分析,
							 语义分析、源代码优化、代码生成、目标代码优化。

	1. 扫描:首先源代码被输入到扫描器(Scanner)
	2. 词法分析:将源代码的字符序列分割成一系列的记号
		记号分为: 关键字,标识符,字面量(数字字符串),特殊符号
	3. 语法分析:对记号进行语法分析,产生语法树(Syntax Tree),就是以表达式为节点的树
	4. 语义分析:给语法树的表达式标识类型
	5. 中间语言生成:简单的代码优化,如 4+5 直接计算结果
	6. 目标代码生成与优化:选择合适的寻址方式、使用位移来代替乘法运算、删除多余的指令等
	
汇编:
	将汇编代码转变成机器可以执行的代码指令,每一个汇编语句几乎都对应一条机器指令。	
	把这些指令打包成为一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中。
	
链接:
	链接器负责处理各个文件的链接并入,结果得到hello文件,它是一个可执行目标文件/可执行文件。

3. 了解编译系统如何工作大有益处

3.1 优化程序性能

为了我们再c语言中作出好的代码选择,我们需要对汇编语言及编译器如何将不同的c语句转化为汇编语言有基本的了解。

3.2 理解链接时出现的错误

1.链接器报告说它无法解析一个引用,什么意思?
  找不到其对应的符号链接
	
2.静态变量和全局变量的区别?
  static静态全局变量与其他全局变量的区别:是否其他文件可见

3.如果在不同c文件中定义了名字相同的两个全局变量会怎么样?
  重复定义 报错:multiple definition of xxx
  
4.静态库和动态库的区别?
  静态库:
	1.浪费空间和资源。
	  因为当多个应用程序都使用库中的函数,导致内存中有多份拷贝
	2.库版本升级时,需要发布新的应用程序
	  一旦程序中任何一个模块有跟新,整个程序就要重新编译,链接、发布给用户。
	  这将非常的不方便。因为库是打包在exe中的。
	  
  动态链接库:
	1.内存中只存在一份公用的(如printf.o等)目标文件
	  不仅可以节省内存,还可以减少页错误,增加cpu换成的命中率
    2.当升级更新时,只需要简单的将旧的目标文件覆盖掉即可,
	  而无需将所有程序重新编译链接,替换。
	  把链接这个过程推迟到了运行时再进行,这就是动态链接的基本思想。

详细参考:
静态链接库和动态链接库
https://blog.csdn.net/lqy971966/article/details/105207532

3.3 避免安全漏洞

注意缓冲区溢出错误问题,尤其是数组越界等问题。

4. 处理器读并解释存储存在存储器中的指令

4.1 系统的硬件组成

一个典型的系统硬件组成
1.4
在这里插入图片描述

4.1.1 总线:

贯穿整个系统的一组电子管道,称作总线。
它携带信息的字节并负责在各个部件间传递。
通常总线被设计成传送定长的字节块,字(word)。
字,一般是四个字节长度。

4.1.2 I/O设备:

I/O(输入/输出)设备是系统与外界的连通通道。
如键盘,鼠标,显示器,光驱等;
每个I/O设备都是通过一个控制器或适配器与I/O总线连接的。
控制器是I/O设备本身中或是系统的主印制电路板上的芯片组;
适配器则是一块插在主板插槽上的卡。

4.1.3 主存:

主存是一个临时的存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。
物理上说,主存是一组DRAM(动态随机存取存储器)芯片组成;
逻辑上说,主存是由一个线性的字节数组组成,每个字节都有自己唯一的地址。

4.1.4 处理器:

处理器/CPU,是解释/执行内存中指令的引擎。

cpu的核心是:程序计数器/PC,一个字长大小的存储设备(或寄存器)
在任何一个时间点上,PC都指向内存中某条机器语言指令(地址)

CPU的工作:
	cpu从通电开始一直在不假思索地重复执行相同的基本任务:从程序计
	数器(PC)指向的存储器处读取指令,解释指令中的位,执行指令指示的简单操作,
	然后更新程序计数器指向下一条指令,而这条指令并不一定在存储器中和刚刚执行的指令相邻。
	
寄存器文件:
	是一个小的存储设备,由一些字长大小的寄存器组成,
	这些寄存器每个都有惟的名字。
	
ALU(算术逻辑单元):
	计算新的数据和地址值
	
CPU在指令常用操作:
	加载:从主存拷贝一个字节或者一个字到寄存器,覆盖寄存器原来的内容。
	存储:从寄存器拷贝一个字节或者一个字到主存的某个位置,覆盖这个位置上原来的内容。
	更新:拷贝两个寄存器的内容到ALU,ALU将两个字相加,并将结果存放到
		 寄存器覆盖该寄存器中原来的内容。
	IO读:从一个UO设备中拷贝一个字节或者一个字到一个寄存器
	IO写:从一个寄存器中拷贝字节或者一个字到一个IO设备。
	转移:从指令本身中抽取并将这个字拷贝到程序计数器(PC)中,覆盖PC中原来

寄存器(1)寄存器概念,种类说明及汇编代码详解
https://blog.csdn.net/lqy971966/article/details/106780755

4.2 执行hello程序

1.5
在这里插入图片描述

5. 高速缓存

5.1 高速缓存定义

针对这种处理器与主存之间的差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储( cache memories,简称高速缓存)

1.8
在这里插入图片描述

5.2 作用:

它们被用来作为暂时的集结区域,存放处理器在不久的将来可能会需要的信息。

5.3 L1/L2级缓存

L1级缓存:
	位于处理器芯片上的L1高速缓存的容量可以达到数万字节,访问速度几乎和访问寄存器文件一样快。
L2级缓存:
	容量为十万到数百万字节大小。
	进程访问L2的时间开销要比访问L的开销大5倍,但是这仍然比访问主存的时间快5~10倍。
	
L1和L2高速缓存是用一种叫做静态随机访问存储器(SRAM)的硬件技术实现的

文件操作接口二(缓冲区和缓存)
https://blog.csdn.net/lqy971966/article/details/104497600

6. 形成层次结构的存储设备

在处理器和一个较大较慢的设备(例如主存)插入一个更小更快的存储设备(例如,高速缓存存储器)的想法成为一个普遍的观念。
实际上,每个计算机系统中的存储设备都被组织成一个存储器层次模型,就像图1.9所展示的那样。
1.9
在这里插入图片描述

在这个层次模型中,从上至下,设备变得更慢、更大,并且每字节的造价也更便宜。

6.1 层次结构:

寄存器文件在层次模型中位于最顶部,也就是第0级或记为L0。
L1高速缓存处在第一层(所以称为L1)
L2高速缓存占据第二层
主存在第三层
以此类推存储器分层结构的主要思想是一个层次上的存储器作为下一层次上的存储器的高速缓存。

6.2 主要思想:

存储器分层结构的主要思想是一个层次上的存储器作为下一层次上的存储器的高速缓存。
如:寄存器是L1的高速缓存,L1是L2的高速缓存。

7. 操作系统管理硬件

7.1 软件层

我们可以把操作系统看成是应用程序和硬件之间插入的一层软件。
1.10
在这里插入图片描述

7.2 操作系统两个基本功能:

1.防止硬件被失控的应用程序滥用;
2.在控制复杂而又通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法

7.3 抽象概念;进程,虚拟存储器,文件

1.11
在这里插入图片描述

7.3.1 进程

进程是操作系统对运行程序的一种抽象。

1. 并发运行:

在一个系统上可以同时运行多个进程,而每个进程都好像独占地使用硬件,我们成为并发运行。
实际上是说一个进程的指令和另一个进程的指令是交错执行的。

2. 上下文和上下文切換:

操作系统保存进程运行所需的所有状态信息。这就是上下文( context)
操作系统实现这种交错执行(多进程并发运行)的机制称为上下文切換( context switching)
上下文包括许多信息,比如PC和寄存器文件的当前值,以及主存的内容。

在任何一个时刻,系统上都只有一个进程正在运行。当操作系统决定从当前进程转移控制权到某个新进程时,它就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权转移到新进程。新进程就会从它上次停止的地方开始
1.12
在这里插入图片描述

7.3.2 线程

参考多线程系列博客:
https://blog.csdn.net/lqy971966/category_8850399.html

7.3.3 虚拟存储器

虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,好像每个进程都在独占地使用主存。

虛拟地址空间:
	每个进程看到的存储器都是一致的,称之为虛拟地址空间。

1.13
在这里插入图片描述

说明:

1.内核空间:内核是操作系统总是驻留在存储器中的部分
	应用程序不允许读写这个区域的内容或者直接调用内核代码定义的函数
	
2.栈:临时变量,返回值等,向低地址扩展
	用户栈在程序执行期间可以动态地扩展和收缩
	调用函数时,栈就会增长每次我们从函数返回时,栈就会收缩
	
3.共享库:存放像C标准库和数学库这样共享库的代码和数据的区域

4.堆:动态分配的内存,向高地址扩展
	调用像malc和free这样的C标准库函数的结果,堆可以在运态地扩展和收缩
	
5.bss段数据:即未初始化全局变量的内存映射

6.数据段(只读数据段):即可执行文件的已初始化全局变量的内存映射

7.代码段:即可执行文件二进制代码的内存映射(可执行文件映像)

8.保留区域

参考:虚拟地址空间
https://blog.csdn.net/lqy971966/article/details/119378416

7.3.4 文件

文件只不过就是字节序列。

每个IO设备,包括磁盘、键盘、显示器,甚至于网络,都叮以被看成是文件。
系统中的所有输入输出都是通过使用称为 Unix I/O的一小组系统函数调用读写文件来实现的。

文件这个简单而精致的概念是非常强大的,因为它使得应用程序能够统一地看待系统中可能含有的所有各式各样的I/O设备。例如,处理磁盘文件内容的应用程序员可以非常幸福地无需了解具体的磁盘技术。进一步说,同一个程序可以在使用不同磁盘技术的不同系统上运行。

8. 利用网络系统和其他系统通信

现代操作系统通过网络和其他操作系统连接在一起。

网络也是一种I/O设备。
1.14
在这里插入图片描述

9. 下一步

一个很重要的观点,那就是系统不仅仅只是硬件。
系统是互相交织的硬件和系统软件的集合体,它们必须共同协作以达到运行应用程序的最终目的。

10. 总结

1. 计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序

2. 计算机内部的信息被表示为一组组的位,它们依据不同的上下文又有不同的解释方式

3. 程序被其他程序翻译成不同的形式,开始时是ASII文本,然后被编译器和链接器翻译成二进制可执行文件
   处理器读取并解释存放在主存里的二进制指令

4. 因为计算机花费了大量的时间在存储器、IO设备和CPU寄存器之间拷贝数据,
	所以系统中的存储设备就被按层次排列。
	CPU寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存储器和磁盘存储器
	在层次模型中位于更高层的存储设备比低层的存储设备要快,单位比特造价也更高

5. 操作系统内核是应用程序和硬件之间的媒介
	它提供三个基本的抽象概念:
		1.文件是对/O设备的抽象概念
		2.虚拟存储器是对主存和磁盘的抽象概念
		3.进程是处理器、主存和O设备的抽象概念
	
6. 网络提供了计算机系统之间通信的手段。
	从某个系统的角度来看,网络就是一种I/O设备

おすすめ

転載: blog.csdn.net/lqy971966/article/details/121115393