计算机系统总结(下·五到九章)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40851744/article/details/102760538

HNU君陌

第五章、优化程序性能
1、优化;
切入点:选择一组合适的算法和数据结构,编写出编译器能够有效优化以转换成高效可执行的源代码,多线程并行处理运算
性能表示:处理器活动的顺序由时钟控制,时钟提供某个频率的规律信号,用时钟周期来表示,度量值是执行了多少条指令,而不是时钟运行的有多快
优化性能从两个方面:
一方面与机器无关,主要是:
消除循环的低效率(将每次循环中执行多次而结果不改变的部分剔除循环);
减少过程调用(减少函数方法的调用,因为调用函数会带来很大开销,不过会破坏程序的模块化);
消除不必要的存储器引用(再循环中不停地对指针所指向的变量进行赋值的时候,可以用一个中间变量代替指针);
循环展开(将一次一步的迭代循环展开为多步,可以减少不直接有注意程序结果的操作的数量,并可以进一步变化代码,减少计算中关键路径上的操作数量);
选择合适的算法和数据结构;
另一方面与机器有关。处理器同时对多条指令求值,称为指令级并行。多条指令可以并行执行,而同时又呈现出一种简单的顺序执行指令的表象。
2、理解现代处理器:
当操作必须按照严格的顺序执行时就会遇到延迟界限,在下一条指令开始前上一条必须结束。
延迟界限:给出了任何必须按照严格顺序完成合并运算的函数所需要的最小CPE值
吞吐量界限:刻画了处理器功能单元的原始计算能力,这个界限是程序性能的终极限制。给出了CPE的最小界限
指令控制单元从指令高速缓存中读取指令,并产生一系列基本操作。指令高速换从是一个特殊的高速缓存存储器,存储最近访问的指令。
执行单元执行指令控制单元从存储器中取出的基本操作
延迟:表明完成运算所需要的总时间,即执行实际运算所需要的时钟周期总数
发射时间:表示两个连续的同类型运算之间需要的最小时钟周期数,发射时间为1的功能单元被称为完全流水线化的
最大吞吐量:表达发射时间的另一种更常见的方法,指明这个功能单元的最大吞吐量,定义为发射时间的导数
除法需要的时间依赖于数据值
超标量技术:在一个时钟周期开始执行多条指令,必然有重复部件
乱序执行技术:动态执行技术
数据流表示:表达了不同操作之间的数据相关是如何限制他们的执行顺序的,这种限制形成了图中的关键路径,这是执行一组机器指令所需的周期数的一个下界。根据数据流图可以将访问到的寄存器分为四类:只读(只用作源值,也可以用来计算存储器地址,但在循环中不会被修改)、只写(作为数据传送操作的目的)、局部(在循环内部被修改和适用,迭代与迭代之间不相关)、循环(即作为源值,又作为目的,一次迭代中的值在下一次迭代中用到。循环寄存器之间的操作链决定了限制性能的数据相关)
amdahl定理:当加快一个系统一部分的速度时,对整体性能的影响依赖于这个部分有多重要和速度提高了多少,即Tn=Te[(1-a)+a/k];加速比S=Te/Tn

