1.1信息就是位+上下文

系统中所有的信息都是由一串位组成的, 所谓的位就是bit, 每八位是一个字节也就是byte, 理论上讲所有的文件可以分为两种, 一种是由ascii字符组成,这种我们也称作文本文件(其实其他字符编码也算, 这里不考虑), 剩下的都叫做二进制文件。所以其实一个文件到底会被如何翻译其实完全取决于上下文。

 

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

文中举了C语言的例子:

源文件(src.c)经过预处理器(cpp)生成被修改的源文件(src.i)然后经过编译器(ccl)生成汇编代码(src.s)然后是汇编器(as)生成可重定位的目标程序(src.o,从这里开始就是二进制文件了),最后经过链接器(ld)生成可执行文件。

这里我解释一下可重定位, 所谓的重定位定位的是地址, 因为只有经过了前面的编译处理才能得出最终数据段(.data)以及代码段(.text)的最终大小, 重定位在于为指令和全局变量等分配实际的系统空间。

 

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

如果能够弄懂编译系统工作原理, 可以在性能优化, 解决链接错误以及避免安全漏洞等方面有更加全面的了解。

 

1.4处理器读并解释存储在存储器中的设备

  1. 首先对于系统硬件组成的一个基本的认识 :
      • 总线用来携带信息字节贯穿整个系统,其传送的字节块被称之为字, 字中的字节数是一个基本的系统参数也叫做字长, 一般为32位或者是64位。
      • IO设备是系统与外界的联系, 比较常见的比如输入设备键盘鼠标,输入设备显示器磁盘等。
      • 主存也(DRAM)就是我们平时说的内存, 从物理角度看, 可以看出是线性的数组。
      • 处理器是解释或者执行存储在主存中指令的引擎。
  2. 那么一个程序的运行主要是以下过程: 当我们用./src(这里默认指linux的shell中)调用src可执行文件时, 外壳执行一系列指令来加载src文件, 将src文件中的数据从磁盘复制到内存中, 然后处理器开始执行数据中包含的机器指令, 这些指令将helloworld复制到寄存器(这里指的是helloworld.c)然后再从寄存器中复制到显示设备(显示屏)从而显示在桌面上。

 

1.5高速缓存至关重要

1.4中简单的实例揭示了一个重要的问题, 系统花费了大量时间把数据信息从一个地方挪到了另外一个地方,但实际的机器指令的执行却只是一小部分, 所以如果能让数据的复制尽可能快的完成的话, 就能够加快计算机的执行效率。针对这一情况,人们发明了高速缓存存储器, 他的内存空间远小于主存储器,但是数据的访问速度几乎和寄存器一样快,这样我们可以把经常访问的数据放在缓存中, 以这样的方式来加快存取速度。

 

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

随着计算机的发展, 在处理器与大的内存设备(主存)之间插入更小更快的存储设备的想法已经成为了普遍的观念。这逐渐使得计算机领域的存储设备被组织成了存储器层次结构,这些设备都遵循这如下特点:空间越大, 速度越慢。

 

1.7操作系统管理硬件

其实上面说shell加载和执行src文件时, 我们都忽略了一个很关键的概念那就是操作系统,也就是说shell和执行的src程序并没有直接访问磁盘内存等等, 他们都是通过操作系统来完成这些步骤。操作系统有两个基本的功能:

  1. 向应用程序提供简单一致的机制来控制复杂而又大相径庭的低级设备。
  2. 既然它提供了操作硬件的接口, 自然也就可以用来防止硬件被失控的程序滥用。

操作系统提供了如下几种基本的抽象概念:文件, 虚拟存储器, 进程(概念的范围由前往后越来越广)。

  1. 在操作系统上运行程序会造成一种假象, 似乎当前只有这个程序在使用处理器, 内存和IO设备,这些假象就是通过进程这个概念来实现的。进程其实就是对一个正在运行的程序的抽象, 一个系统上可以同时运行多个进程, 每一个都好像在独占地使用硬件, 而实际情况是他们是往往是交错运行的, 操作系统在不同的进程间交错执行的机制就叫做上下文切换。在同一个进程中, 还有一个类似的概念叫做线程, 现代程序中一个进程往往又多个线程来共同完成, 线程之间共享代码和全局数据, 由于他们之间更加容易共享数据, 往往线程更加高效。
  2. 虚拟存储器是另外一个抽象概念,它使得每一个进程看起来都像是独占使用内存, 每一个进程看到的一致的存储器, 叫做虚拟地址空间,其结构从低地址到高地址分别是 :
    • 程序代码和数据:这一点对于所有程序都一样, 代码从固定地址开始, 紧接着是和C语言中全局变量相对应的数据位置。
    • 堆:运行时堆, 当调用malloc或者free时, 堆能够动态地扩展和收缩。
    • 共享库:用来存放类似C语言中标准库数学库等代码和数据的地方。
    • 栈:编译器用它来实现函数调用,和堆一样能够动态伸缩。
    • 内核虚拟存储器:内核是操作系统的一部分, 这一部分空间是留给内核的, 不允许程序读写这部分空间或者调用内核代码定义的函数。
  3. 每一个IO设备, 包括磁盘, 显示器, 键盘甚至网络都可以称之为文件, 系统所有的输入输出都是通过被称为Unix I/O的系统函数调用读写文件来实现的。

 

1.8系统之间的通信

计算机并不是孤立存在的, 每一个计算机系统通常通过网络来相互连接, 网络也可以是为一个IO设备。

 

1.9重要主题

  1. 并行与并发
    • 线程级并发:一般利用线程切换来完成, 后来出现的多处理器系统以及多核系统提高了系统系统的性能。
    • 指令集并发:通过pipelining的使用聪明的处理多条指令同时进行。
    • 单指令多数据并行:即SIMD并行, 现代处理器允许一条指令产生多个可执行的操作来加快执行速度。
  2. 抽象是计算机中一个相当重要的概念, 它隐藏内部的软硬件内部的实现细节,用简单统一的视角来简化研究。
posted on 2016-06-10 00:37  内脏坏了  阅读(155)  评论(0编辑  收藏  举报