博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解计算机系统(CSAPP) 第一章学习笔记
阅读量:2352 次
发布时间:2019-05-10

本文共 2711 字,大约阅读时间需要 9 分钟。

文章目录


1.编译过程

编译系统(compilation system):预处理器(pre-processor)、编译器(compiler)、汇编器(assembler)、链接器(linker)

编译系统
预处理阶段:处理字符#开头的命令,即:1)将头文件的内容插入程序文本中。2)宏定义替换。3)条件编译(#if #ifdef),不被编译的部分变为空行。4)删除注释

编译阶段:通过编译器将源程序翻译成汇编程序(assembly-language program)

汇编阶段:将汇编程序翻译成机器语言指令,并将其打包成可重定位目标程序(relocatable object program)

链接阶段:链接器将各个.o文件合并成可执行文件。链接器使得分离编译成为可能。在编写大型程序时,可将模块分小,由此达到独立修改和编译不同模块的目的:未被修改的模块不用重新编译,而只需将修改后的模块编译,重新链接即可。e.g. hello.c中的printf函数存在printf.o(已经单独预编译了的目标文件)中,链接器将其合并后得到可执行文件


2.系统的硬件组成

系统的硬件组成

  1. 总线(buses):通常总线被设计成传送定长的字节块,也就是字。字中的字节数*(字长word size)*,是一个基本的系统参数,大多数机器为4个字节(32位)或8个字节(64位)
  2. I/O设备(I/O devices):每个I/O设备都通过一个*控制器(controller)或者适配器(adapter)*与I/O总线相连接。控制器和适配器的区别主要在于其封装方式:控制器是置于I/O设备本身的或主板上的芯片组,而适配器则是一块插在主板插槽上的卡
  3. 主存(main memory):主存即内存,是一个CPU能直接寻址的临时存储设备,在处理器执行程序时用来存放程序和程序处理的数据。物理上,主存由一组DRAM组成。逻辑上,存储器是一个线性的字节数组,每一个字节都有其唯一的地址(数组索引),这些地址均从零开始。
  4. 处理器(processor):CPU的核心是一个字长的寄存器,称为程序计数器(program counter PC)。在任何时刻,PC都指向内存中的某条机器语言指令。处理器看起来只是它的指令集结构的简单实现,但实际上现代处理器使用了非常复杂的机制*(微体系结构 microarchitecture)*来加速程序的执行

3.程序的执行

从磁盘加载可执行文件到内存并执行

可执行文件从磁盘加载到内存并执行的过程


4.高速缓存(caches)

  1. 缘由:如3.程序的执行中所示,hello程序最初存放在磁盘上,当程序加载时,被复制到内存中,当CPU运行时,指令又被复制到CPU中。这些复制的过程即为开销,减缓了程序“真正”的工作
  2. 原理:较大的存储设备要比较小的存储设备运行得慢
  3. 解决方案:采用更小更快的存储设备(高速缓存caches),作为暂时的集结区域,用来存放处理器近期可能会需要的信息

5.存储器层次结构

存储器层次结构

主要思想:上一层的存储器作为低一层存储器的高速缓存。e.g.在下载文件时,并不是下载一个字就写一个字到磁盘中,而是先写在内存中,当积累到一定量之后,再将这个块写入磁盘


6.操作系统

操作系统的基本功能:1)防止硬件被失控的应用程序滥用。2)向应用程序提供简单一致的机制来控制复杂且大相径庭的底层硬件设备

实现方法:通过几个抽象概念(进程、虚拟存储器、文件)来实现这两个功能

计算机分层与操作系统的抽象表示

  • 进程(processes):进程是OS对一个正在运行的程序的抽象,在一个OS上可以同时运行多个进程(运行的进程数多于CPU个数)。*并发运行(concurrently)*指的是,一个进程的指令和另一个进程的指令是交错执行的。并发运行是通过一种交错执行的机制(上下文切换 context switching)实现的。上下文切换
  • 线程(threads):在现代系统中,一个进程实际上可以由多个线程组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。优势:1)多线程之间比多进程之间更容易共享数据。2)线程一般来说都比进程更高效。
  • 虚拟存储器(Virtual Memory):虚拟存储器是一个抽象概念:每个进程都在独占主存。每个进程看到的是一致的存储器,称为虚拟地址空间(virtual address space)进程的虚拟地址空间
    • 程序代码和数据:对于所有进程来说,代码都是从同一固定地址开始,紧接着是全局变量相对应的数据位置。代码和数据区在进程一开始运行时就被规划了大小。
    • 堆(Heap):当调用mallocfree时,堆可以在运行时动态的扩展和收缩
    • 共享库(Shared libraries):存放像C标准库和数学库这样共享库的代码和数据的区域
    • 栈(Stack):编译器用它来实现函数调用。当调用一个函数时,栈增长;从一个函数返回时,栈收缩
    • 内存虚拟存储器(Kernel virtual memory):内核总是驻留在内存当中,是操作系统的一部分。该区域不允许应用程序读写或者直接调用其中的函数。
  • 文件(Files):即字节序列,每个I/O设备都可以视为文件

7.系统间的网络通信

利用telnet通过网络运行程序


8.并发和并行

并发(concurrency):一个同时具有多个活动的系统

并行(parallelism):用并发使一个系统运行更快

  • 线程级并发:允许多个用户同时与系统交互(e.g. 多人从一个web服务器获取页面)。允许一个用户同时从事多个任务(e.g. 运行多个程序)

    • 多核处理器:每个CPU核都有自己的L1、L2高速缓存,但共享更高层次的高速缓存,以及到内存的接口i7的组织结构
    • 超线程(hyperthreading):又称同时多线程(simultaneous multi-threading)。在一个单位时间内,一个CPU只能运行一个线程。而超线程技术在一个CPU内部仅复制必要的资源,让两个线程可同时运行。
  • 指令级并行:在较低的抽象层次上,现代处理器可以同时执行多条指令

    • 超标量(superscalar):处理器达到比一个周期一条指令更快的执行速率
  • 单指令、多数据并行(SIMD):在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作(e.g. 并行的对4对单精度浮点数做加法指令)。SIMD指令多是为了提高处理影像、声音和视频数据应用的执行速度


9.抽象

计算机系统的抽象

计算机系统提供不同层次的抽象表示,来隐藏实际现实的复杂性
文件是对I/O的抽象;虚拟存储器是对程序存储器的抽象;进程是对一个正在运行的程序的抽象;虚拟机提供对整个计算机的抽象


2019.3.23创建:1-6小节

2019.3.24更新:7、8、9小节,第一章总结完成

转载地址:http://lyqvb.baihongyu.com/

你可能感兴趣的文章
vue-router的两种模式及区别
查看>>
c中嵌入python
查看>>
python的C扩展
查看>>
python的USB通信
查看>>
eclipse svn
查看>>
SPSS基础教程:SPSS统计分析基础
查看>>
IBM SPSS Modeler 客户端 vs 服务器的区别详解
查看>>
DataStage On Cloud,构建云端的企业数据集成平台
查看>>
ICMP协议
查看>>
SSL协议
查看>>
IMAP,POP3,SMTP协议
查看>>
数据库协议
查看>>
SNMP协议
查看>>
RDP远程桌面协议
查看>>
ssh Forward X11
查看>>
搜索引擎知识图谱相关结构化数据挖掘与去歧处理
查看>>
找到n个元素中的第二小元素
查看>>
linux命令之find
查看>>
linux命令学习之cut
查看>>
linux下目录读权限与执行权限区别
查看>>