第六章、存储器层次结构
1、存储技术;
随机访问存储器RAM:分为静态RAM(SRAM)和动态RAM(DRAM),静态RAM比动态更快,但更贵。
静态RAM:将每个位存储在一个双稳态的存储器单元里,每个单元都用一个六晶体管电路来实现的,他可以无限制地保持在两个不同的电压配置或状态之一。只要有电就会永远保持,即使有干扰也能恢复,用来做高速缓存存储器。
动态RAM:将每个位存储为对电容的充电,对干扰很敏感,当被干扰永远不会恢复,用来作为主存以及图形系统的帧缓冲区。
非易失性存储器ROM:能被重编程的次数和优先,PROM只能被编程一次;EPROM可采写可编程,紫外线清除单元内容,可擦写次数为1000,;EEPROM电子可擦除PROM,可以直接在印制电路卡上编程,可擦写次数为100000;FLASH闪存,基于EEPROM,为固态硬盘SSD,基于闪存
访问主存:
读事务(从主存传送数据到CPU,先CPU将地址放到存储器总线,然后主存从总线读出A,接收字X,然后将X放到总线,CPU从总线读出字X,并将它复制到寄存器中);
写事务(从CPU传送数据到主存,先CPU将地址A放到存储器总线,主存读出这个地址,等待接收数据字,然后CPU将数据字y放到总线,主存从总线读数据字y,并将它存储在地址A);
总线(一组并行的导线,能携带地址、数据的控制信号,分数据总线、控制总线、地址总线)。
磁盘存储:磁盘由盘片构成,每个盘片有两面称为表面,表面覆盖着磁性记录材料,盘片在主轴的作用下以固定的旋转速率旋转,通常是5400~15000每分钟(RPM);每个表面是由一组称为磁道的同心圆组成,每个磁道被划分成一组扇区,每个扇区包含相等数量的数据位,扇区间有间隙分隔,间隙中不存在数据位,间隙存储用来识别扇区的格式化位。
磁盘容量:一个磁盘上可以记录的最大位数称为他的最大容量,容量的决定因素是记录密度(磁道每英寸可以放入的位数)、刺刀密度(从盘片中心出发半径上一英寸的段内可以有的磁道数)、面密度(记录密度与磁道密度的乘积)。10^9=1GB
磁盘操作:通过读写头来读写存储在磁性表面的位,读写头连接到一个传动臂,在磁盘表面上一层薄薄的气垫上飞翔。寻道是通过沿着半径轴前后移动转动臂,使驱动器可以将读写头定位在盘面的任何磁道上
访问时间:
寻道时间(为了读取某个目标扇区的内容,传动臂吧读写头首先定位到包含目标扇区的磁道上的所需时间,约等于最大旋转时间,依赖于读写头以前的位置和传动臂在盘面上移动的速度);
旋转时间(驱动器等待目标扇区的第一个位旋转到读写头下,依赖于当读写头到达目标扇区时盘面的位置和磁盘旋转速度);
传送时间(当目标扇区的第一个位位于读写头下时,驱动器读写,依赖于旋转速度和每条磁道的扇区数目)。
最大旋转时间:1/最大旋转速率
平均旋转时间:(1/2)最大旋转时间
平均传送时间:最大旋转时间
(1/每条磁道的平均扇区数)
逻辑磁盘块:内存是字节数组,磁盘是块数组。一个B扇区大小的逻辑块序列为0…B-1。硬盘控制器维护逻辑块号和实际扇区之间的映射关系。
控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个(盘面、磁道、扇区)的三元组,唯一的表示了对应的物理扇区。
2、局部性:
局部性原理:空间局部性和时间局部性两种形式。局部性原理允许计算机设计者通过引入高速缓存存储器来保存最近被引用的指令和数据行,从而提高对主存的访问速度。局部性原理允许系统使用主存作为虚拟地址空间最近被引用块的高速缓存,用主存来缓存磁盘文件系统中最近被使用的磁盘块
步长为k的引用模式:一个连续变量中,每隔k个元素进行访问。步长为1的引用模式就是顺序访问一个向量的每个元素,也叫顺序引用模式,是空间局部性的常见来源。c语言中数组是按照行顺序存放的,所以行优先顺序执行的代码的局部性要好于列优先顺序。
重复引用一个变量有良好的时间局部性,步长越小空间局部性越好,循环有好的时间和空间局部性,循环体越小,循环迭代次数越多,局部性越好。
3、存储器层次结构:
中心思想是对于每个k,位于k层的更快更小的存储设备作为k+1层的更大更慢的存储设备的缓存。
数据总是以块大小为传送单元在第k层和第k+1层之间来回拷贝,任一对相邻的层次之间块大小是固定的,其他层次对之间可以有不同的块大小
缓存命中:当程序需要第k+1层某个数据对象d时,首先在当前存储在k的一个块中查找d,如果d刚好缓存在,则命中
缓存不命中:第k层中没有缓存对象d,这时第k层从第k+1层取出包含d的那个块,如果第k层缓存已满,就可能会覆盖现存的一个块(驱逐),被驱逐的块叫牺牲块。种类有:
强制不命中/冷不命中:第k层的缓存是空的,任何数据对象的访问都不会命中
冲突不命中:由于一个防止策略,导致缓存没有满,但是那个对应的块满了
容量不命中:当工作集的大小超过缓存的大小
替换策略:决定替换哪个块,随机替换策略就是随机选择一个牺牲块,最近最少被使用替换策略:选择最后被访问的时间局现在最远的块
4、高速缓存存储器:
高速缓存是一个高速缓存组的数组,高速缓存的结构将m个地址划分成了t个标记位,s个组索引位和b个块偏移位,结构可以用元组(A,E,B,m)描述。高速缓存的结构将m个地址位划分成了t个标记位,s个组索引位和b个块偏移位
m:每个存储器地址有m位,形成M=2^m个不同的地址
S:这个数组中有S=2^S个高速缓存组
E:每个组包含E个高速缓存行
B:每个行由一个B=2^b字节的数据块组成
标记位:t=m-b-s,唯一的标志存储在这个高速缓存行中的块
有效位:每个行有一个有效位,指明这个行时候包含有意义的信息
高速缓存的大小:C=SEB,指所有块的大小的和
直接映射高速缓存:根据E(每个组的高速缓存行数)划分高速缓存为不同的类,E=1的称为直接映射高速缓存。确定一个请求是否命中然后取出请求字有三步:
组选择(高速缓存从w的地址中间抽出s个组索引位,即一个对应于一个组号的无符号整数);
行匹配(有两个充分必要条件是该行设置了有效位,且高速缓存行中的标记和w地址中的标记相匹配);
字抽取(确定字在块中哪里开始)。缓存不命中时,用新取出的行代替当前行。
标记位和索引位连起来唯一的标识了存储器中的每个块,因为有8个存储块,4个高速缓存组,多个块映射到同一个高速缓存组(有相同的组索引),映射到同一个高速缓存的块由标记位标识
cpu执行读时,先用索引位,确定针对的是哪个组,然后看对应的组是否有效,如果无效则缓存不命中,高速缓存从第一层取出要找的块,存储在对应的组中,再把有效位置1,返回需要的值;如果有效,再根据标记找是否有匹配的标记,如果有则花奴才能命中,返回需要的值,如果没有则替换行,返回值
抖动:高速缓存反复的加载和驱逐相同的高速缓存块
不命中率:不命中数量/引用数量
命中率=1-不命中率
命中时间:从高速缓存传送一个字到CPU所需的时间
不命中处罚:因为不命中所需要的额外时间
影响因素:较大的高速缓存可以提高命中率;较大的块能利用程序中可能存在的空间局部性,提高命中率;相联度较大(E值较大)降低了高速缓存由于冲突不命中出现抖动的可能性
吞吐量:一个程序从存储系统中读取数据的速度,也叫读带宽
读带宽的时间和空间局部性的二维函数称为存储器山

