深入理解计算机系统-第1章计算机系统漫游笔记

简介: 计算机系统是由硬件和系统软件组成,它们共同工作来运行应用程序。C 语言是系统级编程的首选,同时它也非常实用于应用级程序的编写。

深入理解计算机系统-计算机系统漫游笔记.md

1,信息就是位+上下文

  • 计算机系统是由硬件和系统软件组成,它们共同工作来运行应用程序。
  • C 语言是系统级编程的首选,同时它也非常实用于应用级程序的编写。

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

hello 程序为例来解释程序的生命周期,hello.c 文件代码如下:

#include <stdio.h>

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

为了在系统上运行 hello.c 程序,文件中的每条 C 语言都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打包好,并以二进制磁盘文件的形式保存。目标程序也称为可执行目标文件

在 Linux 系统中,GCC 编译器将源程序文件 hello.c 翻译(编译)为目标文件 hello 的过程分为四个阶段,如下图所示。执行这四个阶段(预处理器、编译器、汇编器和链接器)的程序一起构成了编译器系统(compilation system)。

image

3,了解编译器如何工作是有大有益处的

  1. 优化程序性能。了解一些机器代码(汇编代码)以及编译器将不同的 C/C++语句转化为机器代码的方式。比如一个函数调用的开销有多大?while 循环比 for 循环更有效吗?指针引用比数组索引更有效吗等?
  2. 理解链接时出现的错误。比如静态库和动态库的区别,静态变量和全局变量的区别等。
  3. 避免安全漏洞

4,处理器读取存在内存中的指令

典型系统的硬件组织构成: 总线、I/O 设备、主存(动态随机存取存取器 DRAM)、处理器。

主存是临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从逻辑上说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。

将 hello 程序输出的字符串从存储器写到显示器的过程如下图所示。

image

5,高速缓冲至关重要

针对处理器与主存之间读取数据的差异,处理器系统设计者采用了更小更快的存储设备,称为高速缓冲器(cache memory,简称 cache 或高速缓冲),作为暂时的集结区域,存放处理器近期可能会需要的信息。

image

6,存储设备形成层次结构

在处理器和一个较大较慢的设备(例如主存)之间插入一个更小更快的存储设备(例如高速缓冲)的想法已经成为一个普遍的观念。实际上,每个计算机系统中的存储设备都被组织成了一个存储器层次结构,如图1-9所示。在这个层次结构中,从上至下,设备的访问速度越来越慢、容量越来越大,并且每字节的成本也越来越低。

image

7,操作系统管理硬件

所有应用程序对硬件的操作尝试都必须通过操作系统,操作系统有两个基本功能:

  1. 防止硬件被失控的应用程序滥用;
  2. 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。

操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。文件是对 I/O 设备的抽象表示,虚拟内存是对主存和磁盘 I/O 设备的抽象表示,进程则是对处理器、主存和 I/O 设备的抽象表示。

7.1,进程

进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,每个进程都好像在独占地使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错之行的。在大多数系统中,需要运行的进程数是可以多于它们的 CPU 个数的。无论在单核还是多核系统中,一个 CPU 看上去都像是在并发地执行多个进程,这实际是通过处理器在进程间切换来实现的,操作系统实现这种交错执行的机制成为上下文切换

操作系统会保持跟踪进程运行所需的所有状态信息,这种状态信息称为上下文,其包括多种信息,比如 PC 和寄存器文件的当前值,以及主存的内容。在任何一个时刻,但处理器系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进行上下文切换,即保存当前进程的上下文、恢复进程的上下文,然后将控制权传递到新进程。图1-12展示了示例 hello 程序运行场景的基本理念。

image

7.2,线程

尽管我们直观认为一个进程只有单一的控制流,但在现代计算机系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。由于网络服务器对并行处理的需求,线程成为越来越重要的编程模型,因为多线程之间比多进程之间更容易共享数据且更高效。

7.3,虚拟内存

虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间。图 1-13 所示的是 Linux 进程的虚拟地址空间。在 Linux 中,地址空间最上面的区域是保留给操作系统中代码和数据的,这对所有进程来说都是一样。地址空间的底部区域存放用户进程定义的代码和数据。注意,图中的地址从下往上增大的。

image

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

  • 程序代码和数据。对所有进程来说,代码是从同一固定地址开始,进接着的是和全局变量和相对应的数据位置,代码和数据区是直接按照可执行目标文件的内容初始化的。
  • 。代码和数据区后紧随着的是运行时堆。代码和数据区在进程一开始运行时就被指定了大小,与此不同,当调用 mallocfree 这样的 C 标准库函数时,堆可以在运行时动态地拓展和收缩。
  • 共享库。地址空间的中间部分是一块用来存放像 C 标准库和数学库这样的共享库的代码和数据的区域。
  • 。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆类似,用户栈在程序执行期间可以动态地拓展和收缩,调用函数栈则增长,从一个函数返回,栈则收缩。
  • 内核虚拟内存。地址空间顶部的区域是为操作系统内核保留的。

虚拟内存的运作需要硬件和操作系统软件之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译,基本思想是把一个进程虚拟内存的内容存在在磁盘上,然后用主存作为磁盘的高速缓冲。

7.4,文件

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

8,系统之间利用网络通信

现代系统通过网络将单个计算机系统连接在一起。

