title: CSAPP_Chapter1
date: 2022-01-26 19:45:15
categories: CSAPP
cover: https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE4wppt?ver=bc05


CSAPP第一章

本章的目的

本书的目的是让我们程序员能够写出更好的程序,而为了能够写出更好的程序,我们程序员需要做到以下几点:

了解C语言的存储方式以及C语言的生命周期

编写好的C程序是以文本格式放在硬盘里的,而了解C语言生命周期,就是去了解为C程序准备的编译系统,原因有三点:

  1. 为了优化程序性能;去了解C语言从被创建,到被编译为可执行文件的过程,这需要深入C语言的汇编层面实现等等,这些可以帮助我们选择更好的方式进行功能的实现,以及了解C语言的各种抽象表示是如何实现的,比如指针、数组;
  2. 处理链接方面的错误;gcc把 .c文件编译成为可执行文件的最后一个步骤就是链接,是将print.o和被编译为可重定向的二进制目标文件依靠某种方式相结合的过程,最后编译完成的文件拥有了能够把结果输出在命令行中的能力;链接方面的错误包括在同一工程下定义两个同名的全局变量等等;
  3. 避免安全漏洞;比如缓冲区溢出等问题;

了解计算机的底层

其实就是去了解C程序在被编译完成到显示在命令行里的过程,这其间免不了接触计算机的硬件和他们的抽象,因为这要涉及把文件从哪读到哪,和在哪加载的过程;

具体内容

1. C程序的编译过程

2. 系统硬件部分

硬件组成

  1. 总线

    总线负责在硬件之间传递各种比特流,一次可以传送的字节为系统的字长,比如32位系统的字长是32bit,也就是4字节;

    在并发编程时,为了保证线程之间对共享资源的有序访问,通常需要给线程加锁,比如Java中的关键字synchronized;如果发生多个线程对共享资源的重度竞争,synchronized会膨胀为重量级锁,而重量级锁需要向操作系统申请内核空间的锁资源,该锁资源追溯到HotSpot里,其中一种实现方式便是锁总线;
  2. I/O设备

    输入输出设备,比如键盘、鼠标、显示器和磁盘,他们和总线之间靠控制器和适配器连接起来;

  3. 主存

    类似一个巨大的一维数组,每个存储单元都由他的地址和存储的数据这两部分组成,将C语言反编译为汇编即可发现汇编的许多东西都是在不同的地址和存储数据之间反复横跳;

  4. 处理器

    由程序计数器PC、逻辑运算单元ALU和寄存器文件组成,他们的工作很简单,PC指向下一条指令地址,读取该地址的值,ALU进行逻辑运算,寄存器负责存储信息;

运行Hello程序

  1. Hello程序编译完成之后,在shell程序中输入./a.out,这个过程中,shell程序会把按下的值存到寄存器里,再读到主存当中,按下回车后系统会将命令通过IO总线送入CPU内部,进行解析;
  2. 这时,Shell发送命令,要从磁盘中找出Hello程序并加载到主存里,其实Hello程序会从磁盘加载到CPU,再从CPU加载到主存里,但DMA技术可以直接省略到CPU兜一圈的那一步;
  3. 加载到主存之后,CPU便开始执行Hello程序的main程序中的机器语言指令, 也就是把那些个01字符串再一条一条读入CPU中, 然后执行, 最后通过IO总线将哈喽沃德传到显示器并显示在屏幕上,整个流程结束;

3. 高速缓存

根据机械原理, 较大的存储设备的运行速度低于较小的存储设备, 为了让系统从硬盘和主存中读取数据的速度变快, 引入了高速缓存, 高速缓存比主存小, 从高速缓存中读取数据要比从主存中读取数据快很多; 同时还有另外一个好处, 程序如果要访问某个字节, 就很可能会访问那个字节左右的一坨字节, 高速缓存的思想恰好和这个原理相契合, 程序要调用就会调用某一个区域里的数据, 这些数据刚好可以被装进高速缓存中;

4. 操作系统管理硬件