第七章、链接
1、编译器驱动程序:
链接:将各种代码和数据部分收集起来并组合称为一个单一文件的过程,这个文件可被加载(或拷贝)到存储并执行
静态链接:静态链接器ld,以一组可以重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输入的重定位文件由各种不同的代码和数据节组成。指令在一个节中,初始化的全局变量在另一个节中,初始化的变量在一个节中。链接器主要进行符号解析(目标文件定义和引用的符号进行联系)和重定位(编译器和汇编器生成从地址0开始的代码和数据节,链接器通过把每个符号定义于一个存储器位置联系起来,然后修改所有对这些符号的引用,使他们指向这个存储器位置)。
目标文件:有可重定位目标文件(包含二进制代码和数据,可在编译时与其他可重定位目标文件合并起来,创建可执行目标文件),可执行目标文件(包含二进制代码和数据,可直接被拷贝到存储器并执行),共享目标文件(一种特殊类型的可重定位目标文件,可以在加载或者运行被动态地加载到存储器并连接)
编译器和汇编器生成可重定位目标文件(包括共享目标文件),链接器生成可执行目标文件。一个目标模块就是一个字节序列,目标文件就是存放在磁盘文件中的目标模块。
可重定位目标文件的格式为:
.text:已编译程序的机器代码
.rodata:只读数据
.data:已初始化的全局变量
.bss:未初始化的全局变量
.symtab:一个符号表,存放在程序中定义和应用的函数和全局变量信息
.rel.text:当目标文件和其他文件结合需要修改这些位置
.rel.data:被模块应用或定义的任何全局变量的重定位信息
.debug:一个调试符号表
.line:原始c源程序中行号和.text节中机器指令之间的映射
符号表:包含所定义和应用的符号的信息。有字符串表中的字节偏移,符号的地址,目标大小。
符号:分由目标模块定义能被其他模块引用的全局符号、由其他模块定义并被目标模块引用的全局符号、只被目标模块定义和引用的本地符号
强符号:函数和已经初始化的全局变量
弱符号:未初始化的全局变量
不允许有过个强符号;如果有一个强符号和多个弱符号,则选择强符号;如果有多个弱符号,那么从中任选一个
2、重定位:
重定位条目:无论何时汇编器遇到对最终位置的目标引用,均生成一个重定位条目,告诉连接器在将目标文件合并成可执行文件时如何修改这个应用。代码的重定位条目放在.rel.text中,已初始化的数据的重定位条目放在.rel.data中
加载可执行目标文件:加载器将可执行目标文件中的执行代码和数据从磁盘拷贝到存储器,并跳转到程序的第一条指令或入口点来运行该程序。代码段总从0x08048000处开始。加载器跳转到程序的入口点,即付哈_start的地址,在_start地址处的启动代码是在目标文件ctrl.o中定义的

