深入了解计算机系统初学记录

来源:互联网 发布:手机端美工装修 编辑:程序博客网 时间:2024/05/22 03:12

1.前言

本书是以程序员的视角描述计算机系统的工作方式。

2.信息表示和处理

计算机使用8bit作为最小的内存单位。
目前常用的计算机表示法,二进制,16进制,10进制。

寻址和字节顺序

1.大端法(从内存末尾开始数据分布)
例如:
有16进制数 0x01234567
内存的低位是01,高位是67。
2.小端法(与大端法相反)
以上俩种方法现代计算机都支持,由不同的操作系统决定使用何种方法。

3.程序的机器级表示

x86-64通用架构的指令集细节(如果你不从事底层开发,只需大概了解)

高级语言如何运行在计算机上

高级语言源代码 - 》二进制码 - 》 链接器链接 - 》 exe程序

4.处理器体系结构

构建一个按顺序执行指令的cpu

你需要构建

  1. ALU
  2. 存储器
  3. pc
  4. 时钟

这一部分我推荐完成计算机系统要素的课后项目,还有我自己的半成品项目供你参考。

构建一个流水线化的处理器

在完成上一部分的前提下,我们来将cpu运行的处理进行划分。
将处理组织成阶段(以64位系统为示例)

  • 取指(fetch),以pc的值为内存地址,来读取指令字节
    (指令由指令代码和指令功能所组成,各由4个字节组成)

  • 译码(decode),从寄存器中读入俩个操作数–》ALU中

  • 执行(execute),ALU执行操作,更新目标寄存器
  • 访存(memory),将数据写入或读取内存
  • 写回(write back),可以将最多俩个结果写到寄存器中
  • 更新pc,将pc设为下一条指令的地址上

    流水线的原理

    在每个步骤之间增加寄存器,保存当前指令当前步骤的工作结果。这样指令就可以源源不断的执行。在同一个周期可能执行好几条指令。(实现细节非常复杂,属于电子工程师的工作范畴,仅做了解即可)

5.优化程序性能

程序员角度

  • 避免使用复杂度高的算法
  • 不要使用不必要的内存引用(也就是不要瞎用变量)
  • 不要使用连续的函数调用(也就不要用递归,少调用函数)

编译器作者和硬件角度

1.使用展开循环
2.使用多个积累变量和重新结合
3.用功能性风格重写条件操作,提高并行性
(这一块我看不太懂)

6.存储器层次结构

几种存储器的原理和工作方式

1.静态RAM(SRAM),双稳态,俩个稳态一个表示0,一个表示1。由逻辑电路构成。
2.动态RAM(DRAM),每个位是一个小电容,有电就是1,没电就是0 。
3.ROM(非易失性存储器)
- PROM(只可编程一次),本质是一堆电阻丝。
- EPROM(可擦写式ROM),有光擦写和电擦写俩种。
- 闪存(flash memory),更好的电擦写EPROM。
4.磁盘以及SSD

7.链接

将各种代码和数据片段收集并组合成单一文件的过程

静态链接

1.首先将高级语言的代码翻译成二进制代码文件。
2.对于高级语言中的库函数(比如os默认函数,自己安装的库函数)编译后与高级语言的代码翻译成二进制代码文件放在一起,根据某种格式打包为exe文件。

动态链接

方法1,将库函数放在一个专用的内存地址,运行或加载exe时才进行链接。
方法2,让库函数成为位置无关代码(如何实现没看懂)

运行exe

在linux下
1.加载器将exe文件加载到内存上
2.os调用_start函数
3._start函数调用 __libc_start_main函数
4.__libc_start_main函数调用main函数运行exe中指令

8.异常控制流

异常的类型(低级层面)

1.中断, I/O设备的交互
2.陷阱,有意的异常
3.故障,可能修复的错误
4.终止,不可恢复的错误

进程

  • 独立的逻辑控制流
  • 独立的地址空间

多进程

cpu的时间分片(有多个进程,对于单核cpu同一时间只对一个进程工作)

信号(高级的软件形式的异常)

1.os或进程发送信号给进程
2.进程做出反应

9.虚拟内存

虚拟内存的作用

1.将主存当做是磁盘的高速缓存
2.主存只保存活动区域
3.为每个进程提供了一致的地址空间
4.保护每个进程的地址空间不被其他进程所破坏

虚拟内存的工作方式

将磁盘和内存划分为页。
同时使用一个叫做页表的数据结构用来将虚拟页映射到物理页上。

  • 操作虚拟页,查询页表看所需是否在主存上,如果存在,直接使用主存上的数据,若不存在将磁盘页上的内容缓存在主存上,并修改页表。
    (页表的数据结构,以及虚拟内存的细节请自行学习)

10.系统级I/O

UNIX I/O

对于linux系统来说所有i/o都被看做是一个文件。
而i/o操作就可以看做是

  • 打开文件
  • 改变位置
  • 读写文件
  • 关闭文件

文件类型

1.文本文件(普通的文字文件)
2.二进制文件(所有多媒体文件)
3.目录(一组链接的文件)
4.套接字(网络通信的文件)

11.网络编程

套接字编程的细节,我推荐学习unix网络编程

12.并发编程

以web服务器为例

多进程

父进程处理客户端连接,子进程处理具体的交互

多线程

一个线程处理一个客户端连接

i/o多路复用

连接到来时进程暂停,当多个i/o事件后才进行处理和返回客户端。

写在最后的话

本书的每一章都有无数的细节,根据你从事方向的不同你需要掌握不同的细节。而学习本书你可以建立起一个完备的计算机模型。有助于你理解程序为啥要这样写。

——————————————————————————————————
本人只是个初学者,错误与疏漏在所难免。欢迎评论指出我的错误。

原创粉丝点击