對于有線程系統:
程序是資源配置設定的獨立機關
線程是資源排程的獨立機關
對于無線程系統:
程序是資源排程、配置設定的獨立機關
管道(PIPE)
有名管道:一種半雙工的通信方式,它允許無親緣關系程序間的通信
優點:可以實作任意關系的程序間的通信
缺點:
長期存于系統中,使用不當容易出錯
緩沖區有限
無名管道:一種半雙工的通信方式,隻能在具有親緣關系的程序間使用(父子程序)
優點:簡單友善
局限于單向通信
隻能建立在它的程序以及其有親緣關系的程序之間
信号量(Semaphore):一個計數器,可以用來控制多個線程對共享資源的通路
優點:可以同步程序
缺點:信号量有限
信号(Signal):一種比較複雜的通信方式,用于通知接收程序某個事件已經發生
消息隊列(Message Queue):是消息的連結清單,存放在核心中并由消息隊列辨別符辨別
優點:可以實作任意程序間的通信,并通過系統調用函數來實作消息發送和接收之間的同步,無需考慮同步問題,友善
缺點:資訊的複制需要額外消耗 CPU 的時間,不适宜于資訊量大或操作頻繁的場合
共享記憶體(Shared Memory):映射一段能被其他程序所通路的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以通路
優點:無須複制,快捷,資訊量大
通信是通過将共享空間緩沖區直接附加到程序的虛拟位址空間中來實作的,是以程序間的讀寫操作的同步問題
利用記憶體緩沖區直接交換資訊,記憶體的實體存在于計算機中,隻能同一個計算機系統中的諸多程序共享,不友善網絡通信
套接字(Socket):可用于不同計算機間的程序通信
優點:
傳輸資料為位元組級,傳輸資料可自定義,資料量小效率高
傳輸資料時間短,性能高
适合于用戶端和伺服器端之間資訊實時互動
可以加密,資料安全性強
缺點:需對傳輸的資料進行解析,轉化成應用級的資料。
鎖機制:包括互斥鎖/量(mutex)、讀寫鎖(reader-writer lock)、自旋鎖(spin lock)、條件變量(condition)
互斥鎖/量(mutex):提供了以排他方式防止資料結構被并發修改的方法。
讀寫鎖(reader-writer lock):允許多個線程同時讀共享資料,而對寫操作是互斥的。
自旋鎖(spin lock)與互斥鎖類似,都是為了保護共享資源。互斥鎖是當資源被占用,申請者進入睡眠狀态;而自旋鎖則循環檢測保持者是否已經釋放鎖。
條件變量(condition):可以以原子的方式阻塞程序,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
信号量機制(Semaphore)
無名線程信号量
命名線程信号量
信号機制(Signal):類似程序間的信号處理
屏障(barrier):屏障允許每個線程等待,直到所有的合作線程都達到某一點,然後從該點繼續執行。
線程間的通信目的主要是用于線程同步,是以線程沒有像程序通信中的用于資料交換的通信機制
程序之間的通信方式以及優缺點來源于:程序線程面試題總結
私有:位址空間、堆、全局變量、棧、寄存器
共享:代碼段,公共資料,程序目錄,程序 ID
私有:線程棧,寄存器,程式計數器
共享:堆,位址空間,全局變量,靜态變量
對比次元
多程序
多線程
總結
資料共享、同步
資料共享複雜,需要用 IPC;資料是分開的,同步簡單
因為共享程序資料,資料共享簡單,但也是因為這個原因導緻同步複雜
各有優勢
記憶體、CPU
占用記憶體多,切換複雜,CPU 使用率低
占用記憶體少,切換簡單,CPU 使用率高
線程占優
建立銷毀、切換
建立銷毀、切換複雜,速度慢
建立銷毀、切換簡單,速度很快
程式設計、調試
程式設計簡單,調試簡單
程式設計複雜,調試複雜
程序占優
可靠性
程序間不會互相影響
一個線程挂掉将導緻整個程序挂掉
分布式
适應于多核、多機分布式;如果一台機器不夠,擴充到多台機器比較簡單
适應于多核分布式
優劣
優點
程式設計、調試簡單,可靠性較高
建立、銷毀、切換速度快,記憶體、資源占用小
缺點
建立、銷毀、切換速度慢,記憶體、資源占用大
程式設計、調試複雜,可靠性較差
需要頻繁建立銷毀的優先用線程
需要進行大量計算的優先使用線程
強相關的處理用線程,弱相關的處理用程序
可能要擴充到多機分布的用程序,多核分布的用線程
都滿足需求的情況下,用你最熟悉、最拿手的方式
多程序與多線程間的對比、優劣與選擇來自:多線程還是多程序的選擇及差別
在現代作業系統裡,同一時間可能有多個核心執行流在執行,是以核心其實像多程序多線程程式設計一樣也需要一些同步機制來同步各執行單元對共享資料的通路。尤其是在多處理器系統上,更需要一些同步機制來同步不同處理器上的執行單元對共享的資料的通路。
原子操作
信号量(semaphore)
讀寫信号量(rw_semaphore)
自旋鎖(spinlock)
大核心鎖(BKL,Big Kernel Lock)
讀寫鎖(rwlock)
大讀者鎖(brlock-Big Reader Lock)
讀-拷貝修改(RCU,Read-Copy Update)
順序鎖(seqlock)
來自:Linux 核心的同步機制,第 1 部分、Linux 核心的同步機制,第 2 部分
系統資源不足
資源配置設定不當
程序運作推進順序不合适
互斥
請求和保持
不剝奪
環路
打破互斥條件:改造獨占性資源為虛拟資源,大部分資源已無法改造。
打破不可搶占條件:當一程序占有一獨占性資源後又申請一獨占性資源而無法滿足,則退出原占有的資源。
打破占有且申請條件:采用資源預先配置設定政策,即程序運作前申請全部資源,滿足則運作,不然就等待,這樣就不會占有且申請。
打破循環等待條件:實作資源有序配置設定政策,對所有裝置實作分類編号,所有程序隻能采用按序号遞增的形式申請資源。
有序資源配置設定法
銀行家算法
Windows:FCB 表 + FAT + 位圖
Unix:inode + 混合索引 + 成組連結
主機位元組序又叫 CPU 位元組序,其不是由作業系統決定的,而是由 CPU 指令集架構決定的。主機位元組序分為兩種:
大端位元組序(Big Endian):高序位元組存儲在低位位址,低序位元組存儲在高位位址
小端位元組序(Little Endian):高序位元組存儲在高位位址,低序位元組存儲在低位位址
32 位整數 <code>0x12345678</code> 是從起始位置為 <code>0x00</code> 的位址開始存放,則:
記憶體位址
0x00
0x01
0x02
0x03
大端
12
34
56
78
小端
大端小端圖檔

