CSAPP-C1:计算机系统漫游 keynote

计算机系统漫游

信息就是位+上下文

hello.c的表示方法说明了一个基本思想:系统中所有的信息-包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由比特流表示的。区分不同数据对象的唯一方法是我们读到这些数据的上下文。(因为不同的上下文中,一个通严格字节顺序可能表示一个整数、浮点数、字符串或者机器指令)

被翻译成不同格式的程序

GCC将hello.c翻译成一个可执行文件hello。这个过程划分为4个阶段:

  1. 预处理 -> hello.i 修改了的源程序

  2. 编译器 -> hello.s 汇编程序

  3. 汇编器 -> hello.o 可重定位目标程序

  4. 链接器 -> hello 可执行文件

了解编译器如何工作的裨益

  1. 优化程序性能; 2. 能够理解链接时出现的错误;3. 避免安全漏洞

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

系统的硬件组成
总线

贯穿整个系统的十一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。传送定长的字节块,也就是字(word)。32位4Bytes,64Bytes。

I/O设备

I/O设备是系统与外部世界的联系通道。

主存

主存是一个临时的存储设备,在处理器执行程序时候,用来存放程序和程序处理的数据。

处理器

CPU的操作有加载、存储、操作、跳转

运行hello程序

在执行./hello后,shell将所有的字符逐一①读入寄存器,再把它②放到内存中。利用DMA技术可以让数据不通过CPU直接到达主存。
一旦目标文件的代码和数据被加载到主存,CPU就开始执行hello程序中的main程序中的机器语言指令。这些指令①将“hello worldn”字符串从主存复制到寄存器文件,②再从寄存器文件复制到显示设备,最终显示在屏幕上。

高速缓存至关重要

速度量级比:寄存器:内存:磁盘 = 1:100:100000
因为CPU与主存处理速度差异,更小更快的存储设备-->高速缓存存储器cache memory应运而生,主要用来存放CPU近期可能用到的数据
一般CPU芯片上的L1高速缓存`容量可以达到数万字节。
容量为数十万到数百万字节的L2高速缓存通过一条特殊的总线连接到CPU。
速度比上L2高速缓存是L1高速缓存的5倍。
实现L1/L2高速缓存的技术叫做静态随机访问存储器SRAM硬件技术实现的。

存储设备形成层次结构

图片描述

操作系统管理硬件

操作系统两个基本功能:

  1. 放置硬件被失控的应用程序滥用;

  2. 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。

为了保障上面两个功能实现,操作系统提供了几个基本的抽象概念:

  1. 文件是对I/O设备的抽象表示

  2. 虚拟内存是对主存和磁盘I/O设备的抽象表示

  3. 进程是对处理器、主存和I/O设备的抽象表示

进程

操作系统提供一种假象:系统上有这个程序在运行。程序上看上去是独立的使用CPU、主存和I/O设备。CPU看上去好像在不间断执行程序中的指令,就好像程序的代码和数据是系统内存中唯一的对象。当然这些假象只是系统通过进程的概念来进行封装。进程是计算机科学中嘴成功的概念之一。

一个CPU并发执行多个程序是通过CPU进程间切换技术实现的,这种切换叫做上下文切换
上下文的定义:操作系统保持跟踪进程运行所需的所有状态信息
进程之间的切换的指挥官是系统内核kernel。内核的本质是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时候,比如读写文件,这时候需要执行系统调用system call来将控制权丢给内核。内核执行相关请求后并返回结果给应用程序。
内核不是一个进程而是管理所有进程所用代码和数据结构的集合

线程

一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,以共享的形式持有这代码和全局数据。
线程对比进程的优势在于:线程间共享数据效率远高于进程间

虚拟内存

定义:虚拟内存是一个抽象概念,它为每一个进程提供一个假象,即每一个进程都在独占地使用主存。每个进程看到的内存都是一致的,成为虚拟地址空间

地址空间组成:

  • 最上面的区域是留给操作系统的代码和数据,对任何进程来说是一致的,用户(APP层开发者)不可见。

  • 地址空间底部区域存放用户进程定义的代码和数据。

虚拟地址空间每个区的作用
程序代码和数据

对所有的进程来说,代码是从同一个固定的地址开始,紧接着是和C全局变量对应的数据位置。代码和数据区是直接按照可执行目标文件的内容初始化的,举个栗子如上面提到的hello

代码和数据区紧接着是运行时候的堆。代码和数据区在进程一开始运行时候就被指定了大小,但是调用malloc或者free类的API的时候可以在代码运行时进行动态的扩展或者收缩内存。

共享库

大约在地址空间中间部分是一块存放C标准库和数学库这样的共享库的代码和数据区域。

位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用(函数栈)。和堆一样,用户站在程序执行期间可以动态的扩展和收缩。

内核虚拟内存

不允许读写或直接调用

总结:虚拟内存的运作需哟啊硬件和操作系统之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为硬盘的高速缓存。

图片描述

文件

定义:文件就是字节序列

系统之间的网络通信

网络简单可以看成机器间的数据拷贝...
图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值