第八章、异常控制流
1、概述:
控制转移:从一条指令到下一条指令的过程
控制流:控制转移序列,最简单的控制流是平滑的序列,每条指令在存储器中都是相邻的,由于跳转、调用和返回指令造成两条指令不相邻
异常控制流:通过使控制流发生突变来对系统状态做出反应,突变为异常控制流
异常控制流是操作系统来实现I/O、进程和虚拟内存的基本机制
2、异常:
异常是异常控制流的一种形式,是控制流中的突变,用来相应处理器状态中的某些变化。异常处理程序完成后处理程序将控制返回给时间发生时正在执行的当前指令,返回给没有发生异常将会执行的下一条指令,将终止被中断的进程
异常表:当处理器检测到时,通过跳转表进行一个间接过程调用(异常),到异常处理程序。系统启动时操作系统分配和初始化一张异常表。
异常号:对某种类型的异常分配了一个唯一的非负整数的异常号,是异常表汇总的索引,异常表的起始地址放在一个称为异常表基址寄存器的特殊CPU寄存器里
异常实际上相当于过程调用,但是异常的返回地址确定,为当前指令地址或者下一条指令地址,处理器也会把一些额外的处理器状态压入栈中,如果控制一个用户程序到内核,那么所有项目都会被压入到核中,并且异常处理程序运行在内核模式下,对所有系统资源都有完全的访问权限
异常有:中断(中断处理程序将控制返回给应用程序流中的下一条指令,异步发生)、陷阱(将控制返回给应用程序流中的下一条指令,同步发生,是一种有意的异常,最主要是为了提供系统调用)、故障(要么重新执行引起故障的指令,要么终止)、终止(传递给内核一个abort历程,该历程将会终止这个应用程序)
3、进程:
进程:一个执行中的程序的实例。系统中每个程序都是运行在某个进程上下文中,上下文有程序正确运行所需要的状态组成,状态包括存放在存储器中的程序代码和数据、栈、通用目的寄存器内容、程序计数器、环境变量和打开文件描述符的集合
进程给应用程序提供两个抽象:一个独立的逻辑控制流,程序单独占有处理器;一个私有的地址空间,程序单独占有存储器系统
逻辑控制流:程序计数器PC值的序列
进程轮流使用处理器,每个进程执行一部分,然后被抢占,轮到其他进程
并发流:一个逻辑流的执行在时间上和另一个流重叠,这两个并发的进行
上下文:内核重新启动一个被抢占的进程所需的状态。切换机制是先保存当前进程的上下文,然后恢复某个先前被强占的进程被保存的上下文,将控制传递给这个新恢复的进程。切换原因是内核代表用户执行系统调用或者中断
4、系统调用错误处理:
错误处理:包装函数被封装在一个源文件中,这个文件被编译链接到每个文件中
任何有用的结果都返回在通过引用传递进来的函数参数中,成功则返回void,错误则打印一条信息然后退出
5、进程控制:
每个进程都有一个唯一的正数进程ID(PID)
进程有三种状态:运行、停止(被挂起且不会被调度)、终止(永远停止,从主程序返回并调用exit函数)
创建进程:父进程通过fork函数来创建一个新的运行子进程,fork只被调用一次,但会返回两次:父进程返回子进程的PID,子进程返回0,如果失败返回-1。相同但是独立的地址空间,用fork函数n次,产生2^n个进程。
终止进程:调用exit函数,以status退出状态来中止进程
并发执行,内核能够以任何方式交替执行他们的逻辑控制流中的指令。
每个进程有相同的用户栈、本地变量值、堆、全局变量值和代码,但父进程和子进程有自己的私有地址空间。
子进程继承了父进程所有的打开文件
回收子进程:进程终止后要被父进程回收,否则处于僵死状态。如果父进程没来得及回收,内核会安排init进程来回收,init进程的PID为1。
一个进程可以通过waitpid函数来等待子进程终止或停止。函数如果成功返回子进程PID,如果wnohang返回0,其他错误原因返回-1
当pid>0时等待集合是一个单独子进程,进程ID等于pid;当pid=-1时等待集合是由父进程所有的子进程组成
wait函数是waitpid函数的简化版,wait(&status)等价于waitpid(-1,&status,0),成功返回子进程pid,出错返回-1
sleep函数使一个进程挂起一段指定的时间,返回值是剩下的秒数,时间结束返回0
pause函数让调用函数休眠,直到该进程收到一个信号
加载并运行程序:参数列表argv、环境变量envp
6、信号:
信号是一种更高层次的软件形式的异常,它允许进程中断其他进程,一个信号就是一条小信息,他通知进程系统中发生了一个某种类型的事件。
接收到信号会触发控制转移到信号处理程序,在信号处理程序完成处理之后,他将控制返回给被中断的程序。
发送信号:内核通过更新目的进程的上下文中的某个状态发送一个信号给目的进程。要么内核检测到了一个系统事件,要么一个进程调用了kill函数,显式地要求发送一个信号给目的进程,一个进程可以发送信号给它自己。每个进程都只属于一个进程组,进程组是由一个进程组ID来标识。一个子进程和它的父进程同属于一个进程组。
返回调用进程的进程组ID:getpgrp函数
改变自己或者其他进程的进程组:setpgid函数
接收信号:当目的进程被内核强迫以某种方式的发送做出反应,目的进程就接收到了信号。进程可以忽略这个信号,终止或通过执行一个称为信号处理程序的用户层函数
进程可以通过signal函数来修改和信号相关的默认行为,唯一的例外是sigstop和sigkill,他们的默认行为不能被修改
待处理信号:一个只发出而没有被接收的信号叫做待处理信号。在任何时刻一种类型至多只有一个待处理信号,一个进程可以有选择性地阻塞接收某种信号。当一种信号被阻塞时,他仍可以被发送,但产生的待处理信号不会被接收,直到进程取消对这种信号的阻塞。一个待处理信号最多只能被接收一次
信号处理问题:一个程序要捕获多个信号,不能用信号来对其他进程中发生的事件计数
7、非本地跳转:
它将控制直接从一个函数转移到另一个当前正在执行的函数,而不需要经过正常的调用
setjmp函数在env缓冲区中保存调用环境,以供longjmp使用,返回0
调用环境:程序计数器、栈指针、通用目的寄存器

