深入了解计算机系统初学记录
来源:互联网 发布:手机端美工装修 编辑:程序博客网 时间:2024/05/22 03:12
1.前言
本书是以程序员的视角描述计算机系统的工作方式。
2.信息表示和处理
计算机使用8bit作为最小的内存单位。
目前常用的计算机表示法,二进制,16进制,10进制。
寻址和字节顺序
1.大端法(从内存末尾开始数据分布)
例如:
有16进制数 0x01234567
内存的低位是01,高位是67。
2.小端法(与大端法相反)
以上俩种方法现代计算机都支持,由不同的操作系统决定使用何种方法。
3.程序的机器级表示
x86-64通用架构的指令集细节(如果你不从事底层开发,只需大概了解)
高级语言如何运行在计算机上
高级语言源代码 - 》二进制码 - 》 链接器链接 - 》 exe程序
4.处理器体系结构
构建一个按顺序执行指令的cpu
你需要构建
- ALU
- 存储器
- pc
- 时钟
这一部分我推荐完成计算机系统要素的课后项目,还有我自己的半成品项目供你参考。
构建一个流水线化的处理器
在完成上一部分的前提下,我们来将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事件后才进行处理和返回客户端。
写在最后的话
本书的每一章都有无数的细节,根据你从事方向的不同你需要掌握不同的细节。而学习本书你可以建立起一个完备的计算机模型。有助于你理解程序为啥要这样写。
——————————————————————————————————
本人只是个初学者,错误与疏漏在所难免。欢迎评论指出我的错误。
- 深入了解计算机系统初学记录
- 深入了解计算机系统 2.67
- 深入了解计算机系统 读完
- 《深入了解计算机系统》第一章《计算机系统漫游》知识点
- 深入了解计算机系统 习题2.62
- 深入了解计算机系统 习题2.63
- 深入了解计算机系统 练习题 2.69
- 深入了解计算机系统 练习题2.74
- 深入了解计算机系统 家庭作业 2.66
- 深入了解计算机系统 家庭作业 2.68
- 深入了解计算机系统家庭作业 2.72
- 深入了解计算机系统 家庭作业 2.73
- 《深入了解计算机系统》阅读笔记一
- 了解计算机系统
- 了解计算机系统
- CSAPP lab1 datalab-handout(深入了解计算机系统 实验一)
- CSAPP lab2 bomb(深入了解计算机系统 实验二)
- 深入理解计算机系统 计算机系统漫游
- commons lang使用
- XML常见的两种解析方式总结
- ionic3内容置顶按钮,在csdn一个demo基础上修改的,解决按钮在过渡过程中忽隐忽现的bug...
- Ubuntu 10.10 修改MAC地址
- php常用函数
- 深入了解计算机系统初学记录
- Java 基础(9)—— 对于 堆、栈、方法区的简单理解
- poj1118Lining Up 暴力枚举
- spring mvc 在Web.xml中自动扫描Spring的配置文件及resource时classpath*:与classpath:的区别
- 使用yo构建项目
- JavaScript——计数器(基础)
- 作用域
- 0.引子
- idea_maven项目配置默认仓库为自己的本地仓库