# 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`