計算機的字符與編碼集
使用unicode
中文編碼集,windows默認使用GBK
編程推薦使用UTF-8
文件的編碼集 GB2312 支持中文
馮諾依曼機
輸入設備
輸出設備
存儲器
運算器
控制器
計算機硬件:CPU 內(nèi)存 硬盤 鼠標 鍵盤 顯示器 網(wǎng)卡 電源 顯卡 聲卡 主板
CPU:存儲器,運算器,控制器(里面有高速緩存)
計算機總線和IO設備
計算機的總線,計算機的輸入/輸出設備
總線的概述:USB(通用串行總線)
作用:提供了對外鏈接的接口,不同設備可以通過USB鏈接,促使外圍設備接口的統(tǒng)一
PCI總線:顯卡
沒有總線需要各自設備之間的互相鏈接,有了總線就可以通過總線進行鏈接
總線的分類:片內(nèi)總線,系統(tǒng)總線
片內(nèi)總線:芯片內(nèi)部的總線(高速緩存,控制器,中斷系統(tǒng),運算器)
總線可以簡化 內(nèi)部的電路結構
片內(nèi)總線:高集成度芯片內(nèi)部的信息傳輸線
系統(tǒng)總線:鏈接w外部設備的總線
系統(tǒng)總線:數(shù)據(jù)總線,地址總線 控制總線
數(shù)據(jù)總線:雙向傳輸各個部件的數(shù)據(jù)信息
地址總線:傳輸數(shù)據(jù)的地址,尋址的作用,地址總線的位數(shù)與存儲單元的位數(shù)有關
控制總線:監(jiān)視不同組件的狀態(tài),是否準備就緒
總線的仲裁
主存和硬盤,IO設備交換數(shù)據(jù) ,總線通過控制優(yōu)先級來爭奪資源,解決總線使用權的沖突問題
總線仲裁的方法:鏈式查詢法 計時器定時查詢法 獨立請求法
鏈式查詢:
問題:如果設備1,2同時發(fā)出仲裁請求,先到設備1,再到2
優(yōu)點:電路復雜度低,仲裁方式簡單
缺點:優(yōu)先級低的設備難以獲得總線的使用權
計時器定時查詢
通過仲裁控制器發(fā)出1,2,3,4等信息,匹配到第幾個第幾個響應
獨立請求法
每個設備均有總線獨立鏈接仲裁器
設備科單獨向沖裁器發(fā)送請求和接受請求
當同時收到多個請求信號,仲裁器有權限優(yōu)先級分配使用權
優(yōu)點:響應速度快,優(yōu)先順序可以改變
缺點:設備連線多,總線控制復雜
CPU與IO設備通信
輸入輸出接口的通用設計
CPU與IO設備的通信
程序程序中斷
DMA(直接存儲器訪問)
CPU速度與IO設備速度不一致
程序中斷:當外圍s設備IO準備就緒時,向CPU發(fā)出中斷信號
程序中斷:提供了設備通知CPU的一種異步的方式,CPU可以高速運轉(zhuǎn)的同時兼顧低俗設備響應
頻繁打斷CPU會降低效率
DMA(直接存儲訪問) DMA直接連接主存與I設備
DMA工作時不需要CPU的參與
有了DMA不需要打斷CPU 工作,類似于脊髓
硬盤 顯卡都有DMA的設備
計算機的存儲器
計算機的存儲器概覽,計算機的高速存儲器,計算機的主存儲器與輔助存儲器
存儲器的分類:內(nèi)存,U盤,固態(tài)硬盤,磁帶,磁盤
存儲介質(zhì)分類
隨機存儲器(RAM)可讀可寫,與位置無關
串行存儲器 與位置有關
只讀存儲器(ROM) 只讀不寫
計算機存儲概覽
1.緩存(容量最低,速度最快)
2.主存(內(nèi)存)
3.輔存(硬盤)
計算機的CPU
計算機機的指令系統(tǒng),計算機的運算器,計算機的控制器,指令的執(zhí)行過程
由于CPU和存儲器速度不一樣所以引入cache
CPU—cache—主存—輔存
緩存—主存 將常用的軟件進行內(nèi)存置換(解決速度不匹配)
主存—輔存 解決主存容量不足的問題
主存儲器(內(nèi)存)----本質(zhì)是RAM 隨機存取存儲器
為什么內(nèi)存斷電就會失去數(shù)據(jù)呢?
RAM是通過電容存儲數(shù)據(jù)的,必須每隔一段時間刷新一次,刷新需要有電的存在,沒有電,電子就會丟失
CPU里面的:
主存數(shù)據(jù)寄存器(MDR)----數(shù)據(jù)總線
主存地址寄存器(MAR)----地址總線
連接內(nèi)存和CPU
32位最多只有4G的地址尋址空間 所以加再多的內(nèi)存條沒有用
64位操作系統(tǒng)地址范圍有,支持2的34次方GB
電梯算法(磁盤的讀取)
先來先服務算法
最短尋道時間算法
掃描算法(電梯算法):每次只往一個方向移動,到達一個方向需要服務的勁頭再反方向
循環(huán)掃描算法:只往一個方向讀取到勁頭置到最開始的地方
計算機的高速緩存
高速緩存的原理
字:放在存儲單元中二進制代碼的組合(計算機的最小的單位)
字塊:可以理解為一組字(字塊包含多個字)
主存:2的n次方個字,一個存儲單元可以理解為一個字。一組字塊就是字塊。
尋址過程:所尋找的字屬于哪個字塊,字,字塊的地址
字的地址:前m位指字塊的地址
后b位指定字在字塊中的地址
一個字塊共B個字,主存共M個字塊
字塊數(shù)和地址之間的關系:2的對數(shù)之間的關系
字節(jié):B(byte) 1kb = 1024byte 位:bit(0,1)
計算地址的時候需要log2操作
主存的容量大于緩存的容量,說明主存的字塊數(shù)大于緩存的字塊數(shù)
CPU所需要的數(shù)據(jù)在緩存中就從cache中拿,不在就在主存中拿
量化CPU從cache中的幾率:緩存命中率(衡量緩存的性能指標)
從主存中替換到cache中的策略:
隨機算法:隨機選取一個位置來替換
先進先出算法(FIFO):看做是一個先進先出的隊列,cache滿了之后淘汰1號位,進來9號位
最不經(jīng)常使用算法(LFU):使用額外的空間記錄字塊使用的頻率,計數(shù)法
最近最少使用算法(LRU):優(yōu)先淘汰一段時間沒有使用的字塊,可以使用雙向鏈表,將當前訪問節(jié)點置于鏈表前面(保證頭部節(jié)點是最近使用的),滿了之后就開始淘汰,每次最近使用就將其置到最前面
計算機的指令系統(tǒng)
操作碼字段 :操作碼指明指令要完成的操作,操作碼的位數(shù)反映了機器的操作種類
地址碼字段:指定數(shù)據(jù)的地址
三地址指令,二地址指令,一地址指令
機器指令的操作類型:寄存器之間,寄存器與存儲單元之間,存儲單元之間
數(shù)據(jù)讀寫,jiaohua 地址數(shù)據(jù),清零置一等操作
計算機尋址系統(tǒng)
機器指令的尋址方式:順序?qū)ぶ?,跳躍尋址
數(shù)據(jù)尋址:立即尋址,直接尋址,間接尋址
計算機的控制器(CPU)
控制器是協(xié)調(diào)控制計算機的運行的
程序計數(shù)器用來存儲下一條指令的地址,循環(huán)從程序計數(shù)器中拿出指令,當指令被拿出時指向下一條指令
時序發(fā)生器:發(fā)送時序脈沖,CPU根據(jù)不同的時序脈沖進行工作
指令譯碼器:是控制器主要部件之一,計算機指令由操作碼和地址碼組成,翻譯操作碼對應的操作以及控制傳輸?shù)刂反a對應的數(shù)據(jù)
指令寄存器:從主存或高緩取計算機指令
主存地址寄存器:保存當前CPU正要訪問的內(nèi)存單元地址
主存數(shù)據(jù)寄存器:保存當前CPU正要讀寫的主存數(shù)據(jù)
通用寄存器:用于暫時存放或傳送數(shù)據(jù)的
計數(shù),發(fā)生,譯碼, 寄存,總線
計算機的運算器
數(shù)據(jù)緩沖器,ALU,通用寄存器,狀態(tài)字寄存器,總線
數(shù)據(jù)緩沖器:分為輸入緩沖和輸出緩沖
輸入緩沖暫時存放外設送來的數(shù)據(jù)
輸出緩沖暫時存放送往外設的數(shù)據(jù)
ALU
算數(shù)邏輯單元,是運算器的重要組成
完成常見的位運算,算數(shù)運算(加減乘除)
計算機指令的執(zhí)行過程
取指令-----分析指令-----執(zhí)行指令
從指令緩存中取指令-----送到指令寄存器-----送到指令譯碼器進行譯碼-----發(fā)出控制信號-----程序計數(shù)器+1指向下一條指令-----裝載數(shù)據(jù)到寄存器------ALU處理數(shù)據(jù)-----記錄運算狀態(tài)------送出運算結果
CPU的流水線設計(類似于工廠裝配線)
流水線效率提升3倍
進制運算的基礎知識:進制運算的基礎
二進制數(shù)據(jù)的表示方法:有符號數(shù)與無符號數(shù),二進制的補碼表示法,二進制的反碼表示法,小數(shù)的二進制補碼表示
二進制數(shù)據(jù)的運算:定點數(shù)與浮點數(shù),定點數(shù)的加減法運算,浮點數(shù)的減法運算,浮點數(shù)的乘除法運算
操作系統(tǒng)
操作系統(tǒng)的演進:無操系統(tǒng)
人工操作
用戶獨占
CPU等待人工操作
資源利用率很低
批處理系統(tǒng)
無需等待人工操作
批量處理任務
資源利用率提升
多道程序設計
分時系統(tǒng):
人機交互
多用戶共享
即時調(diào)試程序
資源利用率提升
多道程序設計:早期批處理系統(tǒng)一次只能處理一個任務
多道程序設計:計算機內(nèi)存中可以存放多個程序,多道程序在計算機的管理程序下互相穿插運行
五大功能
進程管理(進程管理之進程實體,進程管理之五狀態(tài)模型,進程管理之進程同步,Linux的進程管理)
存儲管理(內(nèi)存的分配與回收,段夜式存儲管理,虛擬內(nèi)存,Linux的存儲管理)
作業(yè)管理(進程調(diào)度,死鎖)
文件管理(操作系統(tǒng)的文件管理,Linux的文件系統(tǒng),Linux的文件的基本操作)
設備管理
操作系統(tǒng)概覽
what & why
操作系統(tǒng)是管理硬件和軟件資源的計算機程序。
管理配置內(nèi)存,決定供需順序,控制輸入輸出設備。
操作系統(tǒng)提供讓用戶和系統(tǒng)交互的的操作界面。
在不同的設備上,操作系統(tǒng)可以向用戶呈現(xiàn)不同的狀態(tài)。
管理硬件,提供用戶交互軟件的系統(tǒng)
我們不能直接操作硬件
提供了統(tǒng)一的操作界面
操作系統(tǒng)也使更多人使用了計算機
操作系統(tǒng)的基本功能
處理器資源
存儲器資源
IO設備資源
文件資源
用戶無需面向硬件接口編程
IO設備管理軟件,提供讀寫文件接口
文件管理軟件,提供文件接口
操作系統(tǒng)實現(xiàn)了對計算機資源的抽象
操作系統(tǒng)提供了用戶與計算機之間的接口
操作系統(tǒng)的基本功能
圖像窗口形式
命令形式
系統(tǒng)調(diào)用形式
操作系統(tǒng)的相關概念
并發(fā)性
多道程序概念是并發(fā)的基礎
共享性
多個程序可以同時使用主存資源
共享根據(jù)屬性可分為兩種方式:互斥共享形式,同時訪問形式
當A占用資源,等釋放了之后才能使用
同時是宏觀的,看上去是同時訪問
短時間看還是互斥的
虛擬性
虛擬性表現(xiàn)為把一個物理實體轉(zhuǎn)變?yōu)槿舾蓚€邏輯實體
物理實體是真實存在的,邏輯實體是虛擬的
虛擬的技術主要有時分復用技術,空分復用技術
時分復用技術:資源在時間上進行復用,不同程序并發(fā)使用
多道程序分時使用計算機資源
時分復用技術
空分復用技術
空分復用技術用來實現(xiàn)虛擬磁盤,虛擬內(nèi)存等
提高資源利用率,提升編程效率
虛擬磁盤技術
物理磁盤虛擬為邏輯磁盤C,D,E等邏輯盤
使用起來更加方便
虛擬內(nèi)存技術
在邏輯上擴大程序的存儲容量
使用比實際內(nèi)存更大的容量
大大提升編程效率
異步性
在多道程序下面允許多個程序并發(fā)執(zhí)行
進程在使用資源時可能等待或放棄
進程執(zhí)行不是一氣呵成,是走走停停的
進程管理之進程實體
為什么需要進程
進程是系統(tǒng)進行資源分配和調(diào)度的基本單位
進程作為獨立運行的載體保障程序的正常運行
進程的存在使操作系統(tǒng)資源利用率大大提升
進程實體
主存中的進程形態(tài):標識符,狀態(tài),優(yōu)先級,程序計數(shù)器,內(nèi)存指針,上下文數(shù)據(jù),IO狀態(tài)信息,記賬信息
標識符:標識唯一的進程(進程ID)
狀態(tài):標記進程的狀態(tài)(運行態(tài),阻塞態(tài))
程序計數(shù)器:進程即將被執(zhí)行的下一條指令的地址
內(nèi)存指針:程序代碼,進程數(shù)據(jù)相關的指針
上下文數(shù)據(jù):進程執(zhí)行時處理器存儲的數(shù)據(jù)(寄存器,cache)
IO狀態(tài)信息:被進程IO操作所占用的文件列表
記賬信息:使用處理器時間,時鐘總和等
總結起來:進程的標識符,處理機的狀態(tài),進程調(diào)度信息,進程控制信息
進程控制塊
用于描述和控制進程運行的通用數(shù)據(jù)結構(每個進程都有PCB進程控制塊)
記錄進程當前狀態(tài)和控制進程運行的全部信息
PCB的使得進程能夠獨立運行的基本單位
PCB是操作系統(tǒng)進行調(diào)度經(jīng)常會被讀取到的信息
PCB是常駐內(nèi)存的,存放在系統(tǒng)專門開辟的PCB區(qū)域內(nèi)
操作系統(tǒng)對進程的調(diào)度其實是對線程的調(diào)度
進程:資源分配的基本單位,獨立調(diào)度的基本單位,進程系統(tǒng)開銷大,進程IPC
線程:不擁有資源,獨立調(diào)度的最小單位,線程系統(tǒng)開銷小,讀寫同一進程數(shù)據(jù)通信
進程管理之無狀態(tài)模型
創(chuàng)建 就緒 終止 阻塞 執(zhí)行
當進程被分配到除CPU以外所必要的資源后
只要再獲得CPU的使用權,就可以立即運行
其他資源都準備好,只差CPU資源的狀態(tài)就為就緒狀態(tài)
就緒進程就會排成就緒隊列
進程獲得CPU,其程序正在執(zhí)行成為執(zhí)行狀態(tài)
在單核處理器時,在某個時刻只能有一個進程處于執(zhí)行狀態(tài)
進程的阻塞狀態(tài)
進程因某種原因:其他設備為準備就緒而無法繼續(xù)執(zhí)行,從而CPU放棄的狀態(tài)為阻塞狀態(tài)
阻塞隊列:存放阻塞的進程
創(chuàng)建狀態(tài):分配PCB,插入就緒隊列
創(chuàng)建進程時擁有PCB但其他資源尚未就緒的狀態(tài)為創(chuàng)建狀態(tài)
操作系統(tǒng)提供fork函數(shù)接口創(chuàng)建進程
系統(tǒng)清理,PCB歸還
進程結束由系統(tǒng)清理或者歸還PCB的狀態(tài)稱為終止狀態(tài)
進程管理之進程同步
進程間同步:
為什么需要進程間同步
進程間同步的原則
線程同步
生產(chǎn)者消費者問題
進程的同步:
空閑等待
忙則等待
有限等待
讓權等待
進程間同步的方法:
消息隊列
共享存儲
信號量
進程間同步:
互斥量
讀寫鎖
自旋鎖
條件變量
Linux分為前臺進程,后臺進程,守護進程
占用終端:前臺進程
沒有占用終端,不和用戶進行交互 & 符號結束就可以
可以將內(nèi)容重定向到文件里面
linux中以d結尾的一般為守護進程(sshd,httpd,mysqld)
linux中進程的狀態(tài)
R:運行狀態(tài)
S:睡眠狀態(tài)
D:IO等待狀態(tài)
T:暫停狀態(tài)
Z:退出狀態(tài)(僵尸進程)
作業(yè)管理之進程調(diào)度
進程調(diào)度的概述
進程調(diào)度是值計算機通過決策決定哪個就緒程序可以獲得CPU使用權(多道程序設計)
保存舊進程的運行信息,請出舊進程
選擇新進程,準備運行換將并分配CPU
進程的調(diào)度
就緒隊列的排隊機制
為了提高進程調(diào)度的效率(排隊)
選擇運行進程的委派機制
調(diào)度進程按照一定的策略選擇就緒進程,將CPU資源分配給它
新老進程的上下文切換機制
進程的調(diào)度
搶占式,非搶占式
搶占式切換頻繁,開銷大,相對公平
非搶占式切換次數(shù)少,開銷小,不公平
進程調(diào)度的算法
先來先服務
短進程優(yōu)先調(diào)度算法
高優(yōu)先權優(yōu)先調(diào)度算法(前臺進程的優(yōu)先級會高于后臺進程)
時間片輪轉(zhuǎn)算法
作業(yè)管理之死鎖
死鎖的產(chǎn)生:競爭資源,進程調(diào)度順序不當
競爭資源不夠共享資源的數(shù)量不滿足各個進程的需求
會因為共享資源的競爭造成死鎖
死鎖的必要條件
互斥條件
請求保持條件(可以一次性申請所有需要的資源)
不可剝奪條件(當一個進程請求新的資源得不到滿足,必須釋放資源)
環(huán)路等待條件(按照線性排序,申請必須按照需要遞增申請,按照順序申請)
銀行家算法
客戶申請貸款有限,每次申請需要聲明最大的資金量
銀行家能在滿足貸款時,都應該給用戶貸款
客戶在使用貸款后,能夠及時歸還
存儲管理之內(nèi)存分配與回收
單一連續(xù)分配的方法(只能在單用戶,單進程的操作系統(tǒng)中使用)
固定分區(qū)分配方法
固定分區(qū)分配支持多道程序最簡單的存儲分配方式
內(nèi)存空間被劃分為若干固定大小的區(qū)域
每個分區(qū)只提供給一個程序使用,互不干擾
動態(tài)分區(qū)分配
內(nèi)存分配的過程
首次適應算法(FF算法)(循環(huán)適應算法)
分配內(nèi)存是從開始順序查找適合內(nèi)存區(qū)(鏈表),遍歷鏈表若沒有合適的空閑區(qū),則該次分配失敗
最佳適應算法(BF算法)
按照內(nèi)存大小進行排序(避免一些大材小用的情況)
快速適應算法(QF算法)
操作系統(tǒng)如何管理進程的空間
頁式存儲管理
段式存儲管理
段頁式存儲管理
存儲管理之虛擬內(nèi)存
虛擬內(nèi)存概述
有些進程實際需要內(nèi)存很大,超過物理內(nèi)存的容量
多道程序設計,使得每個程序可用的物理內(nèi)存更加稀缺
不可能無線增加物理內(nèi)存,物理內(nèi)存總有不夠的時候
把程序的內(nèi)存劃分,將暫時不使用的內(nèi)存放在輔存中
程序的局部性原理
CPU訪問存儲器時,無論是存儲指令還是存取數(shù)據(jù),所訪問的存儲單元都趨于聚集在一個較小的連續(xù)趨于中
程序運行時,無需全部轉(zhuǎn)載至內(nèi)存,裝載部分即可
從用戶層面來看,程序擁有很大的空間(虛擬內(nèi)存
)
虛擬內(nèi)存的置換算法
先入先出
最不經(jīng)常使用算法
最近最少使用的算法
主存頁面替換的時機:當主存缺頁的時候就會進行替換
虛擬內(nèi)存的置換算法
替換策略發(fā)生在cache-主存層次,主存-輔存層次
cache-主存層次的替換策略主要是為了解決速度問題
主存-輔存層次主要是為了解決容量問題
linux的存儲管理
buddy內(nèi)存管理算法
buddy算法是經(jīng)典的內(nèi)存管理算法
算法基于計算機處理二進制的優(yōu)勢具有極高的效率
算法主要為了解決內(nèi)存碎片的問題
內(nèi)存頁內(nèi)碎片,內(nèi)存頁外碎片
頁內(nèi)碎片:已經(jīng)被分出去不能再利用了
頁外碎片:沒有被分出去也不能被利用了
向上取整2的冪大小
伙伴系統(tǒng)buddy
回收分配的內(nèi)存,找伙伴內(nèi)存。
buddy算法是經(jīng)典的內(nèi)存管理算法
算法基于計算機處理二進制的具有極高的效率
算法主要為了解決內(nèi)存外碎片的問題
將內(nèi)存外碎片問題轉(zhuǎn)化為內(nèi)存內(nèi)碎片問題
linux交換空間
swap(交換空間)是磁盤的一個分區(qū)
linux物理內(nèi)存滿時,會把一些內(nèi)存交換swap空間
linux中輸入 top命令
是冷啟動的依賴,啟動需要大量的內(nèi)存,將不怎么使用的內(nèi)存交換到物理內(nèi)存中
系統(tǒng)睡眠依賴
大進程空間依賴
swap空間 VS 虛擬內(nèi)存
操作系統(tǒng)的文件管理
文件的邏輯結構
輔存的存儲空間分配(磁盤)
目錄管理
邏輯結構文件的類型
有結構文件(文本文件,文檔,媒體文件)
無結構文件(二進制文件,鏈接庫)
文件的邏輯結構
文件內(nèi)容由定長記錄和可變長記錄組成
定長記錄存儲文件格式,文件描述等結構化數(shù)據(jù)項
可變長記錄存儲文件的具體內(nèi)容
無結構文件
也成流式文件
文件內(nèi)容長度以字節(jié)為單位
例:EXE文件 dll文件 so文件
順序文件
順序文件是按照順序存放在介質(zhì)中的文件
磁帶的存儲特性使得磁帶文件只能順序存儲文件
順序文件是所有邏輯文件中存儲效率最高的
但是對順序文件的增刪改查效率比較低
為了解決此問題引出了索引文件
有一張索引表
輔存的存儲空間分配
鏈接分配可以將文件存儲在離散的盤塊中
需要額外的存儲空間存儲文件盤塊的鏈接順序
FAT表:FAT文件系統(tǒng) 類似于路由表
讀取文件需要將整個文件加載到內(nèi)存然后進行檢索
索引分配
把文件的所有盤塊集中存儲(索引)
讀取某個文件時,將文件索引讀取進內(nèi)存即可
輔存的存儲空間分配
主存和輔存都用了空閑表和空閑鏈表
將所有空閑的盤塊存在一個鏈表
每個鏈表節(jié)點存儲空閑盤塊和空閑數(shù)目
重點:位示圖
位示圖的優(yōu)點:
維護成本低
位示圖可以非常容易找到空閑盤塊
位置圖使用0/1比特位,占用空間小
進階補充
生產(chǎn)者,消費者模型/哲學家進餐問題
保護臨界資源,進行通信
線程間同步:互斥量,讀寫鎖,自旋鎖,條件變量
進程間同步:共享內(nèi)存,域套接字
用戶態(tài)與內(nèi)核態(tài)
上下文切換
協(xié)程
編寫性能良好的程序指南
線程同步之互斥量
兩個線程爭搶共享資源,互斥使用。
原子性,一系列操作不可中斷的特性
互斥量又稱互斥鎖(解鎖和加鎖)
互斥量是最簡單的線程同步的方法
兩個狀態(tài)可以保證訪問資源的串行
操作系統(tǒng)直接提供了互斥量的API
開發(fā)者可以直接使用API完成資源的加鎖解鎖的操作
自旋鎖
自旋鎖的模型和互斥鎖模型一樣
自旋鎖也是一種多線程同步的變量
使用自旋鎖的線程會反復檢查鎖變量是否可用
自旋鎖不會讓出CPU
自己死循環(huán)等待鎖的釋放
自旋鎖避免了進程或線程的上下文(因為是自己死循環(huán))的開銷
操作系統(tǒng)內(nèi)部很多地方使用自旋鎖
自旋鎖不適合在單核CPU使用(因為死循環(huán))
讀寫鎖
對互斥資源和自旋鎖的改良
當臨界資源(數(shù)據(jù)庫),是一種特殊的自旋鎖
臨界資源多讀少寫
不會改變臨界資源
讀和寫互斥,讀和讀不互斥
線程同步之條件變量
緩沖區(qū)沒有數(shù)據(jù)時,消費者不許消費,必須等待
緩沖區(qū)滿了時,不允許生產(chǎn)者往緩沖區(qū)生產(chǎn),生產(chǎn)者必須等待
可以更加嚴謹?shù)募s束
條件變量也提供了API
條件變量是一種相對復雜的線程同步方法
條件變量允許線程睡眠,直到滿足某種條件
當滿足條件時,生產(chǎn)者可以向該線程(消費者)發(fā)信號,通知喚醒
線程同步方法總結
互斥量 自旋鎖 讀寫鎖
先加鎖,使用臨界資源,后解鎖
加鎖后其他不能訪問臨界資源
解鎖后,其他消費者才能訪問臨界資源
使用fork系統(tǒng)調(diào)用創(chuàng)建進程
c語言的系統(tǒng)調(diào)用
fork創(chuàng)建的進程初始化狀態(tài)與父進程一樣
父進程調(diào)用時子進程也會調(diào)用,fork函數(shù)會返回兩次
用fork可以創(chuàng)建一個新的進程
所有語言底層創(chuàng)建進程都是fork系統(tǒng)調(diào)用的
進程同步之共享內(nèi)存
多進程共享物理內(nèi)存的
由于操作系統(tǒng)的進程管理,進程間的內(nèi)存空間是相互獨立的
進程空間通過頁表映射到共享內(nèi)存的一片分區(qū)中去
共享存儲允許不相關的進程訪問同一片物理內(nèi)存(原理:將物理內(nèi)存映射到進程的頁表里面去,使得進程通過頁表訪問內(nèi)存)
共享內(nèi)存是兩個進程之間共享和傳遞數(shù)據(jù)最快的方式
后臺很多高性能服務都是通過共享內(nèi)存實現(xiàn)
缺點:共享內(nèi)存未提供同步機制,需要借助其他機制管理訪問,以避免并發(fā)訪問帶來的問題
使用共享內(nèi)存的四個步驟
向操作系統(tǒng)申請共享內(nèi)存-----連接到進程空間------使用共享內(nèi)存------脫離進程空間(刪除)
client 共享內(nèi)存 server
共享內(nèi)存是傳遞數(shù)據(jù)最快的方式
Unix域套接字
客戶端創(chuàng)建套接字,綁定套接字,監(jiān)聽套接字,接受處理信息
創(chuàng)建套接字,鏈接套接字,發(fā)送信息
進程同步之UNIX域套接字
提供了單機簡單可靠的進程同步服務
只能在單機使用,不能跨機器使用
雙向鏈表實現(xiàn)原理
往頭部加入節(jié)點
往頭部插入節(jié)點:將新的節(jié)點指向第一個節(jié)點,將第一個節(jié)點的上一個指向前一個節(jié)點,將頭部指針指向新的節(jié)點
# 實現(xiàn)鏈表節(jié)點
class Node:
def __init__(self,key,value):
self.key = key
self.value = value
self.prev = None
self.next = None
def __str__(self):
val = {{}: {}}.format(self.key,self.value)
return val
def __repr__(self):
val = {{}: {}}.format(self.key,self.value)
return val
# 雙向鏈表實現(xiàn)head指針 tail指針 鏈表的容量
class DoubleLinkList:
def __init__(self, cap = 0xffff):
self.cap = cap
self.head = None
self.tail = None
self.size = 0 # 當前鏈表存儲了多少個節(jié)點
# 從頭部添加
def __add_head(self,node):
if not self.head:
self.head = node
self.tail = node
self.head.next = None
self.tail.next = None
else:
node.next = self.head
self.head.prev = node
self.head = node
self.head.prev = None
self.size += 1
return node
# 從尾部添加
def __add_prev(self,node):
if not self.tail:
self.head = node
self.tail = node
self.head.next = None
self.tail.next = None
else:
self.prev.next = node
node.prev = self.tail
self.tail = node
self.tail.next = None
self.size += 1
return node
# 刪除任意節(jié)點
def __del_node(self,node):
if not node:
node = self.tail
if node == self.tail:
pass
elif node == self.head:
pass
else:
node.prev.next = node.next
node.next.prev = node.prev
self.size -= 1
return node
# 彈出頭部節(jié)點
def __del_head(self):
pass
# 彈出尾部節(jié)點
def __del_prev(self):
pass