---
# System prepended metadata

title: 題庫1
tags: [Interview]

---

---
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 攻擊。