赞
踩
目录
加法与乘法忽略了xp=yp相等可能导致的结果不同
fn内部可能实现return counter++导致一次性乘法和多次累加结果不同
如把a[i]依次存到a[i+1],存储与写入之间存在关系,写/读相关,导致cpe降低
i=1;i<=n与 i=0;i<n操作一直执行n次
i=89;i>=10操作一共执行89-10+1次
答案:
min:1,max:91,incr90:,square:90
max:1,min91:,incr90:,square:90
min:1,max:1,incr:90,square:90
消除程序循环的低效率:内部有数值不变,每次都要运行的计算移到循环外部
使用...编译的效果:-O2>-O1>
cpe越小说明代码运行情况越好
A:
0123456与
123456
B:0123456与
000000
因为a【i】被赋值给了a[i+1],a【i+1】赋值给a【i+2】,而a[0】=0
C:第二种每次依赖于前一次的迭代结果,在连续的迭代之间有写/读相关,故性能有差异
D:与A的性能相同,因为没有每次依赖于前一次的迭代结果,存储与后续加载不相关
按照行的顺序执行,空间局部性好,时间局部性差;按照列则空间局部性差
循环的每个变量,空间局部性与时间局部性一好一差
步长(i++与i+=2)增加,空间局部性变差
为了弥补CPU和内存之间的性能差异,以便于能够真实变得把CPU的性能提升利用起来,而不是让它在那里空转,我们在现代CPU中引入了高速缓存。( cpu性能>>内存性能)
以下单位最好全部用位(B)表示
KB=2的10次方B,MB=2的20次方B
主存容量(存储器)取log2得m是主存地址长度,块大小是b(如果是按字节编指,就b大小取到字节),cache容量=c=s*b*e,16路组相联得到e=16,全相联映射没有组索引s
注意第一问完全忽视了32位这个条件
组相联高速缓存,从0地址开始的b位是块偏移,接着是s位的组索引,其余t位全是标记位
???????
直接映射高速缓存模拟,即E=1,先组选择,块偏移量b转化为10进制,提取组索引,注意组从0组开始
接着行匹配,检查地址中的标记位t与缓存行中的标记位是否匹配,如果匹配,将进行下一步字选择。如果不匹配,则表示未命中。在未命中时,高速缓存必须从内存中重新取数据块, 在行中覆盖此块。
最后是字选择,当标记位匹配时,表示命中,接着检查地址中的块偏移为2字节,即要从缓存行数据块的第5位开始取值,并返回给CPU。
块大小为2字节,所以从内存中取数据总是以偶数倍开始的,所以会看到M[8-9],而不是M[7-8]。
???????
两路相联高速缓存:1. 组选择2.行匹配:必须每次检查多个行 的标记位和有效位3.字选择
三维数组理解为:数组里面套数组
234:2个大数组,三行四列
按照每行的每个元素顺序,步长是1
按照每列的每个元素顺序,步长不为1,空间性局部性差
组相联高速缓存,从0地址开始的b位是块偏移,接着的s位是组索引,其他全是标记位
0x0E34化为二进制,从后往前填
下面CO/CI/CT就填他们对应位里面的值,不足四位补零
如何查看是否高速缓存命中和返回的高速缓存字节:
把地址填进去,得到ct/ci/co的16进制,根据ci去找第几组(从0组开始)
然后看标记位是否等于ct并且有效位为1,如果同时满足就命中,否则不命中,没有返回值
命中后,根据偏移量(相当于下标,从0开始)去找这一组里对应的值
链接可以执行于编译(编译为机器代码)/加载(加载到内存并执行)/运行时,现代社会由链接器自动执行
目标文件有三种形式:可重定位目标文件+可执行目标文件+共享目标文件
编译器和汇编器生成可重定位目标文件+共享目标文件
链接器生成可执行目标文件 主要完成两个任务:符号解析+重定位
每个系统存放目标文件的格式不同,最初的Unix是a.out格式,Windows是PE格式,现代的X86-64Linux和Unix使用ELF文件,Mac是Mach-O格式
在可重定位目标文件的符号表里,函数和已经初始化的全局变量是强符号,未初始化的全局变量弱符号
局部符号没有强弱符号的概念
静态库函数更新后需对程序重新编译和链接,而共享库函数更新后程序无需重新编译和链接
静态库函数代码包含在可执行目标文件中,而共享库函数代码不包含在可执行目标文件中
静态链接情况下静态库函数在加载时被链接,动态链接情况下共享库函数可 在加载或运行时被链接
staic的全局变量/函数是模块私有;无static的全局变量/函数是共有,可以被其他模块访问
可重定位目标文件中,.data存放已初始化的全局和static c变量,.bss存放未初始化的全局和static c变量,局部c变量在栈中,不在data和bss中,rodata是只读数据,text是已编译程序的机器代码
symtab是一个符号表,存放在程序中定义和引用的函数和全局变量的信息,但是不包含局部变量
初始化了(且非0)的全局变量和static变量在data节里
没有初始化的全局变量在COMMON节里
未初始化的staic和初始化为0的全局/static变量
有函数定义的函数在变成.o文件后,函数类型的符号类型已经编译好
(2条消息) 计算机系统基础 链接器的重定位_jiyong_的博客-CSDN博客
1.重定位PC相对引用
首先判断寻址方式
R_X86_64_PC32是重定位PC相对引用,使用PC对应重定位算法。
读代码,将对应的数据附上值。
反汇编代码中(第7行)
refaddr:引用的运行时地址(需要算)
ADDR(s):符号地址(题目给出)
r.offset:偏移量(重定位入口)
*refptr:更新该引用,运行时指向sum程序(需要算)
ADDR(r.symbol):机器分配的 (题目给出)
r.addend:在反汇编代码里可读出
带入计算公式
假设链接器已经确定:
ADDR(s) = 0x4004d0
ADDR(r.symbol) = ADDR(sum) = 0x4004e8
则有
引用地址:refaddr = ADDR(s) + r.offset = 0x4004d0 + 0xf = 0x4004df
引用的值:*refptr = (unsigned)(ADDR(r.symbol) + r.addend - refaddr)
= (unsigned)(0x4004e8 + (-4) - 0x4004df)
= (unsigned)(0x5)
(unsigned)针对(ADDR(r.symbol) addend符号不变,注意可能为负号
2.重定位绝对引用
算法代码中(第11~13行):
反汇编代码中(第5行)
反汇编行内,第一个是偏移值offset,最后一个是addend,如果函数名,也就是symbol后没有,默认为0
ADDR(r.symbol) = ADDR(array) = 0x601018
则有
*refptr = (unsigned)(ADDR(r.symbol) )+ r.addend
= (unsigned)(0x601018 + 0)
= (unsigned)(0x601018)
异常分为四类:中断、陷阱、故障和终止
中断是异步发生的,陷阱、故障、终止是同时发生的
进程使一个执行中程序的示例,系统中每个程序都运行在某个进程的上下文中
上下文(context)是由程序正确运行所需要的状态组成,包括:内存中的程序的 代码和数据、栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的 集合。
fork函数调用一次返回两次,一次返回到父进程,一次返回到新创建的子进程。
父进程和新创建的子进程之间最大的区别就是有不同的pid
父进程与子进程并进行并且互相独立
发送信号的原因:内核检测到一个系统事件,比如除零错误或子进程终止;一个进程调用了 kill 函数,显式地要求内核发送一个信号给目的进程。
每个信号类型都有一个(共四种)预定义的默认行为,分别是:进程终止;进程终止并转储内存;进程停止(挂起)直到被SIGCONT信号重启 ;进程忽略该信号
signal 函数接受两个参数:信号值和函数指针,可以通过下列哪些方法(ABC) 来改变和信号 signum 相关联的行为。 A.如果 handler 是 SIG_IGN,那么忽略类型为 signum 的信号。 B.如果 handler 是 SIG_DFL,那么类型为 signum 的信号行为恢复为默认行为。 C.如果 hanlder 是用户定义的函数的地址,这个函数就被称为信号处理程序
只要时间有重叠就是并发
编写代码
主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空 间的物理地址。
页表的每个PTE都是由一个有效位和一个地址字段组成的,如果有效位为1,那么 地址字段就表示DRAM中相应的物理页的起始位置
虚拟内存区域可以映射到两种类型的对象中:Linux文件系统中的普通文件和匿名文件,它们在磁盘和内存之间不存在实际的数据传送
内部碎片是有未使用内存但不可以用来满足分配要求时产生的。内部碎片是在一个已分配块比有效载荷小时发生的。
由一条试图对代码段里的只读页面进行写操作的存储指令造成的缺页处理程序会触发一个保护异常,从而终止这个进程
工作集大小超过了物理内存大小,程序会出现“抖动”现象
缓存不命中,需要返回ppn的值
页表有效位为即缺页(page fault)
页表是PTE组成的数组
PTE数量等于虚拟地址数/页大小
偏移量VP/PO的位数都等于页面大小取log2
页号位数VP/PN等于虚拟/物理地址位数-页面大小
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。