Interview Questions for Backend developer.
最近因為各種原因,短短幾個月內就一直在面試,就記錄一下最近碰到得面試題目吧。
- Process vs Thread
- What’s the different between HTTP methods POST and GET?
- What is REST and RESTful?
- How CSRF token be generated?
Process vs Thread
這大概是問最多的基本題吧,就連 StackOverflow 上面也是超多人在問的。
我覺得一開始可以這樣說:
每個 Process 都有提供需要的資源去執行程式,一個 Process 會有獨立的 process id、環境變數以及至少一個 Thread 來執行,當然,可以增加額外的 Tread。
意即每個 Process 處於不同的記憶體空間上,所以無法分享記憶體。
每個 Thread 則是在 Process 之下,可以被排程執行,所有的 Thread 共用相通的資源以及記憶體空間上,每個 Thread 有自己獨立的 Thread id 跟 local storage.
意即每個 Thread 處於相同的記憶體空間上,所以是分享記憶體的。
用日常生活的方式舉個例子的話,比較像是高速公路的概念。
國道一號跟國道三號就是不同的 Process,國道內的線道就是不同的 Thread,國道內的所有車輛(程式)共用全部的縣道(Address Space),而當國道一號發生車禍導致塞車的時候,其他車輛就會因此受到影響,但是國道三號的車卻不受影響。
Notes
Apache
後來又看到 mode_wsgi的這篇,裡面提到了Apache提供了三種不同的Mode
Multi-Process | Multi-Thread | |
---|---|---|
Prefork | Yes | No |
Worker | Yes | Yes |
Winnt | No | Yes |
Worker 文件也提到了 Python GIL 的問題,裡面說法是因為中間是由 mod_uswgi 做中介給Apache,所以 Thread 以及 Process 是由 Apache(C code)管理,而不是 Python,所以在Multi-Core CPU表現上會比較好。
我也好奇 Worker 是如何產生 Process/Thread 的,其實概念也蠻簡單的,就是先把Process 內的 Thread 塞滿,滿了之後再開 Child Process 依此類推。
Nginx
Nginx+uWSGI 這篇看來,uWSGI則沒有處理 GIL 的問題,如果有碰到 I/O bound的問題,看來還是只能乖乖地關掉 thread 了(QQ)
What’s the different between HTTP methods POST and GET?
一開始的想法比較像是用 REST 的想法用 Resource
的角度去描述的,但後來對方問更深,就倒了…
回家後查了一下Source,其實有很多是知道的,但當下沒想到,有點可惜,順便截取一些重點。
GET | POST | |
---|---|---|
History 參數會被存 | Yes | No |
Bookmarked | Yes | No |
參數(Parameters) | Yes | Yes |
Data Type 限制 | ASCII | 無限制,Binary也可以,所以可以傳檔案 |
Data length 限制 | 2048個字元上限 | 無 |
Cached | Yes | No |
What is REST or RESTful?
REST 是 Representational State Transfer
的縮寫,是一種傳輸資料的『風格』不是一種『標準』,利用 HTTP methods(GET/POST/PUT/PATCH/DELETE) 等等不同的操作來對伺服器的資源做管理。
具有幾個特點:
- 以資源為基礎
- 統一的介面
- 無狀態(Stateless)
- Client-server architecture
- Cacheability
- Layered system
而具有 REST
風格的API,就是 RESTful API。
How CSRF token be generated?
上次被問到如何解決 CSRF 攻擊的問題,我提到了利用 CSRF token 可以解決,而對方問到了更深入,那你知道 CSRF token 是如何產生的嗎? 當初猜是類似用 One-Time password 到方式,伺服器端有存密鑰,然後依照時間產生一組時間內有效的 token 放在 Database 內。
後來查到這裡有解釋如何產生的Source
裡面提到,通常是用 per-session 的方式產生的,隨機產生一組 token 放入 session 內,session id 跟 token 會傳給 client,如果回來的 session id 與 token 是一樣的,就是有效的。
更甚者,如果要更安全,可以每次產生表單或者每個 request的時候都產生一次,但會把整個設計變得相當複雜。
在這裡提到
Synchronizer (CSRF) Tokens
- Any state changing operation requires a secure random token (e.g., CSRF token) to prevent CSRF attacks
- Characteristics of a CSRF Token
- Unique per user session
- Large random value
- Generated by a cryptographically secure random number generator
- The CSRF token is added as a hidden field for forms or within the URL if the state changing operation occurs via a GET
- The server rejects the requested action if the CSRF token fails validation
Leave a Comment