读书笔记Pt.1——《深入理解计算机系统》

简介: 信息就是上下文+位🤔什么意思?比如我们一个最简单的hello world 程序,生命周期是从一个.c文件(源文件)开始的,源文件实际上是0和1组成的位序列,8个位为一组。

image.png

我们了解过ASCII码,知道每个字符有对应的整数值,而 hello world 程序中每个字节为一个整数值,再对应成字符,像这样由ASCII组成的文件我们就称之为 文本文件 或者 二进制文件


这就是一个基本思想,系统中所有信息——磁盘文件,存储器的文件,网络上传输的数据都是一连串位表示的,而区分他们的唯一方法就是对象的上下文,不同的序列中一个同样的字节序可能表示一个整数,浮点数或者机器指令等等。


程序的翻译🤔

一个源文件的每一条语句都会被不同的程序转化成不同低级机器语言指令,然后按照一种被称为可执行目标程序的格式打包好,再以二进制磁盘文件的形式存起来。


编译器驱动程序读取源文件,并翻译成一个可执行目标文件,这个翻译过程其实就是

程序的编译问题(预处理,编译,汇编,链接),有点搞忘了就请移步我之前的博客,编译系统大致就是这样:

image.png

益处🤔

了解编译系统工作原理有啥好处啊?

  1. 优化程序性能
  2. 理解链接时出现的错误
  3. 避免安全漏洞
    (感觉都很废话但又不能不要~)
  4. 指令的理解🤔

计算机里,需要依靠处理器读取并解释储存在存储器里面的指令,此时源程序 hello.c 已经被翻译成了可执行目标文件 hello,并放在磁盘上。


系统的硬件组成🤔

要理解 hello 程序运行时发生了什么,就需要理解一个典型的系统硬件组织,我们以 Intel Pentium 产品模型为例,其他系统也有相同的外观和性能,这里不细讲因为有巨量的细节,书上也说了后面会细讲。

image.png

CPU 即中央处理单元,ALU 即算术/逻辑单元,PC 即程序计数器,USB 即通用串行总线

接下来就精炼的讲一讲一些基本概念呐:

1.总线

贯穿整个系统的一根电子管道,称作总线,作用就是携带信息并在各个部件之间传递,通常总线被设计传送定长字节的字节块,也就是字,字里面的字节数就是基本的系统参数,这就是为什么有我们之前讲到的32位机器字长4字节,64位机器字长为8字节。为了讨论方便,假设字长就是4,总线每次只传1个字。

2.I/O设备

即输入/输出设备,老四样还是键盘,鼠标,显示器以及存储数据和程序的磁盘驱动。

每个I/O设备会通过控制器或适配器与I/O总线相连,控制器和适配器之间的主要区别就是封装方式不同,前者位于设备本身或者主板的芯片组后者则是一个插在主板插槽上的卡。

3.主存

主存是一块临时存储设备,物理上讲就是一组动态随机存储存储器(DRAM)组成的,逻辑上讲就是一个线性的字节数组,每个字节都有其唯一的地址,地址从0开始,组成程序的每条机器指令都是由不同数量的字节构成的,因此,C程序变量相对应的数据项的大小是根据类型变化的,比如 int 需要4字节,short 需要2字节,double 需要8字节。

3.CPU

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


处理器会从计数器指向的存储器中读取指令,并解释其中的位,执行指令中的简单操作,然后更新计数器让他指向下一个指令,注意指令之间不一定相邻。


当然这种简单的操作并不多,还会围绕寄存器文件(一些1字长的寄存器组成),ALU(算术/逻辑单元,用于计算新的数据和地址)执行加载,存储,操作,跳转这些操作。


一句话,看上去只是指令集结构的简单实现,实际上是处理器使用了非常复杂的机制来加速程序运行。

高速缓存🤔

在 hello world 程序里,数据串初始是在磁盘上,然后复制到主存,最后从主存上复制到显示设备。从程序员的角度看,这些地址就是开销,减缓了程序“真正”工作。

上帝不会允许十全十美的东西出现,较大的存储设备比较小的运行的更慢,而高速设备的成本又十分的高,比如磁盘驱动器可能比主存大 1000 倍,但磁盘读取时间开销却是主存的 1*10^7 倍,因此更小更快的高速缓存存储器就应运而生了!

