08010211李国龙vm67.docx
《08010211李国龙vm67.docx》由会员分享,可在线阅读,更多相关《08010211李国龙vm67.docx(11页珍藏版)》请在冰豆网上搜索。
08010211李国龙vm67
VM6:
1.Withalinearpagetable,youneedasingleregistertolocatethepagetable,assumingthathardwaredoesthelookupuponaTLBmiss.Howmanyregistersdoyouneedtolocateatwo-levelpagetable?
Athree-leveltable?
答:
无论是多少级的页表,只需一个寄存器。
当为线性页表时,寄存器中VPN的长度比较长,当为二级或多级页表时,总的VPN长度是不变的。
不同的只是为每一级页表分派了PDI,而随着页表级数增加,每一级的PDI的长度在减小。
总的PDI的长度加上PTI的长度与线性页表中VPN的长度是相同的(如下图)。
所以不论页表的级数有多少,始终只需要一个寄存器。
2.Usethesimulatortoperformtranslationsgivenrandomseeds0,1,and2,andcheckyouranswersusingthe-cflag.Howmanymemoryreferencesareneededtoperformeachlookup?
答:
取种子Seed为1时为例:
python paging-multilevel-translate.py -c 1
16进制
pde
pte
value
物理地址
index
valid
pfn
index
valid
pfn
0x611c
0x18
1
0x21
0x08
1
0x35
08
0x06bc
0x3da8
0x0f
1
0x56
0x0d
0
0x7f
fault
fault
0x17f5
0x05
1
0x54
0x1f
1
0x4e
1c
0x09d5
0x7f6c
0x1f
1
0x7f
0x1b
0
0x7f
fault
fault
0x0bad
0x02
1
0x60
0x1d
0
0x7f
fault
fault
0x6d60
0x1b
1
0x42
0x0b
0
0x7f
fault
fault
0x2a5b
0x0a
1
0x55
0x12
0
0x7f
fault
fault
0x4c5e
0x13
1
0x78
0x02
0
0x7f
1b
0x07b2
0x2592
0x09
1
0x1e
0x0c
1
0x3d
fault
fault
0x3e99
0x0f
1
0x56
0x14
1
0x4a
1e
0x0959
3.Givenyourunderstandingofhowcachememoryworks,howdoyouthinkmemoryreferencestothepagetablewillbehaveinthecache?
Willtheyleadtolotsofcachehits(andthusfastaccesses?
)Orlotsofmisses(andthusslowaccesses)?
答:
catch memory 缓存。
用来存储近期或者常用的指令或者数据,在多级页表的内存管理中,catch memory和TLB的作用很相似。
我们知道从内存中去数据比从缓存中取数据话费的时间要多得多,那么如果对于近期HIT命中的或者使用频率高页表,我们很可能在接下来会申请。
把这些页表存放在TLB即缓存(catch memory)中,可以大大减少再次访问内存的次数,从而降低时间。
VM7:
1.Now,wewillruntheprogrammem.cbutwithverylittlememoryusage.Thiscanbeaccomplishedbytyping./mem1(whichusesonly1MBofmemory).HowdotheCPUusagestatisticschangewhenrunningmem?
Dothenumbersintheusertimecolumnmakesense?
Howdoesthischangewhenrunningmorethanoneinstanceofmematonce?
答:
vmstat输出的字段说明:
Procs(进程):
r:
运行队列中进程数量
b:
等待IO的进程数量
Memory(内存):
swpd:
使用虚拟内存大小
free:
可用内存大小
buff:
用作缓冲的内存大小
cache:
用作缓存的内存大小
Swap:
si:
每秒从交换区写到内存的大小
so:
每秒写入交换区的内存大小
IO:
(现在的Linux版本块的大小为1024bytes)
bi:
每秒读取的块数
bo:
每秒写入的块数
系统:
in:
每秒中断数,包括时钟中断。
cs:
每秒上下文切换数。
CPU(以百分比表示):
us:
用户进程执行时间(usertime)
sy:
系统进程执行时间(systemtime)
id:
空闲时间(包括IO等待时间)
wa:
等待IO时间
启动vmstat后输出:
将mem.c编译成可执行文件:
当再启动./mem1后,vmstat输出:
运行mem后与未运行对比发现:
1)Procs(进程)中r:
运行队列中进程数量增加;
Memory(内存)中free:
可用内存大小与之前相比减小大约1M,因为输入的指令./mem1(其仅使用1MB的内存);
2)CPU使用率:
us:
用户进程执行时间明显增大,id:
空闲时间降为0;
其中usertime是有意义的,代表处于用户模式的时间百分比。
3)当打开的mem超过一个后发现CPU使用率:
us:
用户进程执行时间(usertime)与之前只开一个相比有些许下降,从运行结果可看出,开一个时us可以达到97%,开两个后只有94%附近,这是因为系统要进行进程间的切换,相应的用户进程执行时间减少。
2.Let’snowstartlookingatsomeofthememorystatisticswhilerunningmem.We’llfocusontwocolumns:
swpd(theamountofvirtualmemoryused)andfree(theamountofidlememory).Run./mem1024(whichallocates1024MB)andwatchhowthesevalueschange.Thenkilltherunningprogram(bytypingcontrol-c)andwatchagainhowthevalueschange.Whatdoyounoticeaboutthevalues?
Inparticular,howdoesthefreecolumnchangewhentheprogramexits?
Doestheamountoffreememoryincreasebytheexpectedamountwhenmemexits?
答:
下面是运行结果,其中圈出来部分之前是刚开始启动vmstat输出,圈出来部分是再启动一个程序./mem512(分配512MB)后输出,圈出来部分后面是杀死启动的程序之后输出情况,我们通过前后对比内存中swpd(使用的虚拟内存量)和free(空闲内存量)这两列的情况。
a)在没有运行时,swpd大约为0(KB),free大约为259496(KB),在运行mem后,swpd迅速增加最后大约保持在555640(KB),free迅速减少最后保持在71000(KB)左右。
从这变化可见,在运行mem后,虚拟内存的使用明显增加,可用的空闲内存明显减少。
b)在杀死mem程序后,swpd突然减少到212460左右(减少了一半),free突然增加到788296左右(增加了约11倍)。
c)退出后空闲内存的大小比原来没运行时的还增大了。
3.We’llnextlookattheswapcolumns(siandso),whichindicatehowmuchswappingistakingplacetoandfromthedisk.Ofcourse,toactivatethese,you’llneedtorunmemwithlargeamountsofmemory.First,examinehowmuchfreememoryisonyourLinuxsystem(forexample,bytypingcat/proc/meminfo;typemanprocfordetailsonthe/procfilesystemandthetypesofinformationyoucanfindthere).Oneofthefirstentriesin/proc/meminfoisthetotalamountofmemoryinyoursystem.Let’sassumeit’ssomethinglike8GBofmemory;ifso,startbyrunningmem4000(about4GB)andwatchingtheswapin/outcolumns.Dotheyevergivenon-zerovalues?
Then,trywith5000,6000,etc.Whathappenstothesevaluesastheprogramentersthesecondloop(andbeyond),ascomparedtothefirstloop?
Howmuchdata(total)areswappedinandoutduringthesecond,third,andsubsequentloops?
(dothenumbersmakesense?
)
答:
通过查看知道Linux上内存总量大约1G,所以我们依次测试./mem512600700。
其中si:
每秒从交换区写到内存的大小;so:
每秒写入交换区的内存大小。
在内存只是用一半时,只有刚开始的循环si不为0表示有数据从交换区写到内存,后面几乎都为0。
在测试测试./mem600时和测试./mem512几乎一样,只有刚开始的si大于0有数据从交换区写到内存,后面全为0。
在测试测试./mem700时发现si没有小于0的情况,说明数据忙于在交换区写到内存.
4.Dothesameexperimentsasabove,butnowwatchtheotherstatistics(suchasCPUutilization,andblockI/Ostatistics).Howdotheychangewhenmemisrunning?
答:
我们从CPU利用率上来进行相似的分析。
可以看出当运行mem(内存是600时)后us:
用户进程执行时间(usertime)从之前的6%瞬间上升到98%,id:
空闲时间(包括IO等待时间)也瞬间降到0,由此可见此时CPU主要用于用户进程。
但是当运行mem(内存是1024时)由上图可以看出CPUwa:
等待IO时间达到90%以上,此时CPU主要用在了等待I/O。
5.Nowlet’sexamineperformance.Pickaninputformemthatcomfortablyfitsinmemory(say4000iftheamountofmemoryonthesystemis8GB).Howlongdoesloop0take(andsubsequentloops1,2,etc.)?
Nowpickasizecomfortablybeyondthesizeofmemory(say12000againassuming8GBofmemory).Howlongdotheloopstakehere?
Howdothebandwidthnumberscompare?
Howdifferentisperformancewhenconstantlyswappingversusfittingeverythingcomfortablyinmemory?
Canyoumakeagraph,withthesizeofmemoryusedbymemonthex-axis,andthebandwidthofaccessingsaidmemoryonthey-axis?
Finally,howdoestheperformanceofthefirstloopcomparetothatofsubsequentloops,forboththecasewhereeverythingfitsinmemoryandwhereitdoesn’t?
答:
因为在Linux下内存是1G,所以用./mem512来测试适合情况。
使用./mem1024来测试超出内存情况。
a)从上面两次情况我们对比可以发现,当内存为512M时比1024M时的bandwidth快的多。
并且在512M时,第一次循环速度最慢也有738.78MB/S,之后都能达到1200多MB/S,而当内存为1024时,第一次循环速度最快也只有93.07MB/S,之后更小达不到10MB/S。
b)为了绘制图形,我们分别取500,600,700,800,900,1000来测数据,取前三次循环平均值。
分配内存大小(MB)
Bandwidth(MB/s)
500
1156.58
600
1024.08
700
74.36
800
45.98
900
41.38
1000
29.12
c)当分配数组大小适合内存时,第0次循环的bandwidth最慢,之后逐渐提升。
当分配数组大小超出内存时,第0次循环的bandwidth最快,之后都要慢得多。