速读《深入理解计算机系统》(代码片段)

fanxiaonan fanxiaonan     2023-05-06     239

关键词:

本周速读了《深入理解计算机系统》这本书,这本书从程序员的角度介绍了计算机系统的内在运作,展示了一些本质概念是如何实际的影响应用程序的正确性、性能和实用性的。收获如下:

1、关于进程和线程

  • 进程是操作系统对运行程序的一种抽象,是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
  • 线程有时被称为轻量级进程,是操作系统能够进行运算调度的最小单位。线程是进程中的一个实体,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源,同一进程中的多个线程之间可以并发执行。

2、几种数据传送指令

  • movl:传送双字,源操作数指定一个值,可以是立即数,可以存放在寄存器或存储器中。目的操作数指定一个位置,可以是寄存器或存储器地址。
  • movw:传送两个字节,当一个操作数为寄存器时,必须为下图中八个双字节寄存器元素中的一个。
  • movb:传递一个字节,当一个操作数为寄存器时,必须为下图中八个单字节寄存器元素中的一个。
  • movsbl和movzbl负责拷贝一个字节,并设置目的操作数中其余的位。
    • movsbl的源操作数是单字节的,并将高24位设置为源字节的最高位,然后拷贝到双字的目的中。
    • movzbl的源操作数是单字节的,在前面加24个0扩展到32位,然后拷贝到双字的目的中。
      技术图片

3、寄存器的使用惯例

    IA32采用了一组统一的寄存器使用惯例,根据惯例,寄存器eax、edx、ecx被划分为调用者保存寄存器,当过程P调用Q时,Q可以覆盖这些寄存器,二不会破坏任何P所需要的数据;ebx、esi、edi被划分为被调用者保存寄存器,这意味着Q必须在覆盖这些寄存器之前,将这些寄存器中的值保存到栈中,并在返回前恢复它们,因为P可能会在今后的计算中需要这些值。由此根据惯例,必须保持寄存器ebp、esp。

4、Amdahl定律

    Gene Amdahl做出了一个关于提高系统一部分性能的效果的简单但富有洞察力的观察,被称为Amdahl定律。其主要思想是当我们加快系统一个部分的速度时,对系统整体性能的影响依赖于这个部分有多重要和速度提高了多少。
    考虑一个系统在其中执行某个应用程序需要时间t,设系统某部分需要这个时间的百分比为a,二我们将它的性能提高到了k倍,因此整个执行时间为T=(1-a)t+(at)/k=t[(1-a)+a/k],由此可以得出加速S=1/[(1-a)+a/k]。例如原来占用60%时间的部分提高到了三倍即a=0.6,k=3,此时加速S=1.67。可以看出我们大幅度改进了系统的一个主要部分,但是净加速还是很小。
    所以Amdahl定律的主要观点就是要想大幅度提高整个系统的速度,必须提高整个系统很大一部分的速度。

5、高速缓存行、组和块有什么区别?

  • 块是一个固定大小的信息包,在高速缓存和驻村之间来回传送;
  • 行是高速缓存中存储块以及其他信息的容器;
  • 组是一个或多个行的集合,直接映射高速缓存中的组只有一行组成,组相联和全相联高速缓存中的组室友多个行组成的。
    在直接映射高速缓存中组和行是等价的,但在相联高速缓存中两者不能混用。

6、重定位的过程:

重定位由两步组成:

  • 重定位节和符号定义。链接器将所有想同类型的节合并为同一类型的新的聚合节,然后链接器将运行时存储器地址赋给新的聚合节,赋给输入模块定义的每个节,以及赋给输入模块定义的每个符号。这一步完成后,程序中每个指令和全局变量都有唯一的运行时的存储地址了。
  • 重定位节中的符号引用。链接器修改代码节和数据节中对每个符号的引用,使得它们指向正确的运行时地址,这一步的执行会依赖于重定位表目的可重定位目标模块中的数据结构。

7、基于gettimeofday函数的测量

使用这个库函数查询系统时钟以确定当前的日期和时间。这个函数把时间写入到一个调用者传递过来的结构中,这个结构包括一个单位为s的字段,还有一个单位为μs的字段。
技术图片

8、垃圾收集

垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配块,这些块被称为垃圾。自动回收堆存储的过程叫做垃圾收集。在一个支持垃圾收集的系统中,应用显式分配堆块,但从不显式地释放它们。在C程序的上下文中,应用调用malloc,但从不调用free。垃圾收集器定期识别垃圾块,并相应地调用free,将这些块放回空闲链表中。

速读《深入理解计算机系统(第三版)》问题及解决

第一章计算机漫游P13:用户栈和运行时堆有什么区别?数据结构中经常说堆栈,这里的堆和栈一样吗?和操作系统的堆、栈有什么区别?参考:堆和栈的区别(内存和数据结构)操作系统:栈:由操作系统自动分配释放,存放函数的... 查看详情

深入理解计算机系统(代码片段)

深入理解计算机系统卡内基·梅隆一门棵。原书第3版资料.第三版源码.原书第2版资料.计算机系统漫游源文件到目标文件的翻译过程可分为四个阶段,这四个阶段的程序被称为预处理器,编译器,汇编器和链接器,它们一起构成... 查看详情

深入理解计算机系统系列计算机系统漫游(代码片段)

