CSAPP笔记——第一章计算机系统漫游

hello,你好鸭,我是Ethan,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!💪💪💪
目前博客主要更新Java系列、项目案例、计算机必学四件套等。✔️✔️✔️
人生之败,非傲即惰,二者必居其一,勤则百弊皆除。加油呀!🏃🏃🏃


🔥个人主页:Ethan Yankang
🔥专栏:CSAPP||计算机基础
🔥本篇概览:以hello world为例,讲解了程序从编写到运行的全过程,以及现代计算机的基本架构。理解了这些知识,就掌握了现代计算机的宏观之态。

1.1The Lifetime of flello Program

源代码:
在这里插入图片描述
生命周期:
在这里插入图片描述
具体执行分析:

1.1.1gcc -o hello hello.c

通过一条命令 gcc -o hello hello.c , 即可通过编译系统完成编译称为可执行文件hello
在这里插入图片描述

1.1.2.编译过程具体分析

在这里插入图片描述

预处理:将源代码文件中以#开头的文件引入,源代码增加相关了内容(如#<stdio.h>)
编译:将源代码编译成汇编语言,中间过程包括词法分析、语法分析、语义分析、中间代码生成等等。
汇编:将汇编语言转化为机器指令,打包成二进制** 可重定位目标文件 ** hello.o
链接:链接器将hello.o可重定位目标文件与目标文件printf.o按照一定规则合并,最终形成可执行文件hello。该文件就可以加入内存中进行执行。

1.2 the reason of learning compilation system

1.2.1 Optimizing program performance

1.为什么Switch要比一连串if-else语句效率更高?
2.一个函数开销多大?
3.while循环比for循环更高效吗?

1.2.1 Understanding link-time errors

构建大型程序的时候,往往是在链接阶段出问题,各种函数库之间的调用是最容易出问题的。以往经验中各种奇奇怪怪错误往往是与链接器有关的。例如:

静态变量与全局变量的区别是?
静态库和静态库是什么?

1.2.1 Avoiding security holes

缓冲区溢出最易导致安全漏洞。如何编写代码避免安全漏洞?
第一步就是要理解数据和控制信息在程序栈上是如何存储的?了解不严谨不规范的书写方式会引起什么样的后果?

在第三章中,我们会讲述堆栈的原理和缓冲区溢出错误,以及如何利用操作系统与编译器来降低攻击风险。

1.3 Run Hello Program by Shell

在这里插入图片描述

1.3.1 Hardware Organization of a Computer System

在这里插入图片描述
注意这里的适配器与控制器只是封装方式不同而已,功能一样。
Main Memory就是RAM芯片,就是内存

1.3.2 Process Of Run Hello Program by Shell

STEP1 键盘中的 hello字符串被加载进寄存器中

./后面的hello不是系统程序,所以处理器会把hello这个字符串放入内存中,
在这里插入图片描述

STEP2 复制磁盘上的hello可执行文件的数据与代码到内存

数据就是 hello,world\n 。此过程利用技术DMA(直接内存访问),数据不经过CPU,直接从磁盘到内存
在这里插入图片描述

STEP3 CPU将hello,world\n 从内存复制到寄存器文件,再从寄存器文件复制到显示设备,显示

在这里插入图片描述

1.3.3 Memory Hierarchy

即使执行如此简单的打印程序,数据信息仍然在磁盘、内存、处理器以及IO设备之间搬运,需要花费大量时间。

Commonly
Larger storage devices than Smaller storage devices
Faster storage devices more EXPENSIVE than Slower storage devices

在这里插入图片描述

so ,there comes the Cache matter:
在这里插入图片描述

这个计算机的信息存储可用以下表示:
存储器山
在这里插入图片描述

1.4 The Operating System Manages Hardware

1.4.1 Operating System

上面的程序无论shell还是hello均未访问硬件如键盘、显示器、磁盘等等,全都是操作系统作为中介而代之
在这里插入图片描述
操作系统引入的抽象:
在这里插入图片描述

1.4.2 Process

在这里插入图片描述
这里的上下文切换中的上下文是指——
操作系统会保留程序运行中的各种状态参数,比如当前寄存器文件中的值、PC值(指令地址寄存器中的值)、内存中的值等等

现代操作系统一个进程其实是由多个线程组成。线程运行在进程的上下文之中。共享数据与代码
在这里插入图片描述

1.4.1 Virtual memory

每一个进程的地址空间就是虚拟地址,其典型分布如下:
在这里插入图片描述

1.4.1 File

这是Unix/linux类系统的哲学抽象,其实绝大多数系统均为此。
在这里插入图片描述

1.5 Use ssh run hello program

远程网络运行程序
在这里插入图片描述

1.5.1 如何获得更高的计算力?

Thread-LevelConcurrency(线程级并发)
Instruction-Level Parallelism(指令级并行)
Single-Instruction Multiple-Data Parallelism(单指令,多数据并行)

1.5.1.1 Multi-core Processor Organization

在这里插入图片描述

1.5.1.2 Hyper Threading

在这里插入图片描述

1.5.1.3 Instruction-Level Parallelism

在这里插入图片描述

1.5.1.4 Single Instruction Multiple Data

单指令多数据
在这里插入图片描述

1.5.2 Abstractions in Computer Systems

在这里插入图片描述


📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤ 分享👥 留言💬thanks!!!
📚愿大家都能学有所得,功不唐捐!

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值