CSAPP阅读记录第一章

CSAPP阅读记录(1)

尽量简单记录一些内容和感想,而不是照搬书中内容吧~
图片显示好像有些问题啊

练习题1.1有时间再做一遍

第一章计算机系统漫游

1.1信息就是位+上下文

#include <stdio.h>
int main()
{
    printf("hello, world\n");
    return 0;
}

hello 程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件,文件名是 hello.c。

hello.c是以字节序列的方式储存在文件中的。

文本文件:只由ASCII字符构成的文件。如hello.c。

二进制文件:文本文件之外的文件。如可执行程序、图形、图像、声音等等。

系统中所有的信息–包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特(位)表示的。

区分不同数据对象的方法:读到这些数据对象时的上下文。

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

gcc -o hello hello.c

感觉这本书讲的比之前学习的更通俗易懂一些~

编译系统=预处理器+编译器+汇编器+链接器

预处理阶段:“#”,插入头文件,得到.i文件(文本文件)。

编译阶段:将文本文件.i翻译成文本文件.s,后者包含一个汇编语言程序。(以后应该需要学一下汇编语言)

汇编阶段:将.s翻译成机器语言指令,将指令打包成可重定位目标文件,并得到.o文件(二进制文件)。.o文件直接打开是乱码滴。

链接阶段:将printf等函数预编译的目标文件合并到上一阶段得到.o程序中,得到可执行(目标)文件。

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

了解编译系统如何工作的益处:

  • 优化程序性能(3、5、6)

    了解一些机器代码以及编译器将不同的 C 语句转化为机器代码的方式。

  • 理解链接时出现的错误(第7章)

  • 避免安全漏洞(3)

1.4处理器读并解释储存在内存中指令

一个典型系统的硬件组成
1.4.1系统的硬件组成

总线和IO设备√

主存由一组DRAM(动态随机存取存储器)芯片组成,临时存储设备。

CPU(中央处理单元、处理器)执行其核心PC(程序计数器,一个寄存器)指向的主存中的指令。ALU(算术/逻辑单元)计算新的数据和地址。

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

处理器的指令集架构描述机器指令代码的效果,而处理器的微体系结构描述的是处理器实际上的实现方式。

1.4.2运行hello程序

在键盘上输入“./hello” --> shell将其读入寄存器,再将其放在内存中 --> “\n”键结束输入 --> shell执行命令加载可执行的hello文件(将目标文件中的代码和数据从磁盘复制到主存,DMA技术) --> 处理器开始执行hello程序的main程序中的机器语言指令 --> 将要输出的字符串中的字节从主存复制到寄存器,再从寄存器文件中复制到显示设备 --> 显示在屏幕上

运行hello程序1 运行hello程序2 运行hello程序3

1.5高速缓存

信息复制移动开销很大。

机械原理,大的存储设备运行的比小的存储设备慢,快速设备的造价远高于同类的低速设备。

处理器从寄存器读取数据比从主存中读取要快将近100倍。(差距不断扩大)

加速处理器的运行速度比加速主存的运行速度容易且便宜。

高速缓存存储器(cache、高速缓存):存放处理器近期可能会需要的信息,容量大、速度快。使用静态随机访问存储器(SRAM)硬件技术实现。

L1:位于处理器,数万字节,访问速度几乎=访问寄存器文件。

L2:通过特殊总线与处理器连接,数十万字节甚至数百万字节,访问速度比L1长5倍,但比访问主存快5~10倍。

可以通过运用不同的高速缓存的知识来提高性能。

1.6存储设备层次结构

存储器层次结构

存储器层次结构主要思想:上一层的存储器作为低一层存储器的高速缓存。

可以利用对整个存储器层次结构的理解来提高程序性能。

1.7操作系统

shell加载和运行hello程序、hello程序输出时,shell和hello程序没有直接访问键盘、显示器、磁盘或主存,而是通过操作系统。

所有应用程序对硬件的操作尝试都必须通过操作系统。

操作系统基本功能:

  • 防止硬件被失控的应用程序滥用
  • 向应用程序提供简单一致的机制来控制复杂而又大不相同的低级硬件设备。

通过进程、虚拟内存、文件的抽象概念来实现这两个功能。

计算机系统的分层视图和操作系统提供的抽象概念
1.7.1进程

进程:对一个正在运行的程序的抽象。

操作系统实现交错执行的机制称为上下文切换。

上下文:进程运行所需的所有状态信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4j8mKk1O-1678638724243)(D:\学习学习活动活动\csapp\截图\进程的上下文切换.png)]

操作系统内核管理一个进程到另一个进程的转换。

内核不是独立进程,是系统管理全部进程所用代码和数据结构的集合。

1.7.2线程

进程由多个线程组成,每个线程都运行在进程的上下文中,共享同样的代码和全局数据。多线程之间共享数据更容易,线程一般比进程更高效。

有多处理器可用时,可以通过多线程使程序运行的更快。

1.7.3虚拟内存

虚拟内存让每个进程以为,他们是独占地使用主存。

每个进程看到一致的的内存:虚拟地址空间。

linux的虚拟地址空间(由大量准确定义、有专门功能的区构成):