作为暂时的集结区域,用来存放处理器近期可能会处理的需要的信息,访问速度基本上与寄存器相媲美,这是位于处理器芯片的L1高速缓存,还有一个通过特殊总线连接到处理器的L2高速缓存,容量更大,访问时间是L1的5倍,但仍然比访问主存快 5-10倍。


L1和L2是依靠静态随机访问存储器的硬件技术实现的,现在比较新的系统甚至还有三级高速缓存,系统可以获得一个很大的存储器,同时访问速度也很快,原因是利用了高速缓存的局部性原理即程序具有访问局部区域的数据和代码的趋势。

相关文章
|
8月前
|
缓存 Java 数据库
Java内存缓存利器: Caffeine详细介绍
的文档支持。无论你是需要一个简单快速的内存缓冲区还是需要一个复杂可配置、支持各种驱逐策略和刷新策略等高级特性的内部数据结构,Caffeine都能够满足你的需求。
474 11
|
传感器 存储 iOS开发
【HarmonyOS NEXT调试全攻略】设备连接+运行环境一站式指南
本文提供HarmonyOS调试全面指南,涵盖设备连接与运行环境配置。包括模拟器操作、真机调试方法,及环境配置、功能模拟、故障排除等内容。核心覆盖Win/Mac双平台配置、真机级功能模拟、50+故障解决技巧等,助开发者高效调试。适合教育科普学习,错误之处欢迎指出。
1142 0
|
存储 机器学习/深度学习 人工智能
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
|
存储 大数据 关系型数据库
【数据库三大范式】让我们来聊一聊数据库的三大范式和反范式设计
数据库三大范式是指数据库设计中的规范化原则,它们分别是第一范式(1NF)第二范式(2NF)和第三范式(3NF)。第一范式(1NF)第二范式(2NF)第三范式(3NF)
|
存储 NoSQL 关系型数据库
面试官:别告诉我你管这个叫高可用
大家好。今天分享一篇写得很透彻的关于高可用的理解。以下是正文: 今天我们来聊一下互联网三高(高并发、高性能、高可用)中的高可用,看完本文相信能解开你关于高可用设计的大部分困惑
|
存储 分布式计算 Kubernetes
JuiceFS-开源分布式文件系统入门(一篇就够了)
讲解JuiceFS的一些概念、架构以及实操的案例
9461 0
JuiceFS-开源分布式文件系统入门(一篇就够了)
|
存储 测试技术 Apache
高效管理JMeter中的Cookies:测试工程师的全面指南
Apache JMeter的Cookie管理器是性能测试中的关键工具,用于模拟用户会话和保持状态。本文档详细介绍了如何配置和使用Cookie管理器:添加HTTP Cookie Manager到测试计划,配置清除每次迭代Cookies的选项,以及设置登录和验证请求。此外,还讨论了验证、调试、进阶配置,如Cookie政策、跨域Cookies和正则表达式提取Cookie。通过掌握这些步骤,可以提升测试的准确性和效率。
|
数据挖掘 数据处理 Python
【Python DataFrame 专栏】Python DataFrame 入门指南:从零开始构建数据表格
【5月更文挑战第19天】本文介绍了Python数据分析中的核心概念——DataFrame,通过导入`pandas`库创建并操作DataFrame。示例展示了如何构建数据字典并转换为DataFrame,以及进行数据选择、添加修改列、计算统计量、筛选和排序等操作。DataFrame适用于处理各种规模的表格数据,是数据分析的得力工具。掌握其基础和应用是数据分析之旅的重要起点。
606 2
【Python DataFrame 专栏】Python DataFrame 入门指南:从零开始构建数据表格
|
并行计算 关系型数据库 测试技术
PgSQL · 特性分析 · PostgreSQL 9.6 让多核并行起来
背景 经过多年的酝酿(从支持work process到支持动态fork共享内存,再到内核层面支持并行计算),PostgreSQL 的多核并行计算功能终于在2016年发布的9.6版本中正式上线,为PG的scale up能力再次拔高一个台阶,标志着开源数据库已经攻克了并行计算的难题。 相信有很多小伙伴已经开始测试了。 在32物理核的机器上进行了测试,重计算的场景,性能程线性提升。 目前并行计算支
6103 0
|
安全
辣椒病虫害图像识别挑战赛
辣椒病虫害图像识别挑战赛
891 0
辣椒病虫害图像识别挑战赛