CSAPP | Chapter 1 | 计算机系统漫游

CSAPP | Chapter 1 | 计算机系统漫游

计算机系统由系统软件硬件组成。
对于一个简单的 C 程序 hello.c 来说,即便它非常简单,但是为了让它运行,系统的每个主要组成部分都需要协调工作。

#include <stdio.h>

int main()
{
	printf("hello, world\n");
	return 0;
}

信息就是位 + 上下文

hello.c 的 ASCII 码文本表示
image.png
hello 程序的生命周期从源程序(或源文件)开始,源程序实际上是由 0 和 1 组成的位(比特)序列。8 个位又组成 1 个字节。每个字节表示文本中的某些文本字符。
大部分计算机系统用 ASCII 标准,即用单个字节表示每个字符。
像 hello.c 这样只有 ASCII 字符构成的文件称为文本文件,所有其他文件都称为二进制文件
实际上,系统中所有信息,都是以位序列存储,也就是二进制序列。唯一区分不同数据的就是我们读到这些对象时的上下文。例如,在不同上下文中,一个同样的字节序咧可能表示一个整数、浮点数、字符串或者机器指令。

ISO:International Standards Organization 国际标准化组织

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

为了能运行 hello.c 程序,每条 C 语句都必须被其他程序转化为一系列低级机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打包好,并以二进制磁盘文件的形式存储。目标程序也称为可执行目标文件
Unix 系统,源文件到目标文件的转化由编译器驱动完成。

gcc -o hello hello.c

编译系统

预处理器preprocessor、编译器compiler、汇编器assembler和链接器linker:
编译系统

预处理阶段 Preprocessing phase

预处理器(cpp)根据以 # 开头的命令修改原始的 C 程序。例如 #include<stdio.h> 命令告诉预处理器读取系统头文件 stdio.h 的内容并把它插入到程序文本中。结果得到了另一个 C 程序,是以 .i 作为文件后缀(扩展名) suffix.

编译阶段 Compilation phase

编译器(cc1)将文本文件 hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序,这个程序包含了 main 函数的定义。

main:
	subq $8, %rsp
	movl $.LC0, %edi
	call puts
	movl $0, %eax
	addq $8, %rsp
	ret
汇编阶段 Assembly phase

汇编器(as)将 hello.s 翻译为机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program),并将结果保存在目标文件 hello.o 中。hello.o 是一个二进制文件,它包含 main 函数的指令编码(encode)。如果我们用文本编辑器直接打开这个文件,会看到一堆乱码(gibberish)

链接阶段 Linking phase

在 hello 程序中,调用了 printf 函数,它是每个 C 编译器都提供的标准 C 库(standard C library) 中的一个函数。 printf 函数存在于一个名为 printf.o 的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到 hello.o 程序中。链接器(ld) 就负责处理这种合并,结果得到 hello 文件,它是一个可执行目标文件,可以被加载到内存中并由系统执行。

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

要运行可执行 hello 程序,在 Linux 系统下我们输入

linux> ./hello
hello, world

可以看到终端输出了 hello, world
shell 会判断输入的命令,如果第一个单词不是内置的指令,那么就会被认为是可执行文件的名字,并且运行它。

系统的硬件组成

image.png

Buses 总线

总线负责携带信息字节并且在各个部件中传递。通常设计为传送特定长度的字节块(字)。

I/O 设备

I/O 设备即输入/输出设备,是系统与外部世界的联系通道。每个 I/O 设备都通过一个控制器或者适配器与 I/O 总线连接。
控制器(controller) 是 I/O 设备本身或者系统的主印制电路板 (主板 motherboard)。
适配器(adpater) 是一块插在主板插槽上的卡。
虽然他们的封装方式不同,但是他们的功能都是在 I/O 总线和 I/O 设备之间传递信息。

Main Memory 主存

主存是一个临时存储设备。在处理器执行程序时,用来存放程序和程序处理的数据。
物理上:主存由 动态随机存储存储器 (DRAM) 组成。
逻辑上:存储器是一个线性的字节数组,每个字节都有自己特定的从零开始地址(数组索引)。

Processor 处理器

