【深入理解计算机系统-笔记-第1章】概要了解计算机系统

为了更深入的计算机系统的工作原理,这次下定决心,要把这些放在书架子上吃灰的“硬核”知识点啃一啃了。

本来想着就看纸质书算了,但是有感觉眼睛看一遍到底理解和记忆的程度会很浅,所以干脆找到电子版的,边看边记录,如果能有自己的理解和想法,顺手就记下来。一来加深记忆,二来之后再回顾的时候直接看笔记,内容更少,更方便了。

我根据自己的理解,总结形式不一定严格按照书中的格局。

本书书名《深入理解计算机系统》

本书第1章:计算机系统漫游

编译四阶段

在这里插入图片描述

预处理阶段

预处理器( cpp) 根据以字符# 开头的命令, 修改原始的C 程序。比如 hello.c中第1 行的#include<stdio.h>命令告诉预处理器读取系统头文件 stdio.h 的内容, 并把它直接插人程序文本中。结果就得到了另一个C 程序, 通常 是以 .i 作为文件扩展名。

编译阶段

编译器( ccl) 将文本文件hello.i 翻译成文本文件hello.s , 它包含一 个汇编语言程序

汇编阶段

接下来, 汇编器( as ) 将hello.s翻译成机器语言指令, 把这些指令打包成 一种叫做可重定位目标程序( relocatable object program ) 的格式, 并将结果保存在目标 文件hello.o 中,hello.o 文件是一个二进制文件, 它包含的17 个字节是函数main 的指令编码。如果我们在文本编辑器中打开hello.o文件, 将看到一堆乱码。

链接阶段

请注意, hello程序调用了printf 函数, 它是每个C 编译器都提供的 标准C 库中的一个函数 printf 函数存在于一个名为printf.o 的单独的预编译 好了的目标文件中, 而这个文件必须以某种方式合并到我们的hello.o 程序中。链 接器( ld ) 就负责处理这种合并。结果就得到hello 文件, 它是一个可执行目标文件 ( 或者简称为可执行文件) , 可以被加载到内存中, 由系统执行。

见书中第4页, P4

了解编译系统的益处

以下问题先留着,之后再补充回答。

优化程序性能

个switch 语句是否总是比一系列的if - else 语旬高效 得多?
一个函数调用的开销有多大?
while 循环比for 循环更有效吗?
指针引用比数 组索引更有效吗?
为什么将循环求和的结果放到一个本地变量中, 会比将其放到一个 通过引用传递过来的参数中, 运行起来快很多呢?
为什么我们只是简单地重新排列一 下算术表达式中的括号就能让函数运行得更快?

理解链接时出现的错误

链接器报告说它无 法解析一个引用, 这是什么意思?
静态变量和全局变量的区别是什么? 如果你在不 同的C 文件中定义了名字相同的两个全局变量会发生什么?
静态库和动态库的区别 是什么?
我们在命令行上排列库的顺序有什么影响?
最严重的是, 为什么有些链接 错误直到运行时才会出现?

避免安全漏洞

缓冲区溢出错误是造成大多数网络和Intemet 服务器上安 全漏洞的主要原因。存在这些错误是因为很少有程序员能够理解需要限制从不受信 任的源接收数据的数量和格式。学习安全编程的第一步就是理解数据和控制信息存 储在程序栈上的方式会引起的后果。

存储

本书得出的重要结论之一就是, 意识到高速缓存存储器存在的应用程序员能够利用高速缓 存将程序的性能提高一个数量级。
在这里插入图片描述
T: 可以将每一个上级存储,理解为是下层的缓存。

操作系统

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

  1. 防止硬 件被失控的应用程序滥用;
  2. 向应用程序 提供简单一致的机制来控制复杂而又通常大 不相同的低级硬件设备。操作系统通过几个 基本的抽象概念( 进程、虚拟内存和文件) 来 实现这两个功能。

抽象的重要性

  • 文件是对I/O设备的抽象表示
  • 虚拟内存是对主存和磁盘Ⅰ/ o 设备的抽象表示
  • 进程则是对处理 器、主存和Ⅰ/ o 设备的抽象表示
  • 虚拟机, 它提供对整个计算机的抽象, 包括操作系统、处理器和程序

进程

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

操作系统保持跟踪进程运行所需的所有状态信息。这种状态, 也就是上下文, 包括许 多信息, 比如P C 和寄存器文件的当前值, 以及主存的内容。在任何一个时刻, 单处理器 系统都只能执行一个进程的代码。当操作系统决定要把控制权从当前进程转移到某个新进 程时, 就会进行上下文切换, 即保存当前进程的上下文、恢复新进程的上下文, 然后将控制权传递到新进程。新进程就会从它上次停止的地方开始。

从一个进程到另一个进程的转换是由操作系统内核( kernel) 管理的。 内核是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时, 比如读写 文件, 它就执行一条特殊的系统调用( systemcall ) 指令, 将控制权传递给内核。然后内核 执行被请求的操作并返回应用程序。注意, 内核不是一个独立的进程。相反, 它是系统管 理全部进程所用代码和数据结构的集合。

在现代系统中, 一个进程实际上 可以由多个称为线程的执行单元组成, 每个线程都运行在进程的上下文中, 并共享同样的 代码和全局数据。由于网络服务器中对并行处理的需求, 线程成为越来越重要的编程模 型, 因为多线程之间比多进程之间更容易共享数据, 也因为线程一般来说都比进程更高 效。

虚拟内存

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

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

文件

统中的所有输人输出都是通过使用一小组称为U n i x I / o 的系统函数调用读写文件来实现的。

重要主题

Gene Amdahl , 计算领域的早期先锋之一, 对提升系统某一部分性能所带来的效果做 出了简单却有见地的观察。这个观察被称为A m d a h l 定律( A m d a h l , s l a w ) 。该定律的主要 思想是, 当我们对系统的某个部分加速时, 其对系统整体性能的影响取决于该部分的重要 性和加速程度。
A m d a h l 定律的主要观点一要想显著加速整个系统, 必须提升全系统中相当大的部分的速度。

A m d a h l 定律描述了改善任何过程的一般原则。除了可以用在加速计算机系统方面之 外, 它还可以用在公司试图降低刀片制造成本, 或学生想要提高自已的绩点平均值等方 面。也许它在计算机世界里是最有意义的, 在这里我们常常把性能提升2 倍或更高的比例 因子。这么高的比例因子只有通过优化系统的大部分组件才能获得。

并发与并行

  • 线程级并发
    多核和超线程系统的出现才极大地激发了一种愿望, 即找到书写应用程 序的方法利用硬件开发线程级并行性。

  • 指令级并行
    现代处理器可以同时执行多条指令的属性称为指令级并行。(指令流水线)

  • 单指令/多数据并行
    一条指令产生多个可以并行执行的操作, 这种方式称为单指令、多数据, 即SIMD 并行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值