進程和線程
1. 計算機操作系統中的“中斷”的作用
中斷是指當操作系統執行一個程序的時候,當該程序遇到IO阻塞,運行時間過長,或急需CPU處理的事件,CPU會終止運行當前的程序切換執行其他的進程,然後再回過來執行原來的進程。
中斷可以充分得利用CPU的資源,使CPU高效的工作。
2.”內核態” 和“用戶態”
當程序執行系統調用的時候陷入執行內核代碼的時候,就稱進程處於內核狀態,這時CPU可以訪問內存中的所有數據。CPU可以自行被其他程序調用。
當程序執行自己代碼的時候,就稱當前程序處理用戶態。此時程序佔用CPU的能力被剝奪,CPU資源可以被其他程序獲取。
3.進程
進程指的是正在執行的過程,
程序指的是一堆的代碼
4.線程
進程相當於一個車間,那麼線程就相當於車間裏面的一條流水線。
進程是把資源集合在一起,那麼線程纔是CPU執行的單元。
5.程序執行過程
程序被加載到內存中,然後通過解釋器進行處理和調用系統
6.系統調用
系統調用指的是應用程序通過操作系統提供的接口來調用操作系統和硬件
7.進程間的通信方式
- 管道:速度慢,容量有限,只有父子進程能通訊
- FIFO:任何進程間都能通訊,但速度慢
- 消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題
- 信號量:不能傳遞複雜消息,只能用來同步
- 共享內存區:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於線程中的線程安全,當然,共享內存區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存
8.隊列和管道
隊列和消息都是用來傳遞消息的
隊列相對比較高級,有優先級等比較高級的用法
管道相對比較單一,管道分PIPE和FIFO,PIPE是無名的,所以只能在進程內或父子進程間通信,FIFO可任何兩個進程間通信了
9.join daemon
join是等待線程執行完畢,適用於當主進程執行到某一階段時,主線程需要等待子線程執行完畢時才能執行。
daemon 爲守護進程,即當主線程結束時,子進程立馬終止。
10.threading模塊event和condition的區別
event來實現線程之間的通信
11.threading中Lock和RLock的相同點和不同點
相同點:都是線程鎖
不同點:Lock會造成死鎖,Rlock不會造成死鎖
12.什麼是select,請簡述它的工作原理,簡述它的優缺點
13.請簡述IO多路複用模型的工作原理
當有請求來的時候,會發送到select,然後select再告訴有沒有數據要讀取,select可以同時監控多個套接字,然後同時返回給套接字。
注意:如果處理的連接數不是很高的話,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延遲還更大。select/epoll的優勢並不是對於單個連接能處理得更快,而是在於能處理更多的連接
14.什麼是select,請簡述它的工作原理,簡述它的優缺點
select可以同時監控多個socket是否可讀可寫,IO多路複用的機制
缺點:
(1)每次調用select,都需要把fd集合從用戶態拷貝到內核態,這個開銷在fd很多時會很大
(2)同時每次調用select都需要在內核遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大
(3)select支持的文件描述符數量太小了,默認是1024