image

9,重要主题

9.1,Amdahl 定律

该定律的主要思想就是,当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。

image

9.2,并发与并行

我们用术语并发(concurrency)是一个通用的概念,指一个同时具有多个活动的系统;而术语并行(parallelism)指的是用并发来是一个系统运行得更快。并行可以在计算机系统的多个抽象层次上运用,这里按照系统层次结构中由高到低的顺序描述三个层次。

1,线程级并发

超线程,有时称为同时多线程(simultaneous multi-threading),是一项允许一个 CPU 执行多个控制流的技术。它涉及 CPU 某些硬件有多个备份,比如程序计数器和寄存器文件,而其他硬件部分只有一份,比如执行浮点算术运算的单元。常规的处理器需要大约 20000 个时钟周期做不同线程间的转换,而超线程的处理器可以在单个周期的基础上决定要执行哪一个线程。

多处理器的使用可以从两方面提高系统性能,首先,它减少了在执行多个任务时模拟并发的需要;其次,它可以使应用程序运行得更快,前提是程序以多线程方式编写。

2,指令级并行

在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。如果处理器可以达到比一个周期一条指令更快的执行速率,就称为超标量(super-scalar)处理器,大多数现代处理器都支持超标量操作。

3,单指令、多数据并行

在最低层次中,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据,即 SIMD 并行。

9.4,计算机系统中抽象的重要性

前面我们介绍了计算机系统使用的几个抽象,如图 1-18 所示,在处理器里,指令集架构提供了对实际处理器的抽象。

image

操作系统中有四个抽象:文件是对 I/O 设备的抽象,虚拟内存时对程序存储器的抽象,进程是对一个正在运行的程序的抽象,虚拟机提供对整个计算机的抽象,包括操作系统、处理器和程序

参考资料

  • 《深入理解操作系统第三版-第1章》
相关文章
|
NoSQL API 网络架构
MongoDB REST Api介绍
MongoDB默认会开启一个HTTP协议的端口提供REST的服务,这个端口是你Server端口加上1000,比如你的Server端口为27017,那么这个HTTP端口就是28017,默认的HTTP端口功能是有限的,你可以通过添加–rest参数启动更多功能。
2280 0
|
算法 数据库 计算机视觉
Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
|
11月前
|
机器学习/深度学习 物联网
可控文生图:EliGen控制实体的位置细节变化
为文生图模型增加额外的控制条件一直是AIGC社区研究的重点之一,如ControlNet, IP-Adapter等一直是热门可控生成方法。近期,魔搭社区联合浙江大学对实体级可控文生图进行了探索,并开发了EliGen模型。
366 11
|
运维 Kubernetes Cloud Native
云原生时代下,如何高效构建与部署微服务
【9月更文挑战第8天】随着云计算技术的飞速发展,云原生已成为现代软件架构的重要趋势。本文将深入浅出地介绍云原生概念、微服务架构的优势以及如何在云平台上高效构建和部署微服务。我们将通过实际的代码示例,展示在Kubernetes集群上部署一个简单的微服务应用的过程,帮助读者理解云原生环境下的微服务开发和运维实践。
|
人工智能 边缘计算 运维
AI 时代下,操作系统的进化与重构
随着人工智能(AI)的迅猛发展,操作系统面临着前所未有的挑战和机遇。在这个新时代,操作系统需要进行深刻的进化与重构,以适应AI技术的广泛应用和不断变化的需求。
710 5
|
11月前
|
人工智能 小程序 数据挖掘
2025年企业CRM选型指南:销售易、金蝶、纷享销客对比
销售易、金蝶和纷享销客是国内知名的CRM解决方案,各自具备独特优势。销售易功能全面,涵盖销售、客户、营销管理及AI赋能,适合中大型企业;金蝶与ERP无缝集成,财务管理强大,适合传统企业;纷享销客连接能力强,用户体验佳,性价比高,适合中小企业。本文从功能、体验、价格、评价及适用场景对比三者,助力企业选择合适的CRM系统,推动数字化转型。
|
机器学习/深度学习 人工智能 自然语言处理
AIGC技术革新:智能创造如何重塑艺术与设计行业
AIGC技术,人工智能生成内容,正引领艺术与设计行业的变革。借助深度学习和自然语言处理等技术,AIGC能自动生成文本、图像等内容,丰富创作手段并提供创新机会。在艺术领域,它模拟各种风格作品,助力高效创作;在设计领域,它根据用户需求生成设计方案,提升个性化选择。AIGC打破了传统界限,提高了创作效率,并满足了用户的个性化需求。未来,随着技术进步和应用场景拓展,AIGC将在虚拟现实等领域的结合中,为艺术与设计带来更沉浸式、交互式的体验,重塑行业未来。【6月更文挑战第4天】
1350 1
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
251 1
|
存储 缓存 算法
优化Java后台性能的五大最佳实践
在高并发环境中,Java后台系统的性能至关重要。本文探讨了五种有效的优化方法,包括JVM调优、数据库连接池配置、代码优化技巧、异步处理的使用以及缓存机制的实现。通过这些实践,开发人员可以显著提升系统的响应速度和稳定性。
|
前端开发
CSS元素隐藏的多种方式:让你轻松实现页面布局
CSS元素隐藏的多种方式:让你轻松实现页面布局