中央处理单元(CPU),简称处理器,是解释或执行存储在主存中指令的引擎。
它的核心是一个大小为一个自己的存储设备(或寄存器),称为 程序计数器(PC)。在任何时候,PC 都指向主存中的某条机器语言指令(也就是含有该指令的地址)。
在计算机系统通电到断电,处理器一直在不断执行程序计数器指向的指令,再更新程序计数器,指向下一条指令。
处理器按照指令集架构(ISA: Instruction set architecture) 来操作。处理器读取 PC 指向的内存处的指令并且解释指令中的位,进行指令的操作,并且更新 PC,让它只想下一个指令(这条指令不一定和刚刚执行的指令相邻)。
Main memory 主存
register file 寄存器文件: 由一些单个字长的寄存器组成,每个寄存器都有自己唯一的名字。
ALU(arithmetic/logic unit) 算术逻辑单元: 计算新的数据和地址值
CPU 可能在指令要求下执行的操作:
Load 加载: 从主存复制一个字节或者一个字到寄存器来覆盖寄存器原先的内容。
Store 存储: 从寄存器复制一个字节或者一个字到主存的某个位置来覆盖这个位置上原来的内容。
Operate 操作: 把两个寄存器的内容复制到 ALU,ALU 对他们进行算数操作,并将结果存放到一个寄存器中,覆盖寄存器中原来的内容。
Jump 跳转: 从指令本身抽取一个字并复制到 PC(程序计数器),覆盖 PC 原先的值。

hello 程序的运行

image.png
当目标文件 hello 的代码和数据被加载到主存,处理器就开始执行 hello 程序 main 程序中的机器语言指令。这些指令将 “hello, world\n” 字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示到屏幕上。
如果使用 direct memory access(DMA) 技术,数据可以不通过处理器而直接从磁盘到达主存。
image.png

Caches 高速缓存

由于信息从一个地方移动到另一个地方需要花费大量开销(overhead)。
Cache Memory 高速缓存存储器 作为暂时的集结区域,存放处理器可能会用到的信息。

Cache memories

image.png

Memory Hierarchy

image.png

The Operating System Manages the Hardware

应用层如果想控制硬件,必须经过操作系统,见下图。
image.png

Processes 进程

进程:A process is the operating system’s abstraction for a running program.
multicore processors: 多核处理器
uniprocessor system: 单处理器系统
multiprocessor system: 多处理器系统
context switching: 上下文切换
操作系统保持跟踪进程所需的所有状态信息。这种状态就是 上下文。单处理器系统系统在任何一个时刻只能执行一个进程的代码。当操作系统决定把控制权转换为一个新的进程,就会进行上下文切换,保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从上次停止的地方开始。
image.png

示例场景中有两个并发的进程∶shell 进程和 hello 进程。最开始,只有 shell 进程在运行,即等待命令行上的输入。当我们让它运行 hello 程序时,shell 通过调用一个专门的函数,即系统调用,来执行我们的请求,系统调用会将控制权传递给操作系统。操作系统保存 shell 进程的上下文,创建一个新的 hello 进程及其上下文,然后将控制权传给新的 hello 进程。hello 进程终止后,操作系统恢复 shell 进程的上下文,并将控制权传回给它,shell 进程会继续等待下一个命令行输入。

内核 kernel 控制从一个进程过渡到另一个进程。

Threads 线程

实际上,一个进程可以由多个称为线程的执行单元组成。
每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

Virtual Memory

虚拟内存假设每个进程都在独占地使用主存,每个进程看到的内存都是一样的,称为虚拟地址空间。
进程的虚拟地址空间:(图中的地址从下往上增大)
image.png
从下往上依次为:

  • 程序代码和数据:
    所有进程,代码是从同一固定地址开始的。
  • 堆:
    代码和数据区在一开始运行时就被指定了大小。而堆可以动态扩展和收缩,例如使用 malloc 和 free 函数
  • 共享库
    类似于 C 标准库

  • 在用户虚拟地址空间的顶部是用户栈。编译器用它来实现函数调用。栈和堆一样,可以动态扩展和收缩。每当我们调用一个函数,栈就会增长。从一个函数返回时,栈就会收缩。
  • 虚拟内存
    应用程序不能直接读写这个区域的内容或者直接调用内核代码定义的函数。只能调用内核来执行这些操作。

Files

文件就是字节序列。
系统中所有输入输出都是通过使用一小组称为 Unix I/O 的系统函数调用读写文件来实现的。

Systems Communicate with Other Systems Using Networks