判斷大端小端
可以這樣判斷自己 CPU 位元組序是大端還是小端:
x86(Intel、AMD)、MOS Technology 6502、Z80、VAX、PDP-11 等處理器為小端序;
Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC(除 V9 外)等處理器為大端序;
ARM(預設小端序)、PowerPC(除 PowerPC 970 外)、DEC Alpha、SPARC V9、MIPS、PA-RISC 及 IA64 的位元組序是可配置的。
網絡位元組順序是 TCP/IP 中規定好的一種資料表示格式,它與具體的 CPU 類型、作業系統等無關,進而可以保證資料在不同主機之間傳輸時能夠被正确解釋。
網絡位元組順序采用:大端(Big Endian)排列方式。
在位址映射過程中,若在頁面中發現所要通路的頁面不在記憶體中,則産生缺頁中斷。當發生缺頁中斷時,如果作業系統記憶體中沒有空閑頁面,則作業系統必須在記憶體選擇一個頁面将其移出記憶體,以便為即将調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換算法。
全局置換:在整個記憶體空間置換
局部置換:在本程序中進行置換
全局:
工作集算法
缺頁率置換算法
局部:
最佳置換算法(OPT)
先進先出置換算法(FIFO)
最近最久未使用(LRU)算法
時鐘(Clock)置換算法