linux进程的虚拟地址空间

地址低–>高:

  • 程序代码和数据:进程的代码是从同一个固定地址开始的,然后是和C全局变量相对应的数据位置。在进程一开始运行时就被指定了大小。
  • 堆:可动态扩展收缩。
  • 共享库:地址空间的中间部分是存放C标准库和数学库等共享库的代码和数据的区域。
  • 栈:用户栈位于用户虚拟地址空间顶部,编译器用它实现函数调用。可动态扩展收缩(调用函数,增长;从函数返回,收缩)。
  • 内核虚拟内存:地址空间顶部的区域。应用程序不能读写这个区域的内容或者直接调用内核代码定义的函数,要调用内核来执行。

虚拟地址运作的基本思想:把一个进程虚拟内存的内容存储在磁盘上,用主存作为磁盘的高速缓存。

1.7.4文件

文件就是字节序列。

每个I/O设备(磁盘、键盘、显示器,甚至网络)都可以看作是文件。

1.8系统之间利用网络通信

现代系统通过网络和其它系统连接到一起。网络可视为一个I/O设备,通过网络适配器连接到总线。

网络也是一种IO设备

客户端与服务器之间的交互。(我是这样理解的:客户端输入输出,服务器执行?)

1.9重要主题

系统不仅仅是硬件,它是硬件和系统软件相互交织的集合体。

1.9.1 Amdahl定律

主要思想:对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mHzzTPvi-1678638724244)(D:\学习学习活动活动\csapp\截图\Amdahl定律公式.png)]

​ 所以,要想显著加速整个系统,必须提升全系统中相当大的部分的速度。(只加速某一部分的话,即使将该部分加速到不花时间,整体加速比可能也不大)

“2.2×”表示“2.2倍”

该定律描述了改善任何过程的一般原则,可以运用在加速计算机系统方面之外,比如提高平均绩点等等。

练习题1.1

或许不应该拘泥于公式,注意只有蒙大拿州不限速。

1.9.2 并发和并行

并发:一个通用概念,指一个同时具有多个活动的系统。

并行:指用并发来使一个系统运行得更快。

**似乎有点不太一样?**s

  • 多个任务同时进行

    • 交错并发(interleaved)
    • 并行(parallel)
    交错并发与并行
  • 多任务实现方式

    • 并发(concurrent):

      • 多个进程或线程“同时“进行

      • 交错并发:可通过系统调度由单核完成。

      • 并行:需要多个运算核心同时完成

并行可以在计算机系统的多个抽象层次上运用。

1.线程级并发

使用线程,在一个进程中执行多个控制流。

处理器配置分类

多核处理器是将多个CPU(核)集成到一个集成电路芯片上。

多核处理器的组织结构

超线程(同时多线程):一项允许一个CPU执行多个控制流的技术。CPU的某些硬件有多个备份,其他只有一份。超线程的处理器可以在单个周期的基础上决定要执行哪一个线程(常规处理器需要大约20000个时钟周期做不同线程间的转换),使CPU能更好地利用它的处理资源。

多处理器两个方面提高系统性能:

  • 减少在执行多个任务时模拟并发的需要。
  • 可以使以多线程方式书写的应用程序运行得更快。

尝试把虚拟机的处理器从2–>8,发现加速比提高了(但有可能是因为优化前的运行时间增加了很多,找个时间测试一下吧)

指令级并行

在较低的抽象层次上,现代处理器可以同时执行多条指令的属性。(第四章学习流水线,了解实现方法)

超标量处理器:处理器可以达到比一个周期一条指令更快的执行速率。(5,超标量处理器的高级模型)

单指令、多数据并行(SIMD并行)

最低层次上,现代处理器允许一条指令产生多个可以并行执行的操作。

提供SIMD指令多是为了提高处理影像、声音和视频数据应用的执行速度。

有些编译器会试图从C程序中自动抽取SIMD并行性,但是用编译器支持的特殊的向量数据类型(GCC就支持向量数据类型)来写程序更可靠。

1.9.4计算机系统中抽象的重要性

为一组函数规定一个简单的应用程序接口(API)是一个很好的编程习惯。

不同语言提供不同形式和等级的抽象支持,例如C语言的函数原型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bnGuTEMI-1678638724245)(C:\Users\yqq\AppData\Roaming\Typora\typora-user-images\image-20230311152158866.png)]

文件:对I/O设备的抽象。

虚拟内存:对程序存储器的抽象。()主存和磁盘

进程:对一个正在运行的程序的抽象。(处理器、主存、I/O设备)

动抽取SIMD并行性,但是用编译器支持的特殊的向量数据类型(GCC就支持向量数据类型)来写程序更可靠。

1.9.4计算机系统中抽象的重要性

为一组函数规定一个简单的应用程序接口(API)是一个很好的编程习惯。

不同语言提供不同形式和等级的抽象支持,例如C语言的函数原型。

(有一张图片)

文件:对I/O设备的抽象。

虚拟内存:对程序存储器的抽象。()主存和磁盘

进程:对一个正在运行的程序的抽象。(处理器、主存、I/O设备)

虚拟机:对整个计算机的抽象,包括操作系统、处理器和程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值