宁波建站模板系统企业网站建设免备案
web/
2025/9/25 22:58:18/
文章来源:
宁波建站模板系统,企业网站建设免备案,百度站长管理平台,wordpress外链音乐CSAPP学习
前言
一门经典的计组课程#xff0c;我却到了大四才学。
anyway#xff0c;何时都不会晚。
博主参考的教程#xff1a;本电子书信息 - 深入理解计算机系统#xff08;CSAPP#xff09; (gitbook.io)#xff0c;非常感谢作者的整理。
诚然去看英文版可以学…CSAPP学习
前言
一门经典的计组课程我却到了大四才学。
anyway何时都不会晚。
博主参考的教程本电子书信息 - 深入理解计算机系统CSAPP (gitbook.io)非常感谢作者的整理。
诚然去看英文版可以学到更多不过一边翻译一边看的过程我觉得还是效率不高的所以还是选择中文。
博主之前有一定的计算机基础所以对一些简单概念可能跳得比较快这里建议读者不懂的地方不要气馁“为什么这里三两句就讲掉了但是我还没懂”。建议多多发掘自我检索能力Search the Fxxking Web (STFW) 是计算机专业同学的一大重要能力。
Ch1. 计算机系统漫游
程序运行前4个阶段
相信尝试过一定编程学习的同学们都有过写、运行 helloworld 的经历。可能是用 Dev CVSCodeCLion 等 IDE也可能是自己在命令行执行编译运行语句本质都是一样的。
那么写了一个 helloworld.c这个程序是怎么运行起来的呢
首先计算机能直接运行的都是二进制文件01010101110101……类似这样的文件。但是要是说让我们用这种语言机器语言编程效率极低而且大概率会疯掉。
汇编语言是一种为了解决这个问题而诞生的低级语言相对好理解一些可以转换成机器语言。不过还是面向计算机的语言编程习惯主要也是按照计算机的思维走也比较难。
c语言是一种高级语言是我们人类一定程度上能理解的编程语言可以转换成汇编语言再转成机器语言供计算机运行。
gcc -o hello hello.c这条命令行语句意思是用 gcc 翻译工具把 hello.c 翻译成目标输出文件outputhello得到的可执行文件就是 hello。
翻译流程如下 预处理把文件中的注释信息去掉注释信息是给人看的对计算机运行没啥帮助把头文件展开其实头文件 #include #define 这些就是对一些格式内容的拷贝得到 .i 文件。
编译把高级语言翻译成汇编语言。相同的程序用不同高级语言写经过编译器后得到的汇编语言是相同的也就是计算机最终执行的具体行为都是一样的。感兴趣同学可以了解一下编译和翻译两种高级语言转汇编语言的方式。
汇编把 .s 汇编文件转为 .o 目标文件目标文件也是二进制形式。但是缺少一些外部链接的库暂时不能执行比如 printf 函数是在 printf.o 文件中定义的我们自己没定义所以不能自己直接用需要外链 printf.o 文件才能使用。
链接如上所述最终生成一个可执行的目标程序。
好现在是可以理解高级语言的作用让我们不用理解计算机具体运行方式就能较为简单的编程生成可执行文件。但是我们还是需要学习一下底层的编译、汇编等原理的
因为理解底层具体实现后我们才知道怎样编写的程序运行更高效同一个问题有许多解法可以写许多种程序比如 switch case 和 if else if但是并不是能解决正确性的程序就是好程序了我写一个跑一年才出结果的代码和跑1小时就出结果的代码价值也是完全不同的。对程序理解更深出现问题时我们也知道如何排查bug 不全是只有中英文字符那种程度的哦。甚至有一些安全性问题是通过对底层原理进行攻击的。
CPU硬件运行方式
程序翻译成汇编语言类似这样
main:subq $8, %rsp ; 通过从栈指针rsp减去8字节为栈分配空间。movl $.LC0, %edi ; 将字符串.LC0的地址加载到目标寄存器%edi中。call puts ; 调用puts函数该函数可能打印%edi寄存器指向的字符串。movl $0, %eax ; 通过将0移动到%eax寄存器中将返回值设置为0。addq $8, %rsp ; 通过将8字节添加到栈指针rsp释放栈上的空间。ret ; 从main函数返回。不用看懂。可以看到按照计算机思维这个程序被拆成了这么多条要执行的指令。CPU 执行程序的时候就是一条条指令执行的。
具体是怎样执行下图是 计算机基本组成的结构图。计算机五大组成部分CPU运算器控制器内存输入输出。 总线在各个设备之间传输数据用。
输入设备把信息输入给电脑的一些方式比如键盘打字鼠标点击光盘U盘我们写的程序存在磁盘上。
输出设备电脑把信息输出给我们的方式比如可以看到的显示器。输入输出设备统称 IO 设备。
主存也叫内存程序从磁盘里拿出来放到主存里运行。内存是衡量计算机运行快不快的一个重要指标因为内存小了每次能拿一小部分程序进来运行再拿下一部分效率比较低内存大了磁盘和内存之间交互可能相对就快很多磁盘里的内容往内存拿是比较占时间的。
CPU从主存里面拿一个个字节的数据进行处理。PC 是一个指针指向当前要拿的数据的位置首先从 PC 所指向的主存地址中加载几个字节到 CPU 寄存器里把寄存器中的内容复制到 ALU 中进行操作比如取到了a和b的值算ab然后可能需要把一些数据存储写回到主存中比如让 cabc的值变了那么我们可能就需要把新值写回到主存中c的位置最后 PC 跳转指向下一部分要取的字节的位置。重复上述操作直到程序执行完。
比如想跑一个 helloworld 我们经历了这些步骤
鼠标键盘输入写了一个 helloworld 程序并点击运行或 shell 输入运行语句 ./helloworld。我们输入的运行指令也是先被放到主存然后被 CPU 寄存器文件读取CPU 解析后明白我们是想执行 helloworld 文件然后再下指令从磁盘中取 helloworld 程序到主存里运行。helloworld 程序被加载到主存中虽然 CPU 是计算机的大脑中控中心但是这里磁盘数据不用经过 CPU 可以直接给主存是利用了 DMA 技术CPU 再取主存中的数据进行指令解析执行。CPU 解析指令直到我们是想在终端打印 helloworld于是驱动显示器输出设备输出显示 helloworld。
Cache 缓存
CPU 去主存取指令和去磁盘取指令其实都有一定的时间开销去磁盘开销更大。我们可以在 CPU 内部临时存一些近期可能要访问到的内容这样当访问到这部分内容的时候不需要每次都去主存去磁盘拿在自己这里就找得到就快很多。比如cab;cab;cab;cab; 执行这个指令如果第一次执行的时候 CPU 猜测a和b的值后面会不会还要用到我先在缓存里存一下以备不时之需。第二次执行的时候可以直接拿到本地缓存 cache 中存储的 ab 值进行运算不用去磁盘里再取一次了第三次第四次也是这样就比较节约时间开销。 当然缓存大小有限以此来保证 CPU 芯片大小不会太大和缓存中查找不会太慢。因此我们要设计一些缓存存储算法来决定哪些内容优先被存入缓存这个后面再细讲。
缓存结构其实是这样的著名的缓存金字塔 上面一层是下面一层的缓存。
操作系统
operating system了解一些的同学可能知道比如win系统mac系统linux系统这玩意啥用处呢。主要是实现对资源的分配管理。 比如我qq应用程序要调用键盘调用摄像头要调用键盘……首先应用程序直接去操作这些底层的 CPU主存IO 都比较麻烦而且也不安全比如qq崩溃异常状态下去调用这些设备。操作系统负责中间管理抽象出这些设备的接口供应用程序调用也保护硬件不被失控应用程序滥用。
操作系统的抽象如下 进程
一个正在运行的程序。操作系统会协调多个进程交错执行比如我现在电脑上开着微信 浏览器 Typora内核不停地切换这些进程的执行而我感觉不到。
进程切换需要保存当前进程状态切换到下一个进程的状态继续运行这个状态叫上下文 context。 一个进程可能包含多个线程他们共享这个进程的资源。
GPT 虚拟内存
操作系统让多个进程互不干扰的使用主存对每个进程来说他们只看得到自己的主存占用范围感觉好像只有自己在占用主存这就叫虚拟内存。 如图是主存中的组成从下往上地址逐渐增大。
内核虚拟内存给操作系统用的。
用户栈比如程序里的函数存到这里入栈。
共享库内存比如 printf 这种共用库。
堆比如 malloc 申请的空间存在这里也是多个程序共用。
数据存放程序数据。
虚拟内存具体实现方法后面讲解。
文件
字节序列。所有 IO 设备都可以看做是文件我们可以往文件里读写数据进行 IO 操作。这样我们对磁盘进行读写的时候其实我们并不关心具体读写 IO 行为我们只需要往磁盘文件夹里读写文件即可。
网络通信
其实网络也类似一个 IO 设备我们给网络适配器写入数据流网络适配器发送给另一台主机。
比如下例好处在于我们可以把程序存在服务器上在服务器上跑我们只需要发送简单指令。比如学习深度学习不用自己非得买一个牛逼电脑可以租牛逼服务器服务器其实也算是一种电脑和我们的客户端电脑没啥区别。 重要概念
Amdahl 定律
计算提升系统某一部分性能对整个系统所带来的效果。
α是某一部分在整个系统中占的比重k是这部分的性能加速了多少。S是最终对整个系统提升的加速效果。 比如α60%k3这一部分提升了3倍速度但是对整体速度的提升是1.67倍可见想要提升系统整体速度需要提升系统中大部分的速度。
并发 并行
并发一个系统同时运行多个活动。
并行利用并发来加速程序运行。
线程级并行
进程中多个任务的切换。
单处理器系统模拟并发即实际上是不断切换。
多处理器系统确实可以并发运行也可以加速用多线程方式写的单个程序。
超线程也叫同时多线程允许单核 CPU 执行多个控制流多个控制流共享执行单元。比如单处理器切换线程需要保存当前状态切换 pc 指针寄存器值……而超线程多个核对 pc程序计数器等有拷贝使得切换的时候不用那么麻烦比如常规单处理器切换可能需要20000个周期超线程一个周期就能切换。
指令级并行
有些系统硬件支持把一条指令拆成多个任务同时处理。
当指令周期小于1的时候一个 CPU 时钟周期可以执行平均1条以上的指令系统被称作超标量系统。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81863.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!