操作系统原理是计算机行业基本功,想要成为一名计算机领域的专业人士,必不可少要打好基础。最近打算重点读一读《深入理解计算机系统》这本书,回顾和提升自己对计算机和操作系统的理解。这是第一篇:【计算机系统漫... 查看详情

深入理解计算机操作系统(笔记)(代码片段)

深入理解计算机系统1.实时系统概念2.编译连接3.AT&T汇编指令学习(GCC)4.内存对齐5.Big-Endian大端模式和Little-Endian小端模式6.过程调用1.实时系统概念前后台系统后台是各种面向硬件的程序,如中断,定时器,gpio等。前... 查看详情

《深入理解计算机系统》学习笔记(代码片段)

1、HelloWorld实现C代码实现:#include<stdio.h>intmain() printf("hello,world\\n"); return0;C++代码实现:#include<iostream>intmain()std::cout<<"HelloWorld!\\n 查看详情

2018-2019-120189221书籍速读第1周

2018-2019-120189221书籍速读第1周《深入理解计算机系统》第1章:怎样理解Amdahl定律?第2章:如何让代码可以正常的运行在任意字长的机器上,怎样进行不同机器之间的代码移植?第3章:C++和Java的编译器是怎样映射产生机器级程序... 查看详情

读《深入理解计算机系统》chapter1(代码片段)

读《深入理解计算机系统》Chapter1基础很弱,来补一下。1.计算机中的信息表示形式我们知道计算机底层是有一堆集成电路元件组成,每个集成电路元件有很多个引脚,每个引脚同上直流电压之后只有0V/5V,所以每个只能表示两种... 查看详情

《深入理解计算机系统》csapp_proxylab(代码片段)

ProxyLab开始日期:22.2.27操作系统:Ubuntu20.0.4Link:CS:APP3e目录ProxyLab写在前面实验环境bugfirefox网络代理配置需要提前理解的知识点参考链接partIpartIIpartIII总结写在前面实验环境bug在目录proxylab-handout中输入./driver.sh,出现bug:bug1:... 查看详情

2018-2019-120189215《深入理解计算机系统》第一章(代码片段)

第一章计算机系统漫游主要内容全面精炼的概括了本书的内容,也就是“计算机系统概述”,包括:1.解释计算机系统中“信息”的概念:就是二进制位;2.解释源程序(以C源程序为例)到可执行程序的过程:预处理→编译→汇... 查看详情

第1章计算机系统漫游(深入理解计算机系统)(代码片段)

1#include<stdio.h>23intmain()45printf("hello,world");61.1信息就是位+上下文hello程序的声明周期是从一个源程序开始的,即程序员利用编辑器创建并保存的文本文件,文件名是hello.c。源程序实际上就是一个由值0和1组成的位(bit)序列,... 查看详情

《深入理解计算机系统》优化程序性能的几个方法(代码片段)

本文几个优化程序性能的方法出自CSAPP第五章,通过不断修改源代码,试图欺骗编译器产生有效的代码我们先引入度量标准每元素的周期数(CPE),表示程序性能。 我们先定义一个数据结构  data_t代表数据类型1typedefst... 查看详情

《深入理解计算机系统》到底怎样学?(代码片段)

原文链接:被CSAPP虐了最近两个周末去图书馆刷CSAPP完全停不下来啊,这种看不懂却还是强忍着痛苦硬逼着自己去看的感觉,真让我着迷。这本书从真正意义上让我体会到了什么叫做看书五分钟,休息俩小时。不过... 查看详情

深入理解计算机系统bomblab实验报告(代码片段)

又快有一个月没写博客了,最近在看《深入理解计算机系统》这本书,目前看完了第三章,看完这章,对程序的机器级表示算是有了一个入门,也对C语言里函数栈帧有了一个初步的理解。为了加深对书本内容的认识,以后每学... 查看详情

《深入理解计算机系统》笔记(代码片段)

本篇主要以《深入理解计算机系统》黑皮书阅读笔记做主要内容,现在是看书的第一遍:导论操作系统的概念本章用于介绍本书的内容大致,其中若有概念不清楚,需要自己去网上搜集资料弄明白。信息和上下文不管什么文件终... 查看详情

深入理解计算机系统csappch7:静动态库制作与神奇的库打桩机制(代码片段)

库打桩是Linux链接器的一个很强大的功能,截获对库函数的调用。跟踪调用次数等等,也可以用来验证输入输出,或者将其替换成一个完全不同的实现。可以想象利用此技术可以做到的非常有趣的事情。目录创建静态库创建动态... 查看详情

深入理解计算机系统

                   图1图1中左侧是proc.c程序。右侧是proc.s汇编程序。 proc.s中,5--15行是proc()的汇编代码                                  图2图2中... 查看详情

深入理解计算机系统(2.6)---二进制整数的乘除法运算(重要)困难度高(代码片段)

  2.5我们着重介绍了二进制整数的加、减运算,本次我们继续介绍乘、除运算。本章是迄今为止最难的一章,希望各位猿友有所收获,也别忘了“点个推荐哦”。 引言   运算一直是程序运行当中一个重要的环... 查看详情

深入理解系统调用(代码片段)

深入理解系统调用一.实验要求找到一个系统调用,系统调用号为学号最后两位相同的系统调用通过汇编指令触发该系统调用通过gdb跟踪该系统调用的内核处理过程重点阅读分析系统调用入口的保存现场,恢复现场,和系统调用返回,... 查看详情