zoukankan      html  css  js  c++  java
  • 《深入理解计算机系统》学习—

    前言

      对于我自己学习这本书的方式以及理解,因为自己懒 so create this essay,来监督自己认真学习。首先会预习一遍要学的章节,然后去B站观看相关教程不过光看视频会错过很多知识,因为是自我学习,所以会简要提炼自己的理解。如果有误,会及时改正。

      因为分硬件,软件。软件方面我GitHub里找了一个挺有趣的,且方便学习的概要,于是fork了 链接硬件还没下落,等学了再补上

    不知什么原因,网页只能点旁边的标签,但编辑预览时候可以点

    位上下文

    8个位被组成为一组,成为字节,只由ASCII字符构成的文件称为文本文件,其余成为二进制文件

    程序运行阶段

    1.预处理阶段

      预处理(ccp)根据以#开头的命令,修改原始的c程序。

    2.编译阶段

      编译器(ccl)将文本文件xx.i翻译成文本文件xx.s。

    //包含一个汇编语言程序,函数main的定义
    main:
      subq $8,%rsp
      movl $.LCO,%edi
      call puts
      movl $0,%eax
      addq $8,%rsp
      ret
    

    3.汇编阶段

      汇编器(as)将xx.s翻译成机器语言指令,把这些指令打包成一种叫可重定位目标程序的格式,并将结果保存在文件xx.o中(xx.o的文件是一个二进制文件)。

    4.链接阶段

      链接器(ld)将xx.o和printf.o合并,结果得到xx文件,它是一个可执行目标文件,可以被加载在内存中,由系统执行。

    编译系统流程图

    graph LR 开始-->|xx.c| A(ccp) A-->|xx.i|B(ccl) B --> |xx.s|C(as) E[printf.o]--> D C -->|xx.o| D(ld) D -->|xx|结束

    了解编译系统如何工作的好处

    为什么要了解,书中给出的三个回复:优化程序性能,理解链接时出现的错误,避免安全漏洞。这些后续的章节会详细说明。

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

    大致概念

    想在Unix系统上执行文件,要将文件名输入到称为shell的应用程序中,shell是一个命令行解释器。

    系统硬件组成

    1.总线:贯穿整个系统的是一组电子管道,它携带信息字节并负责在各个部件间传递。
    2.I/O设备:系统与外部世界的联系通道。
    3.主存:是由一组 动态随机存取存储器(DRAM)芯片组成的。
    4.处理器:是解释或者执行存储在主存中的指令的引擎。处理器的核心是有一个大小为一个字的存储设备(或寄存器),称为程序计数器。
    具体的简单操作p7(加载,储存,操作,跳转)

    运行程序

    在ipad的上画了一边(画的丑就不贴了,直接看p7~p8的三幅图),差不多大概理解1)键盘输入命令到达主存储器,2)利用直接存储器存取(DMA)技术,数据可以不通过cpu直接从磁盘到达主存。3)这些指令字节从主存复制到寄存器文件,再从寄存器文件中复制到是显示设备。

    高速缓存的重要

    简要概括,第六章学习内容,采用更小更快的存储设备,称为高速缓存储存器(cache memory),作为暂时的集结区域,存放处理器近期可能会需要的信息

    储存设备形成层次结构

    第六章知识,主要思想:上一层的储存器作为低一层储存器的高速缓存。看p10页的图方便理解。

    操作系统管理硬件

    软件:应用程序 操作系统(两个基本功能1.防止硬件被失控的应用程序滥用2.向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备)
    硬件:处理器 主存 I/O设备

    进程

    一个抽象的概念,就是一个正在运行的程序。

    线程

    一个进程实际上可以由多个称为线程的执行单元组成。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

    虚拟内存

    也是一个抽象概念,每个进程都在独占地使用主存。
    每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。
    从最低的地址开始
    程序代码和数据对所有的进程来说,代码是从同一固定地址开始,紧接着的是和C全局变量相对应的数据位置
    代码和数据区后紧随着的是运行时堆
    共享库大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样共享库代码库数据的区域
    位于用户虚拟地址空间顶部的是用户栈
    内核虚拟内存地址空间顶部的区域是为内核保留的

    文件

    文件就是字节序列。是一个抽象概念。不是很理解……

    系统之间利用网络通信

    简单来说就是,用网络和其他的系统连接到一起,差不多就是你通过邮箱给你的朋友发信息等等,在11章会学到相关知识

    重要主题

    Amdahl定律

    对系统某部分加速时,其对系统整体影响取决于该部分重要性和加速程度。
    要想显著加速整个系统,必须提升全系统中相当大的部分的速度。

    如果有一个应用程序完成一项任务需要时间为Told,该应用程序某部分执行时间与总时间比例为α,若将该部分性能提升k倍,总的执行时间为Tnew = Told [ (1 - α) + α/k ]

    当k趋向于无穷,T∞=1/(1-α)

    并发和并行

    1.线程级并发
    2.指令级并行
    3.单指令、多数据并行
    这里有点绕

    并发是指一个处理器同时处理多个任务。
    并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。(并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统)

    第三种并行就是一条指令可以产生多个可以并行执行的操作

    计算机系统中抽象的重要性

    1.文件是I/O设备的抽象
    2.虚拟内存是对程序储存器的抽象
    3.进程是对一个正在运行的程序抽象
    4.虚拟机是对整个计算机的抽象,包括操作系统,处理器和程序。

    关于课程视频第一节课,印象最深的是用代码演示爆内存的后果,还有地址读取的速度差,例如下列代码

    for(int i=0;i<1000;i++)
        for(int j=0;j<100;j++)
              a[i][j]=b[i][j];//4.3ms
    
    for(int j=0;j<100;j++)
        for(int i=0;i<1000;i++)
              a[i][j]=b[i][j];//81.2ms
    

    后面讲了对于如何学这个课程,每章节读三遍,再看视频,然后每次实验做好,一共六个实验(数据实验 炸弹实验 攻击实验 缓存实验 Shell实验 malloc实验 proxy实验),到时候实验自己也完成,希望完成度较高。第一章的学习就结束,然后学习第二章以及定期更新随笔希望是每三到四天,毕竟自己的时间也不是很多。

  • 相关阅读:
    iOS 新建xib文件时,最外层view的约束问题
    React native 无法弹出调试控件的问题
    从GitHub下载demo时遇到的依赖问题
    Mac 解决 Sourcetree 同步代码总需要密码的问题
    Mac 安装JRE 1.8
    正则表达式-- (.*?) 或 (.*+)
    字符串内有多个#号,每俩#号为一组,JavaScript 截取每组#号之间的字符
    Js/jQuery实时监听input输入框值变化
    Redis设置密码
    redis本机能访问 远程不能访问的问题
  • 原文地址:https://www.cnblogs.com/luoyugongxi/p/14401038.html
Copyright © 2011-2022 走看看