操做系統實戰

操做系統實戰

臨界資源

保護臨界資源/進行通訊
  • 線程間同步
  • 互斥量和 讀寫鎖 自旋鎖 條件變量
  • 進程間同步
  • 共享內存 域套接字

重要概念

  • 用戶態與內核態
  • 上下文切換
  • 協程

線程同步之互斥量

互斥量()能夠保證多線程的指令按順序執行,避免兩個線程的指令交叉執行(即 原子性java

  • 原子性是指一系列操做指令不可被中斷執行,要麼所有執行,要麼所有沒有執行,不存在部分執行的狀況
  • 互斥量是最簡單的線程同步的方法
  • 互斥量(互斥鎖)是處於兩態之一的變量: 解鎖加鎖
  • 兩個狀態能夠保證資源訪問的串行

操做系統直接提供了互斥量的API,可以使用API完成資源的加鎖,解鎖的操做python

pthread_mutex_t

線程同步之自旋鎖

  • 自旋轉也是一種多線程同步的變量
  • 使用自旋轉的線程會反覆檢查鎖的變量是否可用
  • 自旋轉不會讓出CPU,是一種忙等待 的狀態 (死循環等待鎖被釋放)
自旋鎖避免了進程或線程的**上下文切換**的開銷

操做系統內部不少地方使用的是自旋鎖
自旋鎖不適合在單核CPU使用多線程

pthread_spinlock_t

線程同步之讀寫鎖

當臨界資源屬於 多讀少寫 的狀況,能夠採用效率更高的同步方法: 讀寫鎖 讀多寫少場景相比互斥量性能提出幾倍
  • 讀寫鎖是一種特殊的 自旋鎖
  • 容許多個讀者同時訪問資源以提升讀性能(讀 不改變臨界資源的值)
  • 對於寫操做則是 互斥 的
pthread_rwlock_t
pthread_relock_rdlock
pthread_rwlock_wrlock

線程同步之條件變量

在生產消費場景中面臨如下狀況
1 緩衝區小於0時,不容許消費者消費,消費者必須等待
2 緩衝區滿時,不容許生產者往緩衝區生產,生產者必須等待
當生產者生產一個產品時,喚醒可能等待的消費者
當消費者消費一個產品時,喚醒可能等待的生產者性能

pthread_cond_t 配合 互斥量(鎖)使用
pthread_cond_wait
pthread_cond_signal
  • 條件變量是一種相對複雜的線程同步方法
  • 條件變量容許線程睡眠,直到知足某種條件
  • 當知足條件時,能夠向該線程信號,通知喚醒

線程同步方法總結

線程同步

1 互斥鎖 最簡單的線程同步方法,會阻塞線程
2 自旋鎖 避免上下文切換的一種線程同步方法,屬性忙等待CPU
3 讀寫鎖 爲多讀少寫的資源設計的線程同步方法,顯著提升性能
4 條件變量 相對複雜的多線程同步方法,配合互斥量,更靈活的使用場景spa

使用fork系統調用建立進程

java python 等語言底層也是經過fork 建立進程
  • fork系統調用是用於建立進程的
  • fork建立的進程初始狀態與父進程同樣
  • 系統會爲fork的進程分配新的資源
  • fork系統調用無參數 fork會返回兩次 ,分別是子進程id0

進程同步之共享內存

進程的線程共享進程資源,理論上進程之間因爲操做系統的進程管理機制(進程-頁表-物理內存),進程間的內存空間是相互獨立的,(進程默認是不能訪問進程空間以外的內存空間)但進程能夠經過共享內存打破這樣的限制操作系統

  • 共享存儲容許不相關的進程訪問同一片物理內存
  • 共享存儲是兩個進程之間共享和傳遞數據最快的一種方式
  • 共享內存未提供同步機制,須要藉助其餘機制管理訪問
共內存是高性能後臺開發中最經常使用的進程同步方式

共享內存實現流程

1 申請共享內存
2 鏈接到進程空間
3 使用共享內存
4 脫離進程空間&刪除線程

相關文章
相關標籤/搜索