# 台大 108 硬體 ###### tags: `NTU` `108` `硬體` 1. (a) FALSE (b) FALSE 2. (a) 5 (b) 4 \(c\) 5 3. (a) 給 assembler 看,但實際上不存在於指令集當中的指令。這可以簡化編寫組合語言的工作。 (b) 這類的定址方式也同樣可以簡化編寫組合語言的工作。具體的應用場景有:存取陣列、將資料放進堆疊中/從堆疊中取出。 \(c\) ~~我想這是因為他們很懶~~從堆疊中取出資料、以及存取陣列等等,大部份的情況下只會用到 post-increment。這應該是為了簡化指令集設計~~雖然 x86 本來就已經複雜到爆了沒差吧~~ (d) 指令的設計會更加複雜、編譯器的開發難度會增高等等、編譯時間會增長(因為得花時間去判斷是否能使用這類的定址模式)等等。 4. (a) exception: page fault, TLB miss, Floating point arithmetic underflow, undefined instruction, execution abort, system call. interrupt: I/O device request, user defined interrupt :::info - user defined interrupt 好像是 x86 的功能?至少我沒玩過。但 Google 了一下,應該是 interrupt。 - 我覺得可以用兩種方式去判斷。同步/非同步,以及軟體產生的/硬體產生的。跟指令同步發生的是 exception,跟指令非同步發生的是 interrupt;或是由指令的副作用產生的是 exception,由硬體產生的是 interrupt ::: (b) Speculative > OOO superscalar > superscalar > pipeline > single issue in-order :::info data cache 我不知道該擺在哪裡...完全不相干阿 ::: \(c\) Hyper-threaded > superscalar > pipeline > GPGPU ... ? Virtual Machine ? Container ? 5. (a) ILP: instruction level parallelism, DLP: data level parallelism, MLP: memory level parallelism, TLP: thread level parallelism (b) ILP: pipeline, DLP: ARM Neon, MLP: NUMA?, TLP: GPU \(c\) ILP: Global Instruction Scheduling, DLP: loop unrolling, MLP: ???, TLP: multithread program 6. (a) 8 核心的手機,應該是相當高階的手機吧?會買那種手機的人,手遊重度成癮的人想必不在少數。6 個大核心想必能滿足那群課長的需求。至於電力相耗想必不在他們的考量內,畢竟不自備行動電源,哪有資格當課長,你說是吧?換個角度想,有些人只是單純有錢才買這種高階手機的,有錢人應該不會想掛個尿袋在身上,太醜了。6 個大核心會成為吃電怪獸,讓他們沒辦法在高級餐廳用餐時,拍照上傳高調炫富,因為手機他媽的沒電了。 所以該不該用 6 個大核心?~~關我屁事。反正我一個研究所考生也買不起。~~ 大部份的廠商在打廣告時,都會以耗電量當成賣點,很少看到(華碩 SONY 那一流沒什麼人要買的除外)以手遊效能為主打特色,所以 6 個大核可能不是一個好主意。 (b) 小核自組一群,大核自組一群。同一個時間,只有小核或是大核在運作、視工作量決定。這樣只需要在小核/大核間維持 cache coherence 即可。若要切換,就得先把資料存回記憶體,然後再切換到另一個群組。這樣可以簡化作業系統以及計算機架構設計,又能利用到大小核的好處。 7. (a) (1) real UID 是 user 的 ID, effective UID 是冒名別人時用的 UID(像是使用 root 權限時),saved UID 是為了能在兩種不同身份間切換而設置的、類似暫存區的 UID (2) effective UID (b) (1) multi-process 用的記憶體比較多,因為他們的定址空間是分開的;multi-thread 在 CPU scheduling 上比 multi-process 靈活且高效率,因為 thread 在切換時,不需切換定址空間,TLB 和 cache 都不需要被 flush;multi-thread 在 resource sharing 比 multi-process 更靈活,原因同前:他們使用的是同樣的定址空間。 (2) fork() 後的子程序跟父程序的定址空間是分開的,所以父程序的 `sharedVariable` 不會被改變,依然是 `P` 8.