计算机系统-->计算机系统漫游
计算机系统漫游
信息就是位+上下文
- 位表示的是
0
和1
组成的序列,通常来说8
个位被组织成一组,称为字节,通常使用一个字节用来表示文本中的某些某些字符; - 对于仅仅使用
ASCII
表示的文本称为文本文件,其他的所有文件都是二进制文件; - 对于系统中的所有信息,磁盘文件,内存中的数据,内存中存放的用户数据以及网络上传输的数据,都是使用比特来进行存储表示的;
- 上下文决定了相同的比特片段的具体含义;
-
C
语言程序执行的大致过程:
预处理器—>编译器—>汇编器—>链接器
-
预处理阶段
- 预处理器
cpp
根据#
开头的命令,修改原始的程序,并且将#
开头的头文件进行包含,然后将文件的后缀名改为*.i
;
- 预处理器
-
编译阶段
- 编译器将
ccl
将上面得到的文件翻译成为*.s
汇编语言程序;
- 编译器将
-
汇编阶段
- 汇编器
as
将上面得到的文件翻译成为机器语言指令,并且将这些指令打包成为可重定位目标程序,修改文件后缀为*.o
;
- 汇编器
-
链接阶段
- 对于调用了标准库的函数,对于标准库函数需要单独预编译成为
*.o
文件,这些标准库函数文件通常是编译好的,链接阶段就是需要处理我们自己写的程序文件生成的*.o
文件和标准库文件的合并,通常是链接器来完成的,执行完成之后就是可执行文件;
- 对于调用了标准库的函数,对于标准库函数需要单独预编译成为
系统硬件知识
- 总线
- 表示的是贯穿系统的一组电子管道,通常用来传输定长的字节块,通常为
4
个字节,或者是8
个字节;
- 表示的是贯穿系统的一组电子管道,通常用来传输定长的字节块,通常为
-
I/O
设备-
I/O
设备是系统和外部设备的联系通道,通常可以包括:键盘,鼠标,显示器,IO
设备通过控制器或者适配器和I/O
总线相互联系,控制器表示的I/O
设备本身或者印刷的电路板;适配器表示的含义是主板插槽上面的卡;
-
- 主存
- 主存是一个临时性的存储设备,用来临时性的存程序和程序处理的数据。物理上面来说主存是由一组动态随机存取存储器芯片组成。从逻辑上面来说:存储器是一个线性的字节数组,并且每个字节都具有唯一的字节索引,地址编址通常从
0
开始进行编址。
- 主存是一个临时性的存储设备,用来临时性的存程序和程序处理的数据。物理上面来说主存是由一组动态随机存取存储器芯片组成。从逻辑上面来说:存储器是一个线性的字节数组,并且每个字节都具有唯一的字节索引,地址编址通常从
- 处理器
- *处理单元,简称是
CPU
,是解释或者执行存储在主存中指令的引擎。处理器的核心是大小为一个字的程序计数器,程序计数器用来存储下一条指令的地址; -
CPU
执行指令可能出现的操作- 加载:从主存复制一个字节或者一个字到寄存器,用来覆盖原来的内容;
- 存储:从寄存器复制一个字或者一个字节到主存的某个位置,用来覆盖这个位置上面原来的内容;
- 操作:将两个寄存器的内容复制到
ALU
,ALU
对这两个字节进行算术运算,并且将结果保存在一个寄存器里面; - 跳转:从指令里面抽取一个字,并且将这个字复制到程序计数器里面。
- *处理单元,简称是
- 高速缓存
- 高速缓存是用来弥补大型低速存储设备和小型高速存储设备之间的读取速度的差异,高速缓存设备基于的原理是程序具有访问局部区域里面代码和数据的特性;
- 通常存储设备是形成层次结构,用来加速访问速度的;
- 操作系统的两个作用:
- 防止硬件被失控的应用程序滥用;
- 向应用程序提供简单而一致的来控制复杂而又不同的硬件设备;
- 计算机的几个抽象表示
- 文件是对
I/O
设备的抽象; - 虚拟内存是对主存和
I/O
设备的抽象; - 进程是对处理器,主存,
I/O
设备的抽象;
- 文件是对
- 进程
- 为了是程序的代码和数据看起来是系统内存中唯一的对象。可以通过进程的概念来完成这种抽象。进程表示的是对一个正在运行程序的一种抽象;
- 并发运行:通过进程之间的上下文的快速切换是的各个进程之间看起来是同时执行的,但是实际上进程的指令是交错执行的。
- 上下文切换:操作系统保持跟踪进程所需要的所有状态信息,称为上下文,通常是寄存器里面的信息。当需要从一段代码切换到另一段代码时,就需要保存当前进程的上下文,以便于进程执行时的状态恢复;
- 程序执行时在内存上需要的空间;
程序代码和数据—>堆—>共享库—>栈—>内核虚拟内存
- 程序代码和数据:
- 代码和数据区域是直接按照可执行目标文件的内容进行初始化的;
- 堆:
- 使用
malloc
和free
这样额函数,可以在运行时动态的扩展堆的大小;
- 使用
- 共享库:
- 大约在内存空间的中间一部分是用来存储像
C
标准库和数学库这样的共享库代码和数据的区域;
- 大约在内存空间的中间一部分是用来存储像
- 栈:
- 用户栈使用来实现函数调用的,当函数调用时,栈会扩大,当函数返回时,栈会收缩;
- 内核虚拟内存
- 地址空间的顶部区域是为了内核保留的,不允许用户的应用程序直接访问这里面的内容,或者直接调用里面的函数,但是允许用户通过内核来调用里面的功能;