网络可以视作一个 I/O 设备。现代系统经常通过网络和其他系统连接在一起。

利用 telnet 通过网络远程运行 hello

Concurrency and Parallelism 并发和并行

并发(Concurrency):指的是一个同时具有多个活动的系统
并行(Parallelism);用并发来使一个系统运行的更快。

Thread-Level Concurrency 线程级并发

使用线程,可以在一个进程中执行多个控制流。传统意义上是通过使一台计算机在他正在执行的进程间快速切换来实现的。它允许多个用户同时与系统进行交互。以前用的是 单处理器系统,用一个处理器来完成多个任务切换。
多处理器系统:一个由但操作系统内核控制的多处理器组成的系统。
多核也就是将多个 CPU(核) 集成到一个集成电路芯片上。

4 个处理器核集成在一个芯片上


超线程(同时多线程)Hyperthreading: 允许一个 CPU 执行多个控制流。

Instruction-Level Parallelism 指令级并行

现代处理器可以同时执行多条指令的属性称为指令集并行。

Single-Instruction, Multiple-Data (SIMD) Parallelism 单指令多数据并行

允许一条指令产生多个可以并行执行的操作。

Abstractions in CS

API: application program interface 应用程序接口。

计算机系统提供的一些抽象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/595172.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI适老化!10秒一张的AI姓氏头像,居然要卖9块9?中老年用户都说好!

看短视频的你&#xff0c;一定会刷到过这样的直播间&#xff1a; 现在大家明白了&#xff0c;这是一个做姓氏图像的直播间。我刚开始刷到的时候也觉得这种头像好看&#xff0c;高大上&#xff0c;也想做一个这样的图像&#xff0c;来当自己的微信头像。 做这样的图像需要排队刷…

迅饶科技 X2Modbus 网关 AddUser 任意用户添加漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…

代码随想录算法训练营DAY43|C++动态规划Part5|1049.最后一块石头的重量II、494.目标和、474.一和零

文章目录 1049.最后一块石头的重量II思路CPP代码 ⭐️494.目标和回溯算法抽象成01背包问题CPP代码本题总结 474.一和零思路CPP代码 1049.最后一块石头的重量II 力扣题目链接 文章链接&#xff1a;1049.最后一块石头的重量II 视频链接&#xff1a;这个背包最多能装多少&#xff…

高中数学-三角函数之常见题型总结

相关公式 新教材&#xff0c;取消了和差化积与积化和差的三角函数题目 例题1 解析 根据条件tanθ -2&#xff0c;我们应该就要想到&#xff0c;把待求式的角向θ靠拢 所以要想到如何降角&#xff0c;将2θ化成θ&#xff0c;那么&#xff0c;想到的公式就是&#xff1a;正弦…

【C++第三阶段】Set Map容器 员工分组案例

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 Set容器构造和赋值大小和交换插入和删除一次性迭代器&#xff08;可能迅速失效的迭代器&#xff09;长久保留的迭代器如何判断迭代器是否一次性 查找和统计set和multiset的区别pari对…

【notes2】并发,IO,内存

文章目录 1.线程/协程/异步&#xff1a;并发对应硬件资源是cpu&#xff0c;线程是操作系统如何利用cpu资源的一种抽象2.并发&#xff1a;cpu&#xff0c;线程2.1 可见性&#xff1a;volatile2.2 原子性&#xff08;读写原子&#xff09;&#xff1a;AtomicInteger/synchronized…

239 基于matlab的EKF(扩展卡尔曼滤波)_UKF(无迹卡尔曼滤波)_PF(粒子滤波)三种算法的估计结果比较

基于matlab的EKF(扩展卡尔曼滤波)_UKF(无迹卡尔曼滤波)_PF&#xff08;粒子滤波&#xff09;三种算法的估计结果比较&#xff0c;输出估计误差&#xff0c;并单独对粒子滤波进行估计及其置信区间可视化。程序已调通&#xff0c;可直接运行。 239 EKF(扩展卡尔曼滤波) - 小红书 …

Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)

目录 前言 一、表面着色器的补充介绍 二、案例viewDir详解 1.viewDir是什么 2.viewDir的作用 3.使用viewDir写shader 前言 注意观察的小伙伴会发现&#xff0c;这组教程前半部分我们在编写着色器的时候&#xff0c;用的是顶点着色器和片元着色器的组合。 SubShader{CGPRO…

