• Home
  • About
    • Road to Coding photo

      Road to Coding

      只要那一抹笑容尚存, 我便心无旁骛

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags

CS:APP(一)计算机系统概述

28 Dec 2017

一直以来想要了解一下计算机,自己又作死说要先打基础.当然不可否认的是,CSAPP是一本很好看的书

但是,一点都不好看.

*那现在还能怎么办呢 ? 啃吧 ! *

首先约定本书的环境 :

1.Linux操作系统

2.X86_64架构

3.C语言描述为主 , 会用到一些C++/Java例子

从下面的一个简单的程序入手,来讲述整个计算机中的系统流程

#include <stdio.h>
int main(void)
{
    printf("Hello World\n");
	return 0;
}

这是任何C语言的初学者,都会接触到的例子,现在已经是任何一门编程语言都会用到的例子了.

编译系统

从程序到可执行程序,所经历的过程是我们必须了解的

它经历了下面这几个过程:

1.预处理阶段

预处理器(cpp),根据”#”字符,将指定的 < * . h > 文件替换到此处,同时消去注释之类,生成一个 . i 文件

2.编译阶段

编译器(ccl),将文本文件hello.i翻译成为hello.s , 为一个汇编程序 , 代码如下:

main:
  subq	$8, %rsp
  movl	$.LCO, %edi
  call  puts
  movl  $0, %eax
  addq  $8, %rsp
  ret

汇编语言可以理解为任何高级语言与底层之间的通用语言接口

3.汇编阶段

汇编器(as)将hello.s,翻译成为机器语言,并将其打包成为可重定位目标程序,名为hello.o

用文本编辑器打开,即为乱码

4.链接阶段

此阶段链接器(ld)将所有的编译好的.o文件, 与我们的hello.o进行链接, 生成目标程序

硬件组成

计算机是软硬结合的,所以了解硬件也是很有必要的

1.总线

总线是一组电子管道, 携带信息字节,并且在各个部件之间进行传递.设定为携带固定的字节数

2.I/O设备

input/output设备也是十分必要的.是计算机和外接连接的通道.

每个I/O设备都通过,控制器/适配器与I/O总线进行连接.

控制器: I/O设备本身或系统的主板上的芯片组

适配器: 插在主板槽上的一块卡

区别: 在于封装的方式不同

3.主存

临时的一个存储设备.

物理上,靠一堆DRAM实现,即各种各样的随机存储器组成,内存,显存, . . . .

逻辑上,计算机将这一系列的RAM抽象成为,内存地址空间(详见 < 汇编语言(一) > )

对每个字节,进行地址编码,使其可以进行访问使用.

4.处理器

中央处理器,其中也包含了许多组件.,寄存器,程序计数器,地址加法器等

常见的操作:

  • 加载
  • 存储
  • 操作
  • 跳转

高速缓存

高速缓存的技术,是十分重要的.

随着计算机发展,存储读取的问题很严峻,有木桶效应可知: 计算机数据处理运行的速度取决于最慢的部分

计算机中的组件,存储容量更小,更快,每字节造价越高,越贵.

存储容量更大,更慢,每字节造价越小,越便宜.

因此,计算机的存储器采取层次结构

L0: 寄存器
L1: L1高速缓存  (SRAM)
L2: L2高速缓存  (SRAM)
L3: L3高速缓存  (SRAM)
L4: 主存       (DRAM)
L5: 本地二级存储 (本地磁盘)
L6: 远程二级存储 (分布式文件系统,Web服务器)

存储器层次结构主要思想是,从上到下,上一层都是下一层的高速缓存,加速了程序/计算机的速度

操作系统的抽象

操作系统,算是计算机应用程序与底层硬件之间的中间件,通过操作系统提供的服务

使用户可以更好地调用硬件,同时提供了统一的接口进行操作

那么,操作系统在实现功能的时候,进行了下面的抽象:

I/O设备 –> 文件 ** 主存 + I/O设备 –> 虚拟内存** ** 主存 + I/O设备 + 处理器 –> 进程**

这三个基本抽象概念十分重要!

由于这三中抽象概念是以后的学习重点,现在就不多赘述了.

简单阐述一个概念: 信息

所谓信息是什么? 只是位的信息了吗?

并不是,之前在汇编语言的学习时,就清楚的了解到,位中的数据在不同的地方含义是不同的

可以是代码,数据,或者指令

所以,位中的信息,需要结合上下文来理解!

即: 信息 = 位 + 上下文

系统之间的网络通信

网络编程,之前也稍微了解过.

网络,从一方面上来讲,其实也是一个I/O设备

网络只是扩展了计算机的I/O范围

重要主题

这里介绍三个重要的内容

1.Amdahl定律

在计算机科学里,进行计算机性能分析,依靠的是Amdahl定律 :

Amdahl定律清晰的说明了:要提高一个系统的性能,必须要提供大部分的性能才可以.

2.并发与并行

计算机中,很重要得两类编程: 并发编程 与 网络编程

计算机的发展中,有两个需求:

  1. 计算的更多

  2. 计算的更快

并发与并行就是为了处理计算的更快的需求的

并发(concurrency) : 置一个系统上同时有多个程序

并行(parallelism) : 表示通过并行来加速计算机的速度

主要有以下三个层次的概念:

1.线程级并发

2.指令级并行

3.单指令,多数据并行

3.抽象

抽象的概念是在计算机学习中,必不可少的.

Pangda曾经说过: 递归,抽象,数学归纳法.是很重要得三个东西

我认为抽象,是能够将实际的例子进行归类为模板/类型.简单的讲,就是能够归类问题,找出解决问题的方法

前面,也介绍了文件,虚拟内存,进程这三个抽象的概念,那么,现在再加上一个:

虚拟机 = 操作系统 + 处理器 + 主存 + I/O设备


编程相关

因为第一章是全局概括,所以在编程的学习上并没有多少.

December 31, 2017 4:21 PM



CSAPP Share Tweet +1