随笔分类 - 深入理解计算机系统
阅读的第一本大黑书,但绝不会是最后一本
摘要:Web客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做HTTP(Hypertext Transfer Protocol,超文本传输协议)。HTTP是一个简单的协议。一个Web客户端(即浏览器)打开一个到服务器的因特网连接,并且请求某些内容。服务器响应所请求的内容,然后关闭连接。浏览器读取
阅读全文
摘要:客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。例如,一个Web服务器管理着一组磁盘文件,它会代表客户端进行检索和执行。一个FTP服务器管理着一
阅读全文
摘要:内核用三个相关的数据结构来表示打开的文件: 描述符表(descriptor table)。每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的。每个打开的描述符表项指向文件表中的一个表项。 文件表(file table)。打开文件的集合是由一张文件表来表示的,所有的进程共享这张表。
阅读全文
摘要:每个Linux文件都有一个类型(type)来表明它在系统中的角色: 普通文件(regular file)包含任意数据。应用程序常常要区分文本文件(text file)和二进制文件(binary file),文本文件是只含有ASCII或Unicode字符的普通文件;二进制文件是所有其他的文件。对内核而
阅读全文
摘要:垃圾收集器(garbage collector)是一种动态内存分配器,它自动释放程序不再需要的已分配块。这些块被称为垃圾(garbage)(因此术语就称之为垃圾收集器)。自动回收堆存储的过程叫做垃圾收集(garbage collection)。在一个支持垃圾收集的系统中,应用显式分配堆块,但是从不显
阅读全文
摘要:动态内存分配器维护着一个进程的虚拟内存区域,称为堆。分配器将堆视作一组大小不同的块的集合来维护。 显式分配器(explicit allocator),要求应用显式地释放任何已分配的块。例如,C标准库提供一种叫做malloc程序包的显式分配器。C程序通过调用malloc函数来分配一个块,并通过调用fr
阅读全文
摘要:Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。虚拟内存区域可以映射到两种类型的对象中的一种: 1) Linux文件系统中的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分,例如一
阅读全文
摘要:n位的虚拟地址包含两个部分:一个p位的虚拟页面偏移,一个n-p位的虚拟页号,将页表条目中的物理页号和虚拟地址空间的地址偏移量串联起来就得到物理地址。 展示了当页面命中时,CPU硬件执行的步骤。 第1步:处理器生成一个虚拟地址,并把它传送给MMU。 第2步:MMU生成PTE地址,并从高速缓存/主存请求
阅读全文
摘要:计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址。 使用虚拟寻址,CPU通过生成一个虚拟地址(Virtual Address,VA)来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译(addre
阅读全文
摘要:一个系统中的进程是与其他进程共享CPU和主存资源的。然而,共享主存会形成一些特殊的挑战。随着对CPU需求的增长,进程以某种合理的平滑方式慢了下来。但是如果太多的进程需要太多的内存,那么它们中的一些就根本无法运行。当一个程序没有空间可用时,那就是它运气不好了。内存还很容易被破坏。如果某个进程不小心写了
阅读全文
摘要:每个进程都有一个唯一的正数进程ID。getpid函数返回调用进程的PID。 创建和终止进程 进程总处于以下三种状态之一: 运行。进程要么在CPU上执行,要么在等待被执行且最终会被内核调度。 停止。进程的执行被挂起(suspended),且不会被调度。当收到SIGSTOP、SIGT-STP、SIGTT
阅读全文
摘要:在现代系统上运行一个程序时,我们会得到一个假象,就好像我们的程序是系统中当前运行的唯一的程序一样。我们的程序好像是独占地使用处理器和内存。处理器就好像是无间断地一条接一条地执行我们程序中的指令。最后,我们程序中的代码和数据好像是系统内存中唯一的对象。这些假象都是通过进程的概念提供给我们的。 进程的经
阅读全文
摘要:异常就是控制流中的突变,用来响应处理器状态中的某些变化。 在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做异常表(excep-tion table)的跳转表,进行一个间接过程调用(异常),到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序(exception handler))
阅读全文
摘要:从给处理器加电开始,直到你断电为止,程序计数器假设一个值的序列 ao,ai,…,an-1 其中,每个a是某个相应的指令I的地址。每次从ak到ak+1的过渡称为控制转(controltransfer)。这样的控制转移序列叫做处理器的控制流(flow of control或control flow)。
阅读全文
摘要:像Linux LD程序这样的静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成,每一节都是一个连续的字节序列。指令在一节中,初始化了的全局
阅读全文
摘要:链接(linking)是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。链接可以执行于编译时(compile time),也就是在源代码被翻译成机器代码时;也可以执行于加载时(load time),也就是在程序被加载器(load-er)加载到内存并执行时;
阅读全文
摘要:考虑这样一个计算机系统,其中每个存储器地址有m位,形成2的m次方个不同地址,这样一个机器的告诉缓存被组织成一个有S=2的s次方个高速缓存组的数组。每个组包含E个高速缓存行,每个行是由B=2的b次方字节的数据块组成的,一个有效位指明这个行是否包含有意义的信息,还有t个标记位,唯一标识存储在这个高速缓存
阅读全文
摘要:存储器层次结构的中心思想是,对于每个k,位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存。换句话说,层次结构中的每一层都缓存来自较低一层的数据对象。例如,本地磁盘作为通过网络从远程磁盘取出的文件(例如Web页面)的缓存,主存作为本地磁盘上数据的缓存,依此类推,直到最小的缓存——
阅读全文
摘要:一个编写良好的计算机程序常常具有良好的局部性(locality)。也就是,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理(principle of locality),是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。 局部
阅读全文
摘要:随机访问存储器 随机访问存储器分为静态的与动态的。 静态SRAM将每个位存储在一个双稳态的存储器单元里,每个单元用一个六晶体管电路来实现。这个电路有这样一个属性,它可以无限期地保持在两个不同的电压配置(configuration)或状态(state)之一。其他任何状态都是不稳定的——从不稳定状态开始
阅读全文