深入理解计算机系统第四版_《深入理解计算机系统》第一章 计算机系统漫游...

7ccac16bdb50ff83356e1e4c2dda34c2.png

1.1 信息就是上下文

对于电脑来说,信息都是二进制。在不同的上下文中,同样的字节序列可能表示整数、浮点数、字符串或者机器指令。

一切都是比特,到了二进制级别,一切都没有区别了。计算机也必须又上层告诉它一串代码到底是什么东西。这就是所谓上下文。

1.2 程序被其他程序翻译成不同的格式

编译流程

源程序 -》预处理器 -》被修改的源程序 -》编译器 -》汇编程序-》汇编器 -》.o文件,可重定位的目标程序 -》 连接器 -》可执行程序。

  • 预处理阶段 预处理器(cpp)处理include,宏等,得到.i中间文本文件
  • 编译阶段 编译器(ccl)将.i文件翻译成汇编程序,得到.s文本文件
  • 汇编阶段 汇编器(as)将.s文件翻译成机器语言指令,得到.o二进制文件
  • 链接阶段 链接器(ld)链接其他需要的.o文件,得到可执行目标二进制文件

使用gcc编译单个文件,可以设置不同的参数,得到中间文件。 gcc参数

gcc -E hello.c > ttt.txt 只激活预处理,需要手动重定向
gcc -E hello.c | more 

gcc -S hello.c   生成.s文件
gcc -c hello.c   生成.o
gcc -o hello.exe hello.c    -o指定输出文件
gcc -o hello.asm -S hello.c

1.3 了解编译系统如何工作是大有益处的

  • 优化程序性能
如果知道一些编译知识,就可以有针对性的对代码做一些调整,以便编译器做出更好的优化。
  • 理解链接时出现的错误
  • 避免安全漏洞 例如缓冲区溢出

1.4 系统的硬件构成

  • 总线 总线宽度决定字长
总线宽度可以理解为有多少根细小的电线,一个电线可以表达一个位,所以总线宽度就是系统一次能传送的最大数据量。所以数据最好都是总线宽度的倍数。
  • I/O设备 包括鼠标、键盘、显示器、磁盘
  • 主存 即内存。
  • 处理器 即CPU。处理器的核心是一个被称为程序计数器(PC)的字长大小的存储设备(寄存器)。

92f014332165bf15f2a0fcc805894314.png

1.5 高速缓存

一个程序运行,系统首先要从硬盘读取数据到内存中,然后CPU逐条执行指令,不断的跟主存进行交互。系统花费大量时间在数据的拷贝上,所以系统需要使这些拷贝动作尽可能的快。

根据机械原理,较大的存储设备要比较小的存储设备运行的慢。为了解决处理器与磁盘读取之间速度鸿沟,于是出现了“高速缓存存储器”。

本书的重要课题之一就是帮助程序员理解高速缓存存储器的机理,并利用这些知识极大的提高程序的性能。见第六章。

空间越大的设备,物理体积可能越大?所以物理上来看读取的物理指针要花费更多的时间来移动?

1.6 形成层次结构的存储设备

d3f5b21ecb230887656376ca6133a0d4.png

在处理器和一个较大较慢的设备之间插入一个较小的,更快的存储设备的想法成为一个普遍的观念。实际上,每个计算机系统中的存储设备都被组织成一个存储器层次结构。

思考:这个设计想法可以在很多方面精心应用,增加多一级别的缓存,提高查询效率,再实现一套替换规则,是否已经有类似现成的功能。
例如:Node查询,使用一个小型缓存结构。增加这种结构的问题是产生了冗余数据,更新node的时候需要同时更新缓存结构。适合一个管理器内部自己实现,不暴露给外部。内部自己维护好数据。
为什么计算机存储设备没有这个问题?高速缓存中的数据会不会变成脏数据?
因为各种缓存及主存对系统来说,统一构成了一个完整的虚拟存储器,实际上一份数据并不会冗余的存储在多个地方。

1.7 操作系统管理硬件

操作系统有两个主要用途:

  • 防止硬件被失控的应用滥用
  • 为应用程序提供简单一致的方法来访问控制复杂及各部相同的硬件。

操作系统使用进程、虚拟存储器和文件等抽象概念来实现这两个功能

dc7c628547bfcd55a9d5566145134dde.png

1.7.1 进程

进程是计算机科学中最重要和最成功的概念之一。进程是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用硬件。我们称之为并发运行,实际上是一个进程的指令和另个进程的指令交错执行的,操作系统的这种交错机制称为上下文切换。上下文就是进程运行所需的所有状态信息。

6f7832c0a0b314ac0468490fe280df3b.png

1.7.2 线程

每个线程都运行在进程的上下文中,并共享相同的代码和全局数据。多线程之间比多进程更容易共享数据。线程一般都比进程更高效

1.7.3. 虚拟存储器

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

b01c08f5a717b48caa58b27d7eeebb23.png
  • 程序代码和数据。代码都是从同一固定地址开始的,即 0x08048000。紧接着是C全局变量的数据区。
  • 堆。运行时堆,即new申请内存的地方。
  • 共享库。标准库等。
  • 栈。编译器用它来实现函数调用,在程序执行期间可以动态的扩展和收缩。
  • 内核虚拟存储器。内核预留。应用程序不允许读写这个区域的内容或者调用相关函数。
对于win32程序来说,默认情况下只能处理2G的内存区间,可以通过editbin /largeadressaware exepath来让程序可以支持超过2G的内存地址。在32位机器上,开启了这个设置也没啥用,还得开启系统的3G选项。在64位机器上则可以直接使用到4G的内存空间。
解决Win32程序内存超2G崩溃问题

1.7.4 文件

文件只不过是字节序列。每个I/O设备,包括磁盘、键盘、显示器,甚至于网络,都可以被当成是文件。文件这个简单而精致的概念异常的强大,它使得应用程序能够统一的看待系统中可能含有的各式各样的I/O设备。

1.10 小结

  • 计算机系统是有硬件和系统软件组成的,他们共同协作以运行应用程序。
  • 操作系统内核是应用程序和硬件之间的媒介。它提供三个基本概念:
  • 文件 是对I/O设备的抽象
  • 虚拟存储器是对主存和磁盘的抽象概念
  • 进程是处理器、主存和I/O设备的抽象概念
通过本章的学习,我们对计算机的组成有了初步的了解。计算机的主要组成部分,存储器的层次结构,编译的几个步骤,文件系统的抽象,进程线程等等。这些基本概念对后续的学习和认知都举足轻重。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值