Java转Kotlin

Kotlin 是一种静态编程语言 2011JetBrains开始开发Kotlin&#xff0c;用于多平台应用&#xff08;能脱离虚拟机&#xff0c;直接编译成可以在win,mac,linux运行的二进制代码&#xff09; 2017获得谷歌官方支持 语法简洁&#xff08;减少了大量的样板代码&#xff0c;语法糖&…

【Python深度学习(第二版)(2)】深度学习之前:机器学习简史

文章目录 一. 深度学习的起源1. 概率建模--机器学习分类器2. 早期神经网络--反向传播算法的转折3. 核方法 -- 忽略神经网络4. 决策树、随机森林和梯度提升机5. 神经网络替代svm与决策树 二. 深度学习与机器学习有何不同 可以这样说&#xff0c;当前工业界所使用的大部分机器学习…

服务器端口怎么查,服务器端口查看方法详解

服务器端口是网络通信的关键组件&#xff0c;对于网络管理员和系统管理员来说&#xff0c;了解和掌握如何查看服务器端口是非常重要的。接下来介绍两种常用的方法来查看服务器端口。 方法一&#xff1a;使用命令提示符&#xff08;CMD&#xff09; 1. 首先&#xff0c;点击电脑…

JavaScript百炼成仙自学笔记——12

函数七重关之五&#xff08;自执行函数&#xff09; 什么时候用它&#xff1f; 很多时候&#xff0c;我们只想执行一个函数&#xff0c;却无所谓这个函数叫什么名字。那么这种情况下就可以考虑使用自执行函数。 {function(){console.log(123);} }(); 这就是一个简单的自执行的…

视频剪辑:视频文件元数据修改工具,批量操作提升效率和准确性

在视频剪辑和后期处理的过程中&#xff0c;除了对视频本身的编辑和修改&#xff0c;元数据的管理和修改同样重要。元数据&#xff0c;如标题、艺术家、专辑封面等&#xff0c;不仅提供了视频文件的基本信息&#xff0c;还有助于更好地组织、搜索和共享视频内容。而针对视频文件…

dumpsys meminfo 流程中细节

源码基于&#xff1a;Android U 参考&#xff1a; dumpsys meminfo 详解(R) dumpsys meminfo 详解(U) 1. 命令入口 MemBinder frameworks/base/services/core/java/com/android/server/am/AMS.javastatic class MemBinder extends Binder {ActivityManagerService mActivity…

原型模式和建造者模式

1、原型模式 1.1 概念 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 1.2 结构 原型模式包含如下角色&#xff1a; 抽象原型类&#xff1a;规定了具体原型对象必须实现的的 clone() 方法。 具体原型类&#xff1a;实现抽…

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…

二.Django--创建多个APP路由映射

目录 1-创建项目 2-创建多个APP 3-注册APP 4-创建"前端页面"并做路由映射 各个APP里面的views.py写视图函数等等 1-创建项目 django-admin startproject 项目名 django-admin startproject my_project 2-创建多个APP python manage.py startapp app名 pyth…

HttpCilent进行Post请求form-data接口,服务方接收不到参数

结论先行 生成分隔标识boundary在HttpPost中设置Header时带上boundary创建MultipartEntity时需要设置boundary 实现代码如下 /*** param url 调用接口的地址* param paramMap 调用接口传入的方法体参数*/ public static String postDataByFormData(String url, Map<Strin…

【参赛总结】第二届云原生编程挑战赛-冷热读写场景的RocketMQ存储系统设计 - Nico

关联比赛: 2021第二届云原生编程挑战赛1&#xff1a;针对冷热读写场景的RocketMQ存储系统设计 引子 在一个浑浑噩噩的下午&#xff0c;百无聊赖的我像往常一样点开了划水交流群&#xff0c;细细品味着老哥们关于量子力学的讨论。嬉戏间&#xff0c;平常水不拉几的群友张三忽…

【毕业设计】基于SSM的运动用品商城的设计与实现

1.项目介绍 在这个日益数字化和信息化的时代&#xff0c;随着人们购物习惯的转变&#xff0c;传统的实体商店已经无法满足人们日益增长的在线购物需求。因此&#xff0c;基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的运动用品商城项目应运而生&#xff0…