第一章 计算机系统漫游

代码段的生命周期

hello.c

#include

int main()

{

printf("hello world!\n");

return 0;

}

1.1 前序

源程序(源文件)实际上就是一个由0和1组成的位(又成比特bit)序列,8个位被组组成一组,称为字节。每个字节表示程序中的某些文本字符(大部分的现代计算机系统都使用ASCII标准来表示文本字符)

1.2 编译过程

hello.c -> 预处理器(cpp) -> hello.i(修改了源程序文本-将#include、宏 进行相应的替换) -> 编译器(ccl) -> hello.s(翻译成汇编程序文本) -> 汇编器(as) -> hello.o(翻译成机器语言指令) -> 链接器(ld) -> hello(可执行文件)

1.3 系统硬件的执行流程

系统硬件的组成

1.总线

贯穿剩个系统的是一组电子管道,称为总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传递定长的字节块,也就是子(word).字重的字节数(即字长)是一个基本的系统参数,各个系统中都不尽相同.现在的大多数机器字节长要么是4个字节(32位),要么是8个字节(64位)

2.I/O设备

I/O(输入/输出)设备是系统与外部世界的联系通道

3.主存

主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据.从物理上来说,主存是由一组动态随机存存取存储器(DRAM)芯片组成的.从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的.一般来说,组成程序的每条机器指令都由不同数量的字节构成

4.处理器

中央单元处理器(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎.处理器的核心是一个为一个字的存储设备(或寄存器),称为程序计数器(PC).在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)

从系统痛点开始,直到系统断电,处理器一直在不断地执行程序计算器指向的指令,在更新程序计数器,使其指向下一条指令.处理器看上去是按照一个非常简单的执行模型来操作的,这个模型是由指令集架构决定的.这个模型中,指令按照严格的顺序执行,而执行一条指令包含执行一系列步骤.处理器从程序计数器指向的内存处读取指令,解释执行中的位,执行指令指示的简单操作,然后更新PC,使其指向下一条指令,而这条指令并不一定和内存中刚跟执行的指令相邻.

这样的简单操作并不多,它们围绕着主存、寄存器文件(register file)和算数/逻辑单元(ALU)进行.寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字.ALU计算新的数据和地址值.下面是一些简单的操作的例子,CPU在指令的要求下可能会执行这些操作

- 加载:从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容

- 存储:从寄存器复制一个字节或者一个字到主存的某个位置,已覆盖这个位置上原来的内容

- 操作:把两个寄存器的内容复制到ALU,ALU对着两个字做算术运算,并将结果存放到一个寄存器中,已覆盖寄存器中原来的内容

- 跳转:从指令本身抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值

1.4 存储设备形成层次结构

在处理器和一个较大较慢的设备(例如主存)之间插入一个更小更快的存储设备(例如告诉缓存)的想法已经成为一个普遍的观念.实际上,每个计算机系统中的存储设备都被组织成了一个存储器层次结构,在这个层次结构中,从上至下,设备的访问速度越来越慢,容量越来越大,并且每个字节的造价也越来越便宜.寄存器文件在层次结构中位于顶层,也就是第0级或记为L0.

1.5 操作系统硬件管理

操作系统有两个基本的功能:

- 防止硬件被失控的应用程序滥用

- 向应用程序提供简单一直的机制来控制复杂而又通常大不相同的低级硬件设备

操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能

![](https://img2020.cnblogs.com/blog/1585694/202010/1585694-20201028114153849-2030273858.png)

如上图所示:文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示

进程

```进程```是操作系统对一个正在运行的程序的一种抽象.在一个系统上可以同时运行多个进行,而每个进程都好像在独占地使用硬件.而```并发运行```,则是说一个进程的指令和另一个进程的指令是交错执行的.在大多数系统中,需要运行的进程数是多于可以运行他们的CPU个数的.传统系统在一个时刻只能执行一个程序,而先进的多核处理器同时能够执行多个程序,这是通过处理器在进程间切换来实现的.操作系统是新建这种交错的机制称为```上下文切换```

操作系统保持跟踪进程运行所需的所有状态信息.这种状态,也就是上下文,包括许多信息,入PC和寄存器we年的当前值.当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存了当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程.新进程就会从它上次停止的地方开始

线程

尽管通常我们认为一个进程只有单一的控制流,但是在现代系统中,一个进程实际上可以由多个称为```线程```的执行单元组成,每个线程都运行在进行的上下文中,并共享同样的代码和全局数据.由于网络服务器中对并行处理的需求,现场称为越来越重要的编程模型,因为多线程之间比多进程之间更容易数据共享,也因为线程一般来说都比进程更高效.当有多处理器可用的时候,多线程也是一种使得程序可以运行的更快的方法

虚拟内存

虚拟内存是一个抽象的概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存.每个进程看到的内存都是一致的,称为```虚拟地址空间```.

在Linux中,地址空间最上面的区域是保留给操作系统中的代码和数据的,这对所有进程来说都是一样的.地址空间的底部区域存放用户进行定义的代码和数据(下图中地址是从下往上增大的)

每个进程看到的虚拟地址空间由大量准确定义的区域构成,每个区都有专门的功能

- 程序代码和数据:对所有的进程来说,代码时从同一固定地址开始,紧接着是和C全局变量相对应的数据位置.代码的数据区是直接按照可执行目标we年的内容初始化,在示例中就是可执行文件 hello.

- 堆:代码和数据区后紧随着的是运行时```堆```.代码和数据区在进程一开始运行时就被制定了大小,与此不同,当调用了malloc和free这样的C标准库函数时,堆可以在运行时动态地扩展和收缩

- 共享库:大约在地址空间的中间部分是一块用来存放像C标准库和数学库的共享库的代码和数据的区域.共享库的概念非常强大,也相当难懂

- 栈:位于用户虚拟地址空间顶部的是```用户栈```,编译器用它来实现函数调用.和堆一样,用户栈在程序执行期间可以动态的扩展和收缩.特别的,每次我们调用一个函数时,栈会增长;从一个函数返回时,栈胡收缩

- 内核虚拟内存:地址空间顶部的区域是为了内核保留的.不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数.相反,它们必须调用内核来执行这些操作

文件

文件就是字节序列,仅此而已.每个I/O设备,包括磁盘、键盘、显示器、甚至网络,都可以看成是文件.系统中的所有输入输出都是通过使用一小组称为 Unix I/O的系统函数调用来读写文件实现的

文件这个简单而精致的概念是非常强大的,因为它向应用程序提供了一个统一的视图.

1.6 系统之间利用网络通讯

现代系统经常通过网络和其他系统连接到一起.从一个单独的系统来看,网络可以视为一个I/O设备.当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,而不是比如说到达本地磁盘驱动器.相似地,系统可以读取从其他机器发来的数据,并把数据复制到自己的主存.

随着Internet这样的全球网络出现,从一台主机复制信息到另外一台主机已经成为计算机系统最重要的用途之一.例如:电子邮件、即时通讯、万维网、FTP、和Telnet这样的应用都是基于网络复制信息的功能

1.9 Amdahl定律

![](https://img2020.cnblogs.com/blog/1585694/202010/1585694-20201028142434217-424989952.png)

深入理解计算机系统 视频教程,深入理解计算机系统1相关推荐

  1. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  2. 调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优。

    调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优.  个人理解

  3. 理解SSL必须要理解的密码技术

    要理解SSL就必须理解密码系统.消息摘要函数(单向或散列函数)和数字签名,这些技术是许多文献所讨论的主题(比如[AC96),提供了保密性.完整性和认证的基础. 密码系统 假设Alice想给她的银行发一 ...

  4. 计算机系统的组成doc,计算机系统的基本组成.doc

    计算机系统的基本组成 计算机系统的基本组成 完整的计算机系统系统包括:硬件系统和软件系统.硬件系统和软件系统互相依赖,不可分割,两个部分又由若干个部件组成(如图所示). 硬件系统是计算机的" ...

  5. 【Day 3】机器阅读理解——常见机器阅读理解模型(下)

    引言 本文介绍常见机器阅读理解模型中的R-NET.FusionNet和QA-Net. 上一篇: 机器阅读理解--常见机器阅读理解模型(上) 下一篇: R-NET R-Net1在Attention计算中 ...

  6. 通用计算机系统和嵌入式计算机系统相同点,嵌入式计算机系统同通用型计算机系统相比有什么特点?...

    原标题:嵌入式计算机系统同通用型计算机系统相比有什么特点? 嵌入式系统是计算机技术.通信技术.半导体技术.微电子技术.语音图像数据传输技术等先进技术和具体应用对象相结合后的更新换代产品.系统无多余软件 ...

  7. 自然语言理解,什么是“理解”?

    以前看过一本讲西方哲学史的书,书上有一个笑话,就是一个哲学家提出了一个问题:什么是人?然后其他人回答说身上没毛且长两条腿的动物,第二天哲学家就抓了一只拔了毛的鸡,说:看这就是你说的 "人&q ...

  8. 【深入理解计算机操作系统】01_计算机系统漫游

    学习总路线 以hello程序的整个生命周期来开始对系统的学习 #include<stdio.h> int main() {printf("hello world!\n" ...

  9. 计算机系统:深入理解计算机系统--第三章摘抄

    参考材料:深入理解计算机系统(第3章) 1. (3.2.1)计算机machine-level programming重要的两类抽象: 一个重要抽象,是将format and behavior of a ...

最新文章

  1. 【观点】“另类”设计模式
  2. C++多线程简单入门(二)(Windows版)
  3. Windows Server 2008 R2修改远程桌面连接数
  4. Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
  5. 王者服务器维护宝箱礼包都没领,王者荣耀:S19战令最后一天,还没领取奖励的玩家要注意了...
  6. 云服务器登陆修改文件,香港云服务器使用注意事项(windows版)
  7. 基于.NetCore结合docker-compose实践Gitlab-CI/CD 排坑指南
  8. 虚拟机间延迟测量_简单的类来测量延迟
  9. rust风化速度_反驳《Golang、Rust的执行速度的对照,让人大吃一惊。》——不会别瞎说...
  10. python基础-C扩展
  11. python 的库如何开发_一篇文章入门Python生态系统
  12. IPv6 解说 ,与IPv4的同异
  13. os.path.realpath(__file__) 得到错误路径,与解决方案
  14. Node.js 借助art-template进行后端渲染并呈现页面到前端
  15. postgresql 加载参数文件
  16. 英特尔® 处理器显卡
  17. matlab 附录 周开利,【新书推荐】【2005.07】神经网络模型及其MATLAB仿真程序设计(周开利)...
  18. 1、mysql创建事件
  19. 解决 java 程序中 CPU 占用率过高问题
  20. Nexus3搭建jenkins报错 下载 依赖jar包 报错Not authorized

热门文章

  1. AUTOSAR从入门到精通100讲(二十六)-AutoSar之微控制器抽象层MCAL
  2. python 方程组 整数解_用Python语言求解线性整数方程组
  3. C语言switch怎么算,超级新手,用switch写了个计算器程序,求指导
  4. 【前端面试题】2021/3/12挺经典的面试题,这个经历很深刻。
  5. 前端使用正则表达式获取地址栏URL参数的值并将需要的参数值展示在页面
  6. java list 合并去重_java 怎么把多个list 合并成一个去掉重复的
  7. selenium java测试_java+selenium 自动化测试
  8. vue-router 响应路由参数的变化
  9. vue组件-使用插槽分发内容(slot)
  10. 子元素的margin-top会影响父元素