根本區別:程序是作業系統資源分配的基本單位(資源和cpu),而執行緒是任務排程和執行的基本單位(cpu)
程序的三種基本狀態
建立狀態:建立申請空白的pcb中填寫控制和管理資訊1、就緒狀態:除了cpu其他資源都有獲取
2、執行狀態:已經獲取了cpu正在執行
3、阻塞狀態:i/
0 或者申請快取失敗了,暫時無法進行,會引起程序的排程,處理機會分配給其他就緒的程序,讓受阻的程序處於暫停狀態
阻塞佇列:是指由執行狀態轉化為 當程序由於等待i/o操作或程序同步等條件而暫停執行時阻塞
終止狀態:正常,非正常結束,pcb還給系統
掛起:因為記憶體資源不夠的時候,有一部分將會轉化到外存中僵死態:程序終止執行,釋放大部分資源
掛起態:記憶體不夠被阻塞後被分配到外存中,等收到訊號再從外存快取到記憶體重新進入就緒狀態 分配了cpu就可以執行了
使用者程序
如果程序是多執行緒的,那麼核心是不能控制多執行緒的,多執行緒相對核心是不可見的,需要程式設計師自己設計阻塞處理
核心程序
發生阻塞系統自己會處理
程序 = 程式+pcbpcb是程序的標誌
建立程序時候建立pcb銷毀程序時候銷毀pcb
程式是靜態的= **+資料
程序控制塊裡面包含了很多的資訊
程序控制實際就是對程序生命週期中的幾種狀態的控制程序狀態 :三狀態 就緒 執行 阻塞
排程資訊:根據排程演算法分配cpu覺得執行順序
標示符:父程序,子程序
內部程序間的通訊:
連線資訊
時間和計時器
檔案系統
虛擬記憶體資訊
處理器資訊
執行緒是對cpu排程的最小單元
乙個程序的多個執行緒共享cpu產生併發
多個程序之間也會競爭cpu及資源 也就會產生併發
根據以下引數進行控制典型的四個控制行為:
建立程序
阻塞程序
撤銷程序
喚醒程序
程序的建立的過程程序標示:程序的id
程序的優先順序
程序起始位址
cpu初始狀態
資源清單
程序之間應該保證原子性 保證資料的安全
windows 啟動乙個exe檔案實際就是建立乙個新程序的過程,同乙個exe檔案開啟兩個視窗:建立了兩個執行緒
linux 呼叫fork函式啟動程序 fork有父子程序之分
執行緒是由cpu直接執行的實體1、先來先服務排程演算法(fcfs):超市購物排隊
從就緒佇列中選擇最先進入該佇列中的的程序。屬於不可剝奪演算法,當長任務先到達系統,就會使得後面的許多短作業等待更長的時間。 效率不高
2、短作業優先排程演算法(sjf)
:超市購物購物少的可以插隊,由於排程程式總是排程那些短作業,將導致長作業長期不被排程(飢餓現象) 效率不高
3、優先順序排程演算法:該演算法可以用作作業排程也可以用作程序排程。
非剝奪式優先順序排程演算法:讓處理機中的程序結束之後再分配給優先順序更高的程序。
剝奪式優先順序排程演算法:當乙個演算法在處理機執行時,若有某個更重要或緊張的程序進入就緒佇列是,則立即暫停正在執行的程序,將處理機分配給更重要或更緊迫的程序。
靜態優先順序:建立程序時確定,不可更改。
動態優先順序:根據情況的變動調整優先順序,動態調整優先順序的主要是程序占用cpu時間的長短,就緒程序等待 cpu時間的長短。
4、高響應比優先排程演算法:是fcfs排程和sjf排程的綜合,考慮每個作業的等待時間和估計的執行時間。
響應比=(等待時間+要求服務時間)/要求服務時間
作業的響應比可以隨等待時間的增加而提高,當等待時間足夠長時,其響應比提高,避免了長作業的飢4餓現象。
5、時間片輪轉排程演算法:主要用於分時系統,程序排程總是選擇就緒佇列中的第乙個程序執行。
6、多級反饋佇列排程演算法:時間片輪轉排程演算法和優先順序排程演算法的綜合。
分時系統中,相應時間跟時間片和使用者數成正比。
中斷向量本身是用於存放中斷服務例行程式的入口位址,那麼中斷向量位址就應該是該入口位址的位址。
乙個程序多執行緒
多執行緒共享cpu實現併發執行
單執行緒程式:只有乙個主線程
多執行緒程式:除了主線程之外還有其他的使用者執行緒
2、windows複製貼上的過程中 可以取消操作 乙個執行緒複製,乙個執行緒控制取消的操作的窗**互,否則會出現無響應狀態
臨界區就是加鎖的塊 加鎖的塊越小越好
臨界區四原則:
忙則等待
空閒讓進
有限等待
讓權等待:主動放棄cpu,讓其他的程序有機會得到cpu
訊號燈概念 就像交通等一樣相當於立乙個flag =
true
鎖s=1;開鎖 開完鎖 s =1-
1=0;其他臨界區獲取到cpu資源之後 會得到s=
0(上鎖),當獲得鎖的執行緒完成或(會出現阻塞嗎?)之後s=0+
1;其他的執行緒獲得 s=
1開鎖--
--
訊號燈的結構:
(s,q)
s:初始的值為非負數的 減1之後還是為正:則:
q:pcb佇列 初始值為空值
相當於結構體中的兩個成員變數
需要合理的設定s的值p操作(函式或過程 p(s,q)
q操作(函式或過程 v(s,q)
passeren 通過 vijgevens 釋放
s操作: s-
1>=
0則 通過程序繼續 初始s值設定比較重要
s-1<
0,該程序進入阻塞 加入到 q佇列中 轉為排程函式管理
v操作: s = s+
1>
0繼續執行緒,<=
0 繼續在q佇列中喚醒乙個程序
如:設定s的初始的值為1
生產者消費者int main()pa(
)pb()
pc()
不能向空的緩衝區中獲取資料
不能向滿的緩衝區新增資料
每個時刻允許乙個生產者或者消費者存或者取元素
相當於需要兩個訊號等 乙個指示同步鎖 乙個指示緩衝區中的容量變化
程序和執行緒的主要區別
根本區別 程序是作業系統資源分配的基本單位,而執行緒是任務排程和執行的基本單位 在開銷方面 每個程序都有獨立的 和資料空間,程式之間的切換會有較大的開銷 執行緒可以看作輕量級的程序,同一類執行緒共享 和資料空間,每個執行緒都有自己獨立的執行棧和程式計數器 pc 執行緒之間切換的開銷小。所處環境 在作...
ArrayList,Vector主要區別
vector是執行緒安全的,但是效能比arraylist要低。arraylist,vector主要區別為以下幾點 1 vector是執行緒安全的,原始碼中有很多的synchronized可以看出,而arraylist不是。導致vector效率無法和arraylist相比 2 arraylist和ve...
notify 和notifyAll 主要區別
notify 和notifyall 都是object物件用於通知處在等待該物件的執行緒的方法。void notify 喚醒乙個正在等待該物件的執行緒。void notifyall 喚醒所有正在等待該物件的執行緒。兩者的最大區別在於 notifyall使所有原來在該物件上等待被notify的執行緒統統...