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

2024-05-11 05:36

本文主要是介绍CSAPP笔记——第一章计算机系统漫游,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


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

文章目录

    • 1.1The Lifetime of flello Program
      • 1.1.1gcc -o hello hello.c
      • 1.1.2.编译过程具体分析
    • 1.2 the reason of learning compilation system
      • 1.2.1 Optimizing program performance
      • 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
      • 1.3.2 Process Of Run Hello Program by Shell
        • STEP1 键盘中的 hello字符串被加载进寄存器中
        • STEP2 复制磁盘上的hello可执行文件的数据与代码到内存
        • STEP3 CPU将hello,world\n 从内存复制到寄存器文件,再从寄存器文件复制到显示设备,显示
      • 1.3.3 Memory Hierarchy
    • 1.4 The Operating System Manages Hardware
      • 1.4.1 Operating System
      • 1.4.2 Process
      • 1.4.1 Virtual memory
      • 1.4.1 File
    • 1.5 Use ssh run hello program
      • 1.5.1 如何获得更高的计算力?
        • 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

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!!!
📚愿大家都能学有所得,功不唐捐!

这篇关于CSAPP笔记——第一章计算机系统漫游的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978642

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个