第九章、虚拟存储器
1、概述:
虚拟存储器将主存看成一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,他为每个进程提供了一致的地址空间,保护了每个进程的地址空间不被其他进程破坏
2、地址:
物理寻址:主存被组织成一个由M个连续的字节大小的单元组成的数组,依次类推的寻址方式为物理寻址
虚拟寻址:CPU生成一个虚拟地址来访问组成,在被传送到存储器之前先转换成适当的物理地址。地址翻译通过CPU芯片上的存储器管理单元完成。
地址空间:一个非负整数地址的有序集合,地址空间中的整数是连续的
虚拟地址空间:CPU从一个有N=2^n个地址的地址空间中生成虚拟地址
物理地址空间:与系统中物理存储器的M个字节相对应
3、虚拟存储器:
任意时刻,虚拟页面的集合被分为三个不相交的子集:未分配的(系统中还没分配的页,不占据任何磁盘空间)、缓存的(当前缓存在物理存储器中的已分配页)、未缓存的(没有缓存在物理存储器中的已分配页)
DRAM缓存的组织结构:不命中处罚很大,是全相连的——任何虚拟页可以放在任何物理页中,替换算法精密,总是使用写回而不是直写
页表:一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,即一个页表条目的数组,页表的组成(有效位+n位地址字段)
缺页:DRAM缓存不命中。缺页异常会调用内核中的缺页异常处理程序,选择一个牺牲页。交换=页面调度:硬盘和存储器之间传送页的活动
页:虚拟存储器的习惯说法,就是块
虚拟存储器中的局部性:局部性原则保证了在任意时刻,程序往往在一个较小的活动页面集合上工作,这个集合为工作集
颠簸:工作集大小超过了物理存储器大小
操作系统为每个进程提供了独立的页表,也就是一个独立的虚拟地址空间。
存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法
4、存储器:
通过将一个虚拟存储器区域与一个硬盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程
共享对象:对于所有把它映射到自己的虚拟存储器进程来说都是可见的,即便映射到多个共享区域,物理存储器都只需要存放一个拷贝
私有对象:写时拷贝,在物理存储器中只保存私有对象的一份拷贝,fork函数就是应用了写时拷贝

猜你喜欢

转载自blog.csdn.net/qq_40851744/article/details/102760538
今日推荐