图1-10展示了计算机系统硬软组件的关系, 应用程序想要访问硬件, 必须通过操作系统; 图1-11是老大爷操作系统给他的子子孙孙—应用程序所做的抽象, 操作系统为应用程序屏蔽掉硬件设备的复杂性, 也就是说, 操作系统干了很多事, 当应用程序通过操作系统访问硬件时, 好像他在单独使用那些硬件设备一样;

  1. 进程

    进程是对一个正在运行的程序进行的抽象, 这种抽象给人一种感觉, 好像这个程序是单独运行在计算机上的; 但其实每个进程都在CPU里运行一段时间; 这种抽象大致的实现为, 操作系统记录下即将不再占用CPU资源的进程1的上下文, 上下文包括PC和寄存器值等, 待其他进程也放弃了CPU资源时, 操作系统加载进程1的上下文, 让他再次运行在CPU中; 下图中, 进程A要进行上下文切换, 需要调用一个专门的系统调用函数, 这个函数里装的是内核代码, 存放在内核虚拟内存当中, 应用程序不可以对这部分内存进行修改;

  2. 虚拟内存

    虚拟内存是对内存的抽象, 进程通过虚拟内存看内存, 好像自己在独占内存一样; 虚拟内存如下图, 从下到上依次是代码和全局变量数据, 堆, 存放标准库和数学库的共享库, 函数调用时会增大的栈, 以及存放内核代码的内核虚拟内存;

  3. 文件

    所有的I/O设备都可以看成是文件, 这使得进程可以以一种统一的视角去看待各式各样的I/O设备, 也就是说, 他看鼠标也是文件, 看显示器也是文件, 网络也是, 就跟之前做的抽象是一样的;

5. 重要主题

  1. Amdahl定律

    思想: 当我们对系统的某一部分进行性能的加速时, 加速效率取决于这一部分占系统的百分之多少, 以及加速了多少;

    具体公式来描述, 假设系统执行某程序所需时间为Told, 系统的某部分执行该程序的某部分所需时间为αTold, 系统的该部分加速之后执行原来的那部分程序所需时间为αTold / k, 加速之后, 整个系统需要的新总时间为

    Tnew = (1 - α)Told + αTold / k

    所以加速比为

  2. 并发

    线程级并发, 指CPU在进程之间快速切换, 形成并发执行的假象; 超线程的处理器其实用到异步的思想;

CSAPP_Chapter1相关推荐

最新文章

  1. 使用fpm简单制作自定义rpm包
  2. 2020 蚂蚁面试指南!
  3. IntelliSense: const char * 类型的实参与 LPCTSTR 类型的形参不兼容
  4. Http:Get、Post、Put、Delete、Head、Options详解
  5. 常见人名大全_生辰八字起名取名:2020年属鼠的女孩起名字大全
  6. 中国传媒大学计算机学院夏令营,中国传媒大学夏令营
  7. JQuery技巧总结【转】
  8. 使用RecyclerView替代ListView(一)
  9. 《图解TCPIP》知识学习(1.4):协议由谁规定
  10. 路径规划:RRT算法在ROS中的实现
  11. ISO9001 质量管理体系认证
  12. Prometheus 四种metric类型
  13. msl3等级烘烤时间_MSL等级
  14. macOS Monterey 12.6.1 (21G217) 正式版 ISO、IPSW、PKG 下载
  15. 用canvas画圆形图片
  16. python中的相对导入//__name__和__package__的作用//以及相对导入的两个经典错误
  17. 数据库设计之商品表分析2
  18. iOS APP:简单粗暴的自制下拉刷新
  19. 计算机处理器份额,2020 年电脑处理器排行榜单出炉
  20. PS通过模板批量替换数据转换为PDF

热门文章

  1. python人工智能应用实例_Python实现AI自动抠图实例解析
  2. IE文档模式的切换,Quirks模式
  3. Oracle--优化
  4. MIPS-单周期CPU设计
  5. 区块链溯源是如何实现的?
  6. android 实现Home键和Back键的功能
  7. 计算机房间墙壁的布置,房间小怎么布置 小房间布置有妙招
  8. 解决Linux遇到There are no enabled repos.的问题
  9. 主持人大赛计算机专业,计算机系主持人大赛简报
  10. c#简单几步实现圆角按钮