程序與線程
本文摘自https://github.com/huihut/interview#database
1. 簡要概念
對于有線程系統:
- 程序是資源配置設定的獨立機關
- 線程是資源排程的獨立機關
對于無線程系統:
- 程序是資源排程、配置設定的獨立機關
2. 程序之間的通信方式及優缺點
2.1. 管道(PIPE)
(1)有名管道:一種半雙工的通信方式,它允許無親緣關系程序間的通信
優點:可以實作任意關系的程序間通信
缺點:a. 長期存于系統中,使用不當容易出錯;b. 緩沖區有限。
(2)無名管道:一種半雙工的通信方式,隻能在具有親緣關系的程序間使用(父子程序)
優點:使用友善
缺點:a. 局限于單向通信;b. 隻能建立在它的程序以及其有親緣關系的程序之間;c. 緩沖區有限
2.2. 信号量(Semaphore)
一個計數器,可以用來控制多個線程對共享資源的通路
優點:可以同步程序
缺點:信号量有限
2.3. 信号(Signal)
一種比較複雜的通信方式,用于通知接收程序某個事件已經發生
2.4. 消息隊列(Message Queue)
是消息的連結清單,存放在核心中并由消息隊列辨別符辨別
優點:可以實作任意程序間的通信,并通過系統調用函數來實作消息發送和接收之間的同步,無需考慮同步問題,友善
缺點:資訊的複制需要額外消耗CPU的時間,不适宜資訊量大或操作頻繁的場合
2.5. 共享記憶體(Shared Memory)
映射一段能被其他程序所能通路的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以通路
優點:無需複制,快捷,資訊量大
缺點:
a. 通信是通過将共享空間緩沖區直接附加到程序的虛拟地質空間中來實作的,是以有程序間的讀寫操作和同步問題
b. 利用記憶體緩沖區直接交換資訊,記憶體的實體存在于計算機中,隻能同一個計算機系統中的諸多程序共享,不友善網絡通信
2.6 套接字(Socket)
可用于不同計算機間的程序通信
優點:
a. 傳輸資料為位元組級,傳輸資料可自定義,資料量小效率高
b. 傳輸資料時間短,性能高
c. 适合于用戶端和服務端之間資訊實時互動
d. 可以加密,資料安全性強
缺點:需對傳輸的資料進行解析,轉化成應用級的資料
3. 線程之間的通信方式
3.1. 鎖機制
包括互斥鎖/量(mutex)、讀寫鎖(reader-writer lock)、自旋鎖(spin lock)、條件變量(condition)
互斥鎖/量(mutex):提供了以排他方式防止資料結構被并發修改的方法
讀寫鎖(reader-writer lock):允許多個線程同時讀共享資料,而對寫操作是互斥的
自旋鎖(spin lock):與互斥鎖類似,都是為了保護共享資源。互斥鎖是當資源被占用,申請者進入睡眠狀态;而自旋鎖則循環檢測保持者是否已經釋放鎖。
條件變量(condition):可以以原子的方式阻塞程序,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
3.2. 信号量機制(Semaphore)
無名線程信号量
命名線程信号量
3.3. 信号機制(Signal)
類似程序間的信号處理
3.4. 屏障(barrier)
屏障允許每個線程等待,直到所有的合作線程都達到某一點,然後從該點繼續執行。
小結:線程間的通信目的主要是用于線程同步,是以線程沒有像程序通信中的用于資料交換的通信機制。
4. 程序之間私有和共享的資源
- 私有:位址空間、堆、全局變量、棧、寄存器
- 共享:代碼段、公共資料、程序目錄、程序ID
5. 線程之間私有和共享的資源
- 私有:線程棧、寄存器、程式計數器
- 共享:堆、位址空間、全局變量、靜态變量
6. 多程序與多線程間的對比、優劣與選擇
6.1. 對比
