【CSAPP:3e 深入理解计算机系统】课堂笔记 Computer Systems from a Programmer’s Perspective
第一章 简介
「软件」如何由代码得到程序?
- 预处理阶段:将源程序
test.c
进行预处理成test.i
,例如将头文件、宏命令补全等等 - 编译阶段:编译器将文本文件翻译成文本文件
test.s
包含了一个汇编语言程序 - 汇编阶段:汇编器将汇编语言程序翻译成机器语言指令
test.o
- 链接阶段:将函数等单独预编译的目标文件合并到主程序中,得到可执行文件
「硬件」计算机如何运行程序?
硬件组成
总线
- 字(word),字长
I/O 设备
输入/输出
控制器、适配器
主存
存放程序指令和数据
一个字节数组,每字节具有唯一地址
处理器
解释(执行)指令
程序计数器(PC)指向内存中某条指令
执行操作:加载、存储、操作(运算)、跳转
hello.c
程序运行样例:
- 读取
hello
命令
- 从磁盘加载可执行文件到主存
- 从主存输出字符串到显示器
储存器层次结构 Memory Hierarchy
上一层的存储器作为下一层储存器的高速缓存
「抽象表示」
操作系统抽象层次
- 文件——I/O设备
- 虚拟内存——程序储存器
- 进程——正在运行程序
- 虚拟机——整个计算机
几个抽象概念
进程
线程
虚拟内存
文件
Amdahl定律
当我们对系统某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。
加速比计算:S=1(1−α)+α/kS={1\over(1-α)+α/k}S=(1−α)+α/k1
α:该部分占比时间;k:性能提升比例\alpha : 该部分占比时间; k : 性能提升比例α:该部分占比时间;k:性能提升比例
并发与并行
- 线程级并发
- 线程
- 单处理器
- 多核处理器
- 超线程
- 指令级并行
- 流水线
- 超标量
- 单指令、多数据并行
- SIMD
- 视音频处理
第二章 信息的表示与处理
2.1 信息储存
字数据大小
寻址和字节顺序
- 一个block为8位,是两个十六进制数值。
- 跨越多个字节的程序对象如何在内存中储存?
- 连续的字节序列
- 地址为所有字节中最小的地址
- 大端法与小端法
- 大端法:最高有效字节在最前面
- 小端法:最低有效字节在最前面
C语言中的位级运算
应用 - 掩码运算
0
屏蔽,F
取值。
移位运算
- 左移运算
x << k
: 右端补kkk个000 - 右移运算
x >> k
- 逻辑右移(
unsigned
):左端补kkk个000 - 算术右移(
signed
):左端补kkk个原最高位值
- 逻辑右移(
2.2 整数表示
无符号数的编码 B2Uw()B2U_w()B2Uw()
Binary to Unsigned int:
- 按正常位进行权运算
- 范围:[0,2w−1][0,2^w-1][0,2w−1]
补码编码 B2Tw()B2T_w()B2Tw()
Binary to Two’s-complement:
除去最高位取负号运算以外,其他位按权运算
最高位决定了符号(可以以符号位进行理解),111为负
非负数时B2UwB2U_wB2Uw 和 B2TwB2T_wB2Tw 值相同
范围:[−2w−1,2w−1−1][-2^{w-1},2^{w-1}-1][−2w−1,2w−1−1]
000...000=0000...000=0000...000=0; 111...111=−1111...111=-1111...111=−1
有符号数和无符号数之间的转换 T2Uw()T2U_w()T2Uw() & U2Tw()U2T_w()U2Tw()
- 减掉最高位的权+1
- 加上最高位的权+1
C语言中的有符号数和无符号数
当表达式中的unsigned
和 signed
混用时,signed
将被强制转换为unsigned
注意:sizeof()
本身就是 unsigned long
下面这个例子将会发生内存错误:
unsigned i;
for (i = n - 1; i >= 0; --i) // i 总是大于零,无法跳出循环f(a[i]);
扩展一个数字的位表示
无符号数
零扩展
有符号数
符号扩展,假如是负数,扩展111;假如是正数,扩展000
- 在C语言中,遇到符号、大小同时需要转换的情况,先转换大小,最后转换符号
截断数字
删除最高位。本质上其实是取模运算。 补码运算来说,如果最高位有很多个重复的1
,则可以删除前面的进行运算。
2.3 整数运算
无符号加法
定义:www 位无符号整数 xxx,yyy 之和:将 x+yx+yx+y 截断成 www 位后的无符号数。
溢出:发生了截断的操作。
运算符:+wu+_w^u+wu
无符号数求反:−wu-^u_w−wu
/* 检测是否会溢出的函数 */
int uadd_ok(unsigned int x, unsigned int y)
{unsigned int sum = x + y;return sum >= x;
}
补码加法
定义:www 位补码数 xxx,yyy 之和:将 x+yx+yx+y 截断成 www 位后的补码数。
运算符:+wt+_w^t+wt
/* 检测是否会溢出的函数 */
int taad_ok(int x, int y)
{int sum = x + y;int neg_over = x < 0 && y < 0 && sum >= 0;int pos_over = x >= 0 && y >= 0 && sum < 0;return !neg_over && !pos_over;
}
补码的非
运算符:−wt-_w^t−wt
−x=-x=−x= ~x+1x+1x+1
无符号乘法
运算符:∗wu*_w^u∗wu
做法:按位乘法运算之后,截取最低的 www 位
补码乘法
运算符:∗wt*_w^t∗wt
做法:按位乘法运算之后,截取最低的 www 位
低位等价性:补码与无符号的乘法产生的位模式相同
/* 检查是否溢出的函数 */
int tmult_ok(int x, int y)
{int p = x * y;return !x || p / x == y;
}
乘以常数
乘以二的幂:x2kx2^kx2k = x << k
乘以不是二的幂 –> 乘法分配律拆成二的幂相加/减的形式
除以 222 的幂
对于无符号数来说,x >> k
逻辑右移,可以产生数值 ⌊x/2k⌋\lfloor x/2^k \rfloor⌊x/2k⌋;这个操作是向零舍入的。
对于补码数来说,x >> k
算术右移,来产生数值 ⌊x/2k⌋\lfloor x/2^k \rfloor⌊x/2k⌋;这个操作对负数是向下舍入的,不好
【CSAPP:3e 深入理解计算机系统】课堂笔记 Computer Systems from a Programmer’s Perspective相关推荐
- 深入理解计算机系统 第三章笔记,《深入理解计算机系统》笔记.PDF
<深入理解计算机系统>笔记 <深入理解计算机系统>笔记 目錄 介紹 0 第1章计算机漫游 1 1.1信息就是位+上下文 1.1 1.2程序被其他程序翻译成不同的格式 1.2 1 ...
- c语言语句的机器级表示实训,深入理解计算机系统(笔记):程序的机器级表示...
分析高级语言编译后生成的汇编语言. 1. 程序编码 运行如下命令得到C语言的汇编代码: unix> gcc -O1 -S code.c gcc -c选项编译源文件生产目标文件code.o: un ...
- 【深入理解计算机系统-学习笔记】第一章 计算机系统漫游
第一章 计算机系统漫游 简介: 我们通过跟踪hello程序的生命周期来开始对系统的学习--从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止 我们将沿着这个程序的生命周期,简单得介绍一些逐 ...
- 深入理解计算机系统读书笔记
由于这本书的前半部分习题大多是相关计算和简单汇编代码编写,所以当时都是在稿纸上练习的,不过现在那些稿纸似乎也不见了: ( 所以现在仅有后半部分的课后习题代码以及示例练习代码(家里作业习题当时并没有做, ...
- 《深入理解计算机系统》笔记以及知识点总结
部分补充图片和内容来自csdn 文章目录 1 操作系统的运行 1.1运行状态 1.1.1 用户态 1.1.2 核心态 1.2 系统调用 1.3 中断和异常 1.4 linux延申 2 进程 2.1 概 ...
- 深入理解计算机系统读书笔记(第二章 信息的表示和处理)
这里写自定义目录标题 第二章 信息的表示和处理 2.1 信息存储 2.1.1 十六进制表示法 2.1.2 字数据大小 2.1.3 寻址和字节顺序 2.1.4 表示字符串 2.1.5 代码表示 2.1. ...
- 深入理解计算机系统----读书笔记
第二部分 信息的表示和处理 信息存储: 二进制(0101001), 八进制,十六进制(0x32FD) 字(word size)指明整数和指针数据的标称大小(normal size),对于w位的机 ...
- 【组队学习】【32期】深入理解计算机系统
深入理解计算机系统 航路开辟者:李岳昆.易远哲 领航员:初晓宇 航海士:叶前坤.沈豪 基本信息 开源内容:https://github.com/datawhalechina/team-learning ...
- 深入理解计算机系统(第二版)读书笔记
八月初开始接触<深入理解计算机系统>这本书,当时看的是英文版,花了一个月的时间大体上过了一遍,但我知道其实还是有很多没看懂的地方,于是借了一本中文版,如今总算可以说我真正看过了这本书,可以 ...
最新文章
- perl 分析mysql binlog
- 查询2021抚顺高考成绩,2021年抚顺高考状元是谁分数多少分,历年抚顺高考状元名单...
- docker添加新的环境变量_Docker环境变量
- 【英语学习】【加州教材】【G3】【科学】Science目录及术语表
- ssd1306 OLED 初始化流程
- 零基础入门深度学习(2) - 线性单元和梯度下降
- 如何用编程方式实现创建一个页面并替换掉站点首页
- next数组_数据结构之数组与链表
- [家里蹲大学数学杂志]第039期高等数学习题集
- URL在线编码/解码工具
- 神经滤镜为什么不能用,ps神经网络滤镜安装包
- 推荐一个专利检索的网站
- 自供电面包板----面包板伴侣项目介绍
- KALI-LINUX桥接模式下网络配置(学习笔记)
- 实验6 音频放大器的仿真验证
- C++: 生成给定范围内的所有多维索引。 模拟任意数量的嵌套循环的行为(附完整源码)
- STM32 OLED显示屏--SPI通信知识汇总
- VMware虚拟机Linux增加磁盘空间的扩容操作
- r5 5600u和r5 4600u参数对比哪个好?
- 学习笔记--EMI是什么?
热门文章
- SQL删除表中字段name相同的数据,需要保留一条
- 阿里云 mysql 日志_MySQL日志简介-阿里云开发者社区
- #腾讯会议:728-974-0882
- 2022年宁夏医院三基考试急症医学考试模拟题及答案
- 交换机日志删除_如何查看交换机报警日志 并导出日志 命令是什么
- 在小米路由器mini上安装Transmission挂BT/PT
- 基于eclipse开发源码分享-SSM+Activiti的公文管理系统
- “笨办法”学Python3,Zed A. Shaw,习题15
- Codeforces--839A--Arya and Bran
- Html.fromHtmls的使用