--- title: 題庫1 description: 幫忙搜集面試題庫,貼在這你 --- # 題庫1 ###### tags: `Interview` ## TCP/UDP差別在哪,用途?Socket程式大概怎麼寫? * `TCP` : 可靠傳輸,通常在每個TCP packet中都有一對序號和確認號。TCP packet傳送者稱自己的位元組流的編號為序號(sequence number),稱接收到對方的位元組流編號為確認號。 * `UDP` : `不`可靠傳輸,`不會`確認資料是否被接收,`不會`重傳遺失的資料,接收的資料可以`不按照`順序,但`UDP`比`TCP`快。對`時間有較高要求`的應用程式通常使用UDP,因為`丟棄封包`比`等待或重傳導致延遲`更可取。 ```c= TCP: socket -> bind -> listen -> accept -> recv <-> send -> close UDP: socket -> bind -> recvfrom <-> sendto -> close ``` ## Client和Server在做網路通訊時,recv buffer包含了什麼資訊。 * [深入浅出TCP/IP中的send和recv](http://nathanchen.github.io/14554141138605.html) ## Critical section是什麼? * 操作`shared data`的地方就叫做`crtitcal section` * 用來保護`shared data` (global)的地方 * 盡量會把`shared data`都放在`critical section`做操作 ### Synchronization * 不會有兩個thread再跑同一段code (有shared data),保證不會發生`race condition`就叫做`synchronization` ## Mutex程式大概怎麼寫?撰寫時有什麼要注意的地方? * 考慮 * atomic * interrupt * preemption * SMP or not ```c= pthread_mutex_init(&lock, NULL); ... pthread_mutex_lock(&lock); // acquire ... pthread_mutex_unlock(&lock); // release ... pthread_mutex_destroy(&lock); ``` ```c= spin_lock(&lock); ... spin_unlock(&lock); ``` * 避免DeadLock * 對`共享資源`操作前一定要`獲得`Lock。 * `完成操作`以後一定要`釋放`Lock。 * 儘量`短`時間地佔用Lock。 * 如果有多Lock, 如`獲得順序`是ABC連環扣, `釋放順序`也應該是ABC。 * Thread錯誤返回時應該`釋放`它所獲得的Lock。 ## Process 和 thread 差別?如果是不同process,如何保護Critical section? * `Process` * 是OS分配資源(CPU time, memory, etc)的最小單位 * 在同個`記憶體空間`有一之多個threads跑在同個`記憶體空間` * `thread` * 在底層行程管理和排程將thread和process一視同仁。thread是一群比較特別的process,他們彼此share資源。 * [synchronization](https://medium.com/@fdgkhdkgh/os-synchronization-c7fb8546d674) * [Thread Synchronization](http://wiki.csie.ncku.edu.tw/embedded/2015q1w9/thread-sync.pdf) * [Linux的thread和signal](https://medium.com/@petertc/thread-and-signal-in-linux-4f2038d18fd) ## 有沒有寫過shared memory,大概怎麼寫,寫的時候要注意什麼。 ## 講講虛擬記憶體和分頁機制。 ## 為什麼宣告並初始一個超大陣列會crash,而宣告成static就不會,他們的儲存方式有什麼差別。 * stack 會爆掉 * static 會直接編譯在program上(.data, .bss),他的program size會大一點 ## stack 和 heap差別是什麼。 ## function在進行呼叫的時候OS會作什麼事情,組合語言大概怎麼寫。 * 疊一個stack frame ```asm= push rbp mov rsp, rbp sub ... ... add ... mov rbp, rsp pop rbp ret ``` ## pointer操作、pointer/reference的差別與實作 * [指標(Pointer)與參照(Reference)](https://bluelove1968.pixnet.net/blog/post/222284818) ## Multi-Process / Multi-Thread之間的同步與溝通問題 ## Virtual Memory的觀念、Page Fault、LRU演算法 # 白板題:動態擴充的stack和queue實作 * dynamic stack ```c= #include <stdlib.h> #include <string.h> struct stack { int capacity; int top; int *buf; }; struct stack *init_stack(int capacity) { struct stack *s = (struct stack *)malloc(sizeof(struct stack)); memset(s, '\x00', sizeof(struct stack)); s->capacity = capacity; s->top = -1; s->buf = (int *)malloc(sizeof(int) * capacity); return s; } int pop(struct stack *s) { if (s->top == -1) { return -1; } return s->buf[s->top--]; } void push(struct stack *s, int data) { if (s->top == s->capacity) { s->buf = realloc(s->buf, sizeof(int) * s->capacity * 2); s->capacity = s->capacity * 2; } s->buf[++s->top] = data; } int main() { struct stack *s = init_stack(2); push(s, 1); push(s, 2); push(s, 3); push(s, 4); printf("%d\n", pop(s)); printf("%d\n", pop(s)); printf("%d\n", pop(s)); printf("%d\n", pop(s)); printf("%d\n", pop(s)); } ``` * dynamic queue # 白板題:現在有兩個整數集合要進行差集,怎麼寫?為什麼用這種資料結構?有沒有更快的方法?時間和空間複雜度各是多少? # 白板題:算樹的高度、節點數量、BFS/DFS # 白板題:Linked-List相關的題目(排序、插入等) # 白板題:找出array中重複的數字 * LeetCode 217:Contains Duplicate * LeetCode 219:Contains Duplicate II * LeetCode 220:Contains Duplicate III * LeetCode 287:Find the Duplicate Number # 白板題:給定一個數列和一個數字,請寫出partition的程式,左邊小於此數字,右邊大於等於此數字,要確保所有特殊數列都能通過測試。 * 86. Partition List # 白板題:順時鐘旋轉一張 NxN 的灰階圖片,不可以使用額外的二維陣列。 ## 行有餘力題 * 解釋對稱式和非對稱式加密,為什麼他們可以運作,如何運作。 * 公鑰跟私鑰的差別跟用途?數位簽署的原理? * Linux 系統如何儲存使用者密碼。 * 為什麼能確保加密資料不會被字典攻擊。 * 講講SQL injection 跟XSS 攻擊。