# linux2021: asahsieh ## 測驗 η ### 測驗 β-1 1. 說明上述程式碼的運作原理 - *mask*的用處是取出輸入`sz`的alignment以下的位元做檢查。 > alignment的記憶體對齊地址必須為給定的alignment的倍數,即在alignment以下的位元都必須為`0` - return value的部份 ```c= return (((sz + mask) / alignment) * alignment); ``` 可分成兩個部份來解釋 1. 將`sz`shift到**aligned_addr_high**到下一個`alignment`的記憶體對齊地址: (sz + mask) - `sz`會介於某兩個相鄰的`alignment`的記憶體對齊地址;為解釋此expression,我們定義++小於sz++最近的`alignment`記憶體對齊地址,為**aligned_addr_low**;反之,稱作**aligned_addr_high**. - 此function的輸出為++大於等於++`alignment`的aligned address, 故任何非aligned且大於**aligned_addr_low**的addresses, 對應的`alignment`的記憶體對齊地址皆是**aligned_addr_high**. - 故我們可將`sz`shift到**aligned_addr_high**到下一個`alignment`的記憶體對齊地址, 即`(sz + mask)`, 再利用下一個部份的算術運算來mask掉非aligned addresses的offset,得到對應的`alignment`的記憶體對齊地址。 2. **(TODO)** power of two 為解釋此expression,我們定義++小於sz++最近的alignment記憶體對齊地址,為**aligned_addr_low**;反之,稱作**aligned_addr_high** - ((sz + mask) / alignment) - sz會介於兩個相鄰的alignment的記憶體對齊地址;為解釋此expression,我們定義++小於sz++最近的alignment記憶體對齊地址,為**aligned_addr_low**;反之,稱作**aligned_addr_high** - 此function輸出為++大於等於++alignment的aligned address, 可以利用`/` operator取得第一個運算元除以第二個運算元商數的特性^[inline footnote] - 我們假設sz大於aligned_addr_low,先加上mask值,讓sz大於等於aligned_addr_high;再用除以alignment取商得到sz是屬於第幾個alignment的記憶體對齊地址。已知sz是第幾個alignment的記憶體對齊地址後,將該值乘上給定的alignment值,即為對應的alignment的記憶體對齊地址。 - 為什麼是加*mask*,而不是alignment呢? 因為是要找**大於或等於**最近的alignment記憶體對齊地址, 若sz剛好是alignment記憶體對齊地址,加上alignment的話,會指到下一個對齊位置;e.g.,: ```c sz = 120, alignment = 4 ((sz + 4) / 4) * 4 = 31 * 4 = 124 ``` 某一對齊地址+(0, ..., mask)都是屬於此對齊地 址,所以sz會限制在兩個相鄰的alignment的記憶體對齊地址間;如上述我們定義的aligned_addr_low與aligned_addr_high. ### 測驗 β-2 **(To explain)** [How to allocate aligned memory only using the standard library?](https://stackoverflow.com/a/227900) ### 測驗 γ-1 - fork,呼叫 1 次,返回 2 次 - from `$man fork` > At the time of fork() both memory spaces have the same content. Memory writes, file mappings (mmap(2)), and unmappings (mun‐ map(2)) - duplicating parent thread包含目前使用的buffer - printf("-"); "-"會先放到buffer中,不會馬上输出。 故執行兩次迴圈會有**8**個"-" - **(TODO)** Add a graph to explain ^[inline footnote] 定義於ISO/IEC C99 **6.5.5 Multiplicative operators** Sematics中: *The result of the/operator is the quotient from the division of the first operand by the second* ###### tags: `linux2021` `linux2021_summer` `jserv`