第1章 计算机系统漫游

文章阐述了计算机系统中信息由位和上下文组成,程序经过预处理、编译、汇编和链接成为可执行文件。处理器解释存储在内存中的指令,存储设备形成层次结构以优化性能。操作系统管理硬件资源,提供进程、线程和虚拟内存等抽象概念,并通过网络实现系统间通信。
摘要由CSDN通过智能技术生成

1.1 信息就是位+上下文

  系统中所有的信息–包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据都是由一串比特表示的,区分不同数据对象的唯一方法就是我们读到这些数据对象时的上下文。
  例如:在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

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

hello.c
源程序文本
预处理器cpp
hello.i
修改后的源程序文本
编译器ccl
hello.s
汇编程序文本
汇编器as
汇编器as
hello.o
可重定位目标程序二进制
链接器ld
hello
可执行目标程序二进制
printf.o

GCC编译器驱动程序读取源程序文件hello.c,经过四个翻译阶段将它翻译成一个可执行的文件。具体学习可参考以下链接:link

1.3 了解编译器如何工作的益处

  1. 优化程序的性能
  2. 理解链接时出现的错误
  3. 避免安全漏洞

1.4 处理器读并结束存储在内存中的指令

1.4.1 系统的硬件组成

在这里插入图片描述

  1. 总线: 贯穿整个系统的一组电子管道,称作总线,它携带信息字节并负责在各个部件见传递。
  2. IO设备:系统与外部世界连接的通道;
  3. 主存:主存是由一组动态随机存取存储器(DRAM)芯片组成的
  4. 处理器:中央处理器(CPU)简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序寄存器。一般会执行以下操作:加载、存储、操作、跳转。

1.4.2 运行hello程序

  当我们在键盘上输入字符串“./hello" 后,shell 程序就逐一读取字符到寄存器,再把它存放到存储器中,一旦hello 目标文件中的代码和数据被加载到了存储器,处理器就开始执行hello 程序的主程序中的机器语言指令。这些指令将“hello, world\n” 串中的字节从存储器中拷贝到寄存器文件,再从寄存器中文件拷贝到显示设备,最终显示在屏幕上。

1.5 高速缓存至关重要

  系统花费了大量的时间把信息从一个地方挪到了另外一个地方,因此系统设计者的一个主要的目标就是是这些复制操作能够尽快的完成。系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache memories, 简称高速缓存),它们被用来作为暂时的集结区域,存放处理器在不久的将来可能会需要的信息。

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

  实际上,每个计算机系统中的存储设备都被组织成一个存储器层次模型。具体结构如图所示:
在这里插入图片描述
  程序员可以运用L1和L2的知识来提高程序性能一样,程序员同样可以利用对整个存储器层次模型的理解来提高程序性能。

1.7 操作系统管理硬件

  所有应用程序对硬件的操作尝试都必须通过操作系统。操作系统有两个基本功能:防止硬件被失控的应用程序滥用;在控制复杂而又通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法。

1.7.1 进程

  进程是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。我们称之为并发运行,实际上是说一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换
  操作系统保存进程运行所需的所有状态信息。这种状态,也就是上下文(context) ,包括许多信息,比如PC 和寄存器文件的当前值,以及主存的内容。在任何一个时刻,系统上都只有一个进程正在运行。当操作系统决定从当前进程转移控制权到某个新进程时,它就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权转移到新进程。新进程就会从它上次停止的地方开始。

1.7.2 线程

  在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程也是一种可以使程序运行的更快的方法。

1.7.3 虚拟内存

  虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,好像每个进程都在独占地使用主存。每个进程看到的存储器都是一致的,称之为虚拟地址空间。每个进程看到的虚拟地址空间由大量准确定义的区(area) 构成,每个区都有专门的功能。如图所示,图中的地址是从下往上增大的。
在这里插入图片描述

程序代码和数据。代码是从同一固定地址开始,紧接着的是和C 全局变量相对应的数据区。代码和数据区是由可执行目标文件直接初始化的,在我们的示例中就是可执行文件hello。
。代码和数据区后紧随着的是运行时堆。代码和数据区是在进程一旦开始运行时就被指定了大小的,与此不同,作为调用像malloc 和free 这样的C 标准库函数的结果,堆可以在运行时动态地扩展和收缩。
共享库。在地址空间的中间附近是一块用来存放像C 标准库和数学库这样共享库的代码和数
据的区域。共享库的概念非常强大,但是也是个相当难懂的概念。在第7 章我们学习动态链时,将学习共享库是如何工作的。
。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。特别地,每次我们调用一个函数时,栈就会增长。每次我们从函数返回时,栈就会收缩。在第3 章中你将学习编译器是如何使用栈的。
内核虚拟存储器。内核是操作系统总是驻留在存储器中的部分。地址空间顶部的四分之一部分是为内核预留的。应用程序不允许读写这个区域的内容或者直接调用内核代码定义的闭数。

1.7.4 文件

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

1.8 系统之间利用网络通信

  当系统从主存拷贝一串字符到网络适配器时,数据流经过网络到达另一台机器,而不是到达本地磁盘驱动器。相似地,系统可以读取从其他机器发送来的数据,并把数据拷贝到自己的主存。
在这里插入图片描述

1.9 下一步

   系统不仅仅只是硬件。系统是互相交织的硬件和系统软件的集合体,它们必须共同协作以达到运行应用程序的最终目的。

1.9.1 Amdahl定律

  当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要程度。其中应用程序的执行某程序的时间为: Told为执行某程序所需要的时间,假设系统某部分所需执行的时间为k,而该部分性能提升比例为α,则优化后的总时间为Tnew,加速比为S。
T n e w = ( 1 − α ) T o l d + ( α T o l d ) / k S = 1 ( 1 − α ) + α / k T_{new} = (1 - \alpha)T_{old} + (\alpha T_{old})/k\\ S = \frac{1}{(1 - \alpha)+{\alpha}/{k}}\\ Tnew=(1α)Told+(αTold)/kS=(1α)+α/k1

1.9.2 并发和并行

  设计出同时有多个程序执行的系统,导致了并发。

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

  抽象的使用时计算机科学中最为重要的概念之一。操作系统核是应用程序和硬件之间的媒介。它提供三个基本的抽象概念:文件是对IO设备的抽象概念;虚拟存储器是对主存和磁盘的抽象概念;进程是处理器、主存和I/O设备的抽象概念。

1.10 小结

  计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位,它们依据不同的上下文又有不同的解释方式。程序被其他程序翻译成不同的形式,开始时是ASCII 文本,然后被编译器和链接器翻译成二进制可执行文件。
  处理器读取并解释存放在主存里的二进制指令。因为计算机花费了大量的时间在存储器、I/O设备和CPU 寄存器之间拷贝数据,所以系统中的存储设备就被按层次排列, CPU 寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM 主存储器和磁盘存储器。在层次模型中位千更高层的存储设备比低层的存储设备要快,单位比特造价也更高。程序员通过理解和运用这种存储层次结构的知识,可以优化他们C程序的性能。
  操作系统内核是应用程序和硬件之间的媒介。它提供三个基本的抽象概念:文件是对I/O设备的抽象概念;虚拟存储器是对主存和磁盘的抽象概念;进程是处理器、主存和I/O设备的抽象概念。
  最后,网络提供了计算机系统之间通信的手段。从某个系统的角度来看,网络就是一种I/O设备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值