计算机系统
Gaodes
成功来自点滴的坚持
展开
-
SEQ的时序
SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器,随机访问存储器。组合逻辑不需要任何时序或控制--只要输入变化,值就通过逻辑门网络传播。正如提到过的那样,我们也将读随机访问器看成和组合逻辑一样的操作,根据地质输入产生输出字。...原创 2021-06-14 17:15:30 · 366 阅读 · 0 评论 -
SEQ硬件架构
实现所有Y86-64指令所需要的计算可以被组织成6个基本阶段:取诣,译码,执行,访存,写回和更新PC。硬件单元与各个阶段相关联:取诣:将程序计数器寄存器作为地址,指令内存读取指令的字节。PC...原创 2021-06-14 17:10:20 · 207 阅读 · 0 评论 -
处理器内部结构
存储器和时钟组合电路从本质上来讲,不存储任何信息。相反,他们只是简单地响应输入信号,产生等于输入的某个函数的输出。为了产生时序电路,也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位...原创 2021-06-14 17:01:49 · 127 阅读 · 0 评论 -
处理器体系结构
Y86-64 指令集体系结构定义一个指令集体系结构(例如Y86-64)包括定义各种状态单元,指令集和它们的编码,一组编程代码和异常事件处理。原创 2021-06-14 16:55:43 · 105 阅读 · 0 评论 -
标准I/O
C语言定义了一组高级输入输出函数,称为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。这个库提供了打开和关闭文件的函数(fopen和fclose),读和写字节的函数(fread和fwrite),读和写字符串的函数(fgets和fputs),以及复杂的格式化的I/O函数(scanf和printf)。标准I/O库将一个打开的文件模型化为一个流。对于程序员而言,一个流就是指向FILE类型的结构的指针。每个ANSI C程序开始时都有三个打开的流stdin,stdout和stderr,分别对应标准输原创 2021-04-11 15:36:14 · 217 阅读 · 1 评论 -
系统级I/O
输入/输出(I/O)是在主存和外部设备(例如磁盘驱动器,终端和网络)之间复制数据的过程。输入操作是从I/O设备复制数据到主存,而输出操作是从主存复制数据到I/O数据。所有语言的运行时系统都提供执行I/O的较高级别的工具。例如,ANSI C提供标准I/O标准,包含printf和scanf这样执行带缓冲区的I/O函数。C++语言用它的重载操作符<<和>>提供了类似的功能。在linux系统中,是通过使用由内核踢狗的系统及Unix I/O函数来实现这些较高级的I/O函数。所有I/O设原创 2021-04-11 15:24:03 · 117 阅读 · 0 评论 -
fork函数与execve函数
fork函数可以创建一个带有自己独立虚拟地址空间的新进程。当fork函数被当前进程调用的时候,内核为新进程创建各种数据结构,并且分配它一个唯一的PID。为了给这个新进程创建虚拟内存。它创建了当前进程的mm_struct,区域结构和页表的原样副本。它将两个进程的每个页面都标记成只读,并且将两个进程中的每个区域接哦古都标记成私有的写时复制。当fork在新进程返回的时候,新进程现在的虚拟内存刚好和调用的fork时存在的虚拟内存相同。当这两个进程中的任意一个后来进行写操作,写时复制机制就会创建新的页面,因此原创 2021-03-13 15:58:52 · 843 阅读 · 0 评论 -
Linux虚拟内存系统
一个虚拟内存系统要求硬件和内核软件之间的紧密协作。版本与版本之间的细节都不尽相同。Linux为每个进程维护了一个单独的虚拟地址空间,包括它那些熟悉的代码,数据,堆,共享库以及栈段。内核虚拟内存包含内核中的代码和数据结构。Linux通过虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射。虚拟内存可以映射到两种类型的对象中1)Linux文件系统中的普通文件:一个区域可以映射到另外一个普通磁盘文件的连续部分。2)匿名文件:一个区域也可以映射到一个匿原创 2021-03-13 15:51:22 · 172 阅读 · 0 评论 -
处理目标文件的工具汇总
在linux系统中有大量可以使用的工具可以帮助和处理目标文件。特别是GNU binutils包尤其有帮助,而且可以运行在每个linux平台上。AR:创建静态库,插入,删除,列出和提取成员STRINGS:列出一个目标文件中所有可以打印的字符串STRIP:从目标文件中删除符号表信息NM:列出一个目标文件的符号表中定义的符号SIZE:列出目标文件的符号表中定义的大小LDD:列出一个可执行文件在运行所需要的动态库...原创 2021-02-21 18:36:39 · 170 阅读 · 0 评论 -
动态链接库
静态库解决了大量相关函数对应用程序可用的问题,然而静态库仍然有一些明显的缺点。静态库和所有的软件一样,需要定期维护和更新。如果应用程序员想要一个库的最新版本,他们必须使用某种形式的更新情况。共享库是致力于解决静态库缺陷的一个现代创新产物。共享库是一个目标模块,在运行或者加载的时候,可以加载到任意的内存地址,并且和一个在内存中的程序连接起来。这个过程称为动态链接,是由一个动态连接器的程序来执行。共享库也称为共享目标,在linux系统中通常是用.so后缀来并表示。微软的操作系统大量使用共享库,它们成为D原创 2021-02-21 18:33:21 · 143 阅读 · 2 评论 -
了解静态链接
静态连接器以一组可重定位目标文件和命令行的参数作为输入,生成一个完全链接的,可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节组成,每一节都是一个连续的字节序列。指令在一节中,初始化了得全局变量在另一节中,而未初始化的变量在另外一节中。为了构造可执行文件,连接器必须完成两个主要任务:符号解析。目标文件定义和引用符号,每个符号对应于一个函数,一个全局变量或者一个静态变量,符号解析的目的是将每个符号引用正好和一个符号定义关联起来。重定位。编译器和汇编器生成从地址0原创 2021-02-21 17:34:32 · 472 阅读 · 0 评论 -
了解链接是什么?
链接是将各种代码和数据片段收集并且组合成为一个单一文件的过程,这个文件可以被加载到内存并且执行。链接可以执行于编译时,也就是在程序被加载器加载到内存并且执行;甚至在执行于运行的时候,也就是由应用程序来执行。在早期的计算机系统中,链接是手动执行的。在现代系统中,链接是由叫做连接器的程序自动执行。连接器在软件开发中扮演着一个关键的角色,因为他们让分离编译成为了可能。我们不需要用一个大型的应用程序组成一个巨大的源文件,而是把他分解或者分离成更小,更好管理的模块。可以独立地修改和编译这些模块。链接器可以帮助原创 2021-02-21 17:17:11 · 1715 阅读 · 0 评论 -
链接技术
链接是将各种代码和数据片段收集并且组合成一个单一文件的过程,这个文件可以被加载或者复制到内存并且执行。链接可以执行与编译的时候,也就是在源代码被翻译成为机器代码时。也可以执行于运行时,也就是由应用程序来执行。在早期的计算机中,链接是手动执行的。在现代系统中,链接是由一个叫连接器的程序自动执行。连接器在软件开发中扮演了一个关键的角色,因为它们使得分离编译成为可能。我们不用将一个大型的应用车那个徐组织为一个巨大的源文件,而是可以把它分解成为更小,更好管理的模块,可以独立修改和编译这些模块。当原创 2021-01-24 17:54:40 · 875 阅读 · 0 评论 -
高速缓存技术
在CPU和主存之间,插入一个小的SRAM的高速缓存器,也称为L1高速缓存。直接映射高速缓存,根据每个组的高速缓存行数,高速缓存被分成不同的类。每个组只有一行的高速缓存称为直接映射缓存。组相联高速缓存,直接映射高速缓存中冲突不命中的造成的问题源于每个组只有一行,组相联放松了这条限制。存储系统被组织成一个存储设备的层次结构,较小,较快的设备靠近顶部,较大,较慢的设备靠近底部。由于采用了这种层次结构,程序访问存储位置的实际速率不是iyige数字能描述的。相反,它是一个变化很大的程序局部性的函数。..原创 2021-01-24 17:49:33 · 616 阅读 · 0 评论 -
存储器层次结构
存储技术:不同的存储技术访问时间差异非常大,速度较快的技术每字节的成本要比速度较慢的技术要高,而且容量小。CPU和主存之间的速度差距也在增大。寄存器-》高速缓存-》主存-》本地二级存储-》远程耳机存储存储器层次结构中的缓存,一般而言高速缓存是一个小而快速的存储设备,它作为存储在更大,也更慢的设备中的数据对象缓冲区域。使用高速缓存的过程称为缓存。存储器层次机构的中心思想是,对于每个k,位于k层的更快更小的存储设备作为位于k+1层更大更慢的存储设备的缓存。概括来说,基于缓存的存储器层次结构行之有原创 2021-01-24 17:42:39 · 167 阅读 · 0 评论 -
磁盘存储技术
磁盘是广为应用的保存大量数据的存储设备,存储数据的数量级可以达到几百到几千兆字节,而基于RAM的存储器只有几百或者几千兆字节。不过,从磁盘读信息的时间为毫秒级,比从DRAM读慢了10万倍,比从SRAM读慢100万倍。磁盘是由盘片构成的,每个盘片有两面或者称为表面,表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴,它使得盘片以固定的旋转速率旋转,通常是5400~15000转每分钟。磁盘通常包含一个或者多个这样的盘片,并且封装在一个密封的容器里面。磁盘容量,一个磁盘上可以记录的最大位数成为它的最大容原创 2021-01-24 17:32:51 · 641 阅读 · 0 评论 -
各类存储器介绍
随机访问存储器静态ram比动态ram速度更快,但是价格也比较贵。SRAM用来作为高速缓存存储器,既可以在CPU芯片,也可以在片下。DRAM用来作为主存以及图形系统的帧缓存冲区。1.静态RAM:SRAM将每个位存储在一个双稳态的存储器单元。每一个单元室用一个六晶体管电路来实现。这个电路由这样的一个属性,它可以无限期保持两个不同电压配置和状态之一。2.动态RAM:DRAM将每个位存储在一个电容的充电。与SRAM不同的是,DRAM存储器单元对干扰非常敏感。...原创 2020-12-13 17:19:52 · 272 阅读 · 0 评论 -
存储器层次结构
在简单模型中,存储器系统是一个线性的字节数组,而CPU能够在一个常数时间内访问每个存储器的位置。虽然到现在为止没有任何一个有效的模型,可以模仿它的工作方式。实际上,存储器系统是一个具有不同容量,成本和访问时间的存储设备的层次结构。CPU寄存器保存最常用的数据。靠近CPU的小的,快速的告诉缓存存储器作为一部分存储在相对慢速的主存储器中的数据和指令的缓冲区域。主缓存存储在容量较大的,慢速磁盘上的数据,而这些磁盘常常又被作为存储在通过网络连接的其他机器的磁盘或者磁带上的数据的缓存区域。基本存储技术-S原创 2020-12-13 17:11:59 · 202 阅读 · 0 评论 -
内存性能
到目前为止,我们写的所有代码,以及运行的所有测试,只是访问相对比较少量的内存。例如,我们都是在长度小于1000个元素的向量上测试这些合并函数,数据量不会超过8000个字符。所有的现代处理器都包含一个或者多个高速缓存存储器 ,以及少量存储器提供快速的访问。存储的性能,大部分内存引用都是加载操作的函数,也就是从内存位置读到寄存器。与之对应的存储操作,将一个寄存器写进内存。这个操作的性能,尤其与加载操作的相互关系,包含一些很细微的问题。...原创 2020-12-13 16:58:08 · 246 阅读 · 0 评论 -
优化程序性能
编写高效程序需要做到以下几点:1.必须选择一组适当的算法和数据结构 2.必须编写出编译器能够有效优化用来转换成高效可执行的源代码。大多数编译器,包括gcc,一直在更新和改进,特别是在优化能力方面。一个有用的策略是只重写程序到编译器,由此可以产生有效代码所需要的程序。在各种编译器中,就优化能力来说,GCC被认为是胜任的,但是不是特别突出。他完成了基本的优化。减少一些不必要的过程调用,可以提高程序的优化性。到目前为止,我们运用的优化都不依赖目标机器的任何特性。这些优化只是简单地降低过程调用的开销原创 2020-12-13 16:52:42 · 100 阅读 · 0 评论 -
SEQ硬件结构
实现所有的Y86-64指令需要的计算可以被组织成6个基本阶段:取指,译码,执行,访存,写回和更新pc取指:将程序计数器寄存器作为地址,指令内存读取指令的字节,PC增加器计算valp,则增加了程序计数器。译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器值。执行:执行阶段会根据指令的类型,将算数逻辑用于不同的目的。访存:在执行访存操作时候,数据内存读出或者写入一个内存字。PC更新:程序计数器的新值选择来自valp...原创 2020-11-15 15:50:53 · 361 阅读 · 0 评论 -
数据强制对齐
对于大多数x86-64指令来说,保持数据对齐能够提高效率。但是它不会影响程序的行为。另一方面,如果数据没有对齐,某些型号的Intel和AMD处理器对于有些实现多媒体操作的SSE指令,就无法正确执行。这些指令对16字节数据块进行操作,在SSE单元和内存之间传送数据的指令要求内存地址必须是16的倍数。任何针对x86-64处理器的编译器和运行时系统都必须保证分配用来保存可能会被SSE寄存器读或者写的数据结构的内存。任何内存分配函数alloca,malloc,calloc,realloc生成的块的初原创 2020-11-15 15:40:05 · 375 阅读 · 0 评论 -
栈上的局部存储
目前为止,我们看到的大多数过程示例都不需要寄存器大小的本地存储区域,不过有时候,局部数据都必须存放到内存中去,常见的情况包括寄存器不足够放所有的本地数据。对某一个局部变量使用地址运算符,因此必须能够让它产生一个地址。某些局部变量是数组或者结构,因此必须能够通过数组或结构引用被访问到。寄存器的局部存储空间是唯一被所有过程共享的资源 。...原创 2020-11-15 15:30:41 · 232 阅读 · 0 评论 -
大端存储和小端存储
跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列。某些机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象,而另外一些机器按照从最高有效字节到最低有效字节的顺序存储。第一种规则,从最低有效字节在最前面的方式称为小端法。第二种规则,从最高有效字节放在最前面的方式称为大端法。常见的android和IOS系统都是采用小端模式。...原创 2020-11-15 15:06:48 · 682 阅读 · 0 评论 -
虚拟内存
虚拟内存一个虚拟概念,它为每个进程提供一个假象,就是每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。虚拟地址空间在Linux中,地址空间最上面的区域是留给操作系统的代码和数据。这对所有进程来说都是一样的。地址空间的底部区域存放用户进程定义的代码和数据。每个进程看到的虚拟地址都由大量准确定义的区构成的,每个区都有专门的功能。程序代码和数据区:对所有进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。代码和数据区直接按照可执行目标文件的内容初始化。堆原创 2020-09-13 17:24:11 · 213 阅读 · 0 评论 -
进程与线程
操作系统通常会给我们一种假象,就好像系统上只有这个程序在运行。程序看上去是独占地使用处理器,主存和I/O设备。处理器看上起像是不间断地一条接着一条地执行程序中的指令,即便该程序的代码和数据是系统内存的唯一的对象。这些假象都是通过进程来体现的,进程是计算机科学中最重要和最成功的概念之一。进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令时交错执行的。在大多数系统中,需要运行的进程数是多于可以运原创 2020-09-13 16:54:09 · 161 阅读 · 0 评论 -
存储设备形成的层次结构
在处理器和一个较大较慢的设备(比如一个主存)之间插入一个更快更小的存储设备(例如高速缓存)的做法已经成为一个常见的做法。实际上,每个计算机系统的存储设备都组织成一个存储器的层次结构。在这个层次结构里面,从上到下,设备的访问速度越来越慢,容量越来越大,并且每个字节的造价也越来越便宜。寄存器文件在层次结构中位于最顶部,也就是0级。存储器层次结构的主要思想是上一层的存储器作为第一层存储器的高速缓存。因此在这个分布式无内件系统的网络系统中,本地磁盘就是存储在其他系统中磁盘上的数据的高速缓存。如同运用不同的高原创 2020-09-13 16:32:45 · 382 阅读 · 0 评论 -
高速缓存(cache)
根据机械原理,较大的存储设备要比比较小的存储设备运行比较慢,而快速设备的造价远比一些同类的低速设备高。在一个典型的系统上的磁盘驱动器可能比主存大1000多倍。但是对处理器而言,从磁盘驱动器上读取一个字的时间开销要比从主存读取的开销大1000万倍。一个典型的寄存器文件只存储几百个字节的信息,而主存里面可以存放几十亿字节。然而,处理器从寄存器文件中读取数据比从主存中读取几乎要快100倍。更麻烦的是,随着这些年半导体技术的进步,这种处理器和主存之间的差距还在持续增大。加快了处理器的处理速度比加快主存的速度要容原创 2020-09-13 16:17:58 · 1524 阅读 · 0 评论 -
系统的硬件组成
典型的系统硬件组成1.总线:贯穿系统的是一组电子管道,称为总线,它是携带信息字节并且负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数是一个基本的系统参数,各个系统中都不尽相同。现在大多数机器字长要嘛是4个字节(32位),要嘛是8个字节(64位)。2.I/O(输入/输出)设备是系统与外部世界的联系通道。主要是作为用户输入的键盘和鼠标,作用用户输出的显示器,长期存储数据和程序的磁盘。3.主存:主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序。4.处理器原创 2020-08-02 17:17:41 · 552 阅读 · 0 评论