程序和執行緒的主要區別

2021-09-05 11:52:46 字數 3395 閱讀 8965

根本區別:程序是作業系統資源分配的基本單位(資源和cpu),而執行緒是任務排程和執行的基本單位(cpu)
程序的三種基本狀態

1、就緒狀態:除了cpu其他資源都有獲取

2、執行狀態:已經獲取了cpu正在執行

3、阻塞狀態:i/

0 或者申請快取失敗了,暫時無法進行,會引起程序的排程,處理機會分配給其他就緒的程序,讓受阻的程序處於暫停狀態

阻塞佇列:是指由執行狀態轉化為 當程序由於等待i/o操作或程序同步等條件而暫停執行時阻塞

建立狀態:建立申請空白的pcb中填寫控制和管理資訊

終止狀態:正常,非正常結束,pcb還給系統

僵死態:程序終止執行,釋放大部分資源

掛起態:記憶體不夠被阻塞後被分配到外存中,等收到訊號再從外存快取到記憶體重新進入就緒狀態 分配了cpu就可以執行了

掛起:因為記憶體資源不夠的時候,有一部分將會轉化到外存中

使用者程序

如果程序是多執行緒的,那麼核心是不能控制多執行緒的,多執行緒相對核心是不可見的,需要程式設計師自己設計阻塞處理
核心程序

發生阻塞系統自己會處理
pcb是程序的標誌

建立程序時候建立pcb銷毀程序時候銷毀pcb

程序 = 程式+pcb

程式是靜態的= **+資料

程序控制塊裡面包含了很多的資訊

程序狀態 :三狀態 就緒 執行 阻塞

排程資訊:根據排程演算法分配cpu覺得執行順序

標示符:父程序,子程序

內部程序間的通訊:

連線資訊

時間和計時器

檔案系統

虛擬記憶體資訊

處理器資訊

程序控制實際就是對程序生命週期中的幾種狀態的控制

執行緒是對cpu排程的最小單元

乙個程序的多個執行緒共享cpu產生併發

多個程序之間也會競爭cpu及資源 也就會產生併發

典型的四個控制行為:

建立程序

阻塞程序

撤銷程序

喚醒程序

根據以下引數進行控制

程序標示:程序的id

程序的優先順序

程序起始位址

cpu初始狀態

資源清單

程序的建立的過程

程序之間應該保證原子性 保證資料的安全

windows 啟動乙個exe檔案實際就是建立乙個新程序的過程,同乙個exe檔案開啟兩個視窗:建立了兩個執行緒

linux 呼叫fork函式啟動程序 fork有父子程序之分

1、先來先服務排程演算法(fcfs):超市購物排隊

從就緒佇列中選擇最先進入該佇列中的的程序。屬於不可剝奪演算法,當長任務先到達系統,就會使得後面的許多短作業等待更長的時間。 效率不高

2、短作業優先排程演算法(sjf)

:超市購物購物少的可以插隊,由於排程程式總是排程那些短作業,將導致長作業長期不被排程(飢餓現象) 效率不高

3、優先順序排程演算法:該演算法可以用作作業排程也可以用作程序排程。

非剝奪式優先順序排程演算法:讓處理機中的程序結束之後再分配給優先順序更高的程序。

剝奪式優先順序排程演算法:當乙個演算法在處理機執行時,若有某個更重要或緊張的程序進入就緒佇列是,則立即暫停正在執行的程序,將處理機分配給更重要或更緊迫的程序。

靜態優先順序:建立程序時確定,不可更改。

動態優先順序:根據情況的變動調整優先順序,動態調整優先順序的主要是程序占用cpu時間的長短,就緒程序等待 cpu時間的長短。

4、高響應比優先排程演算法:是fcfs排程和sjf排程的綜合,考慮每個作業的等待時間和估計的執行時間。

響應比=(等待時間+要求服務時間)/要求服務時間

作業的響應比可以隨等待時間的增加而提高,當等待時間足夠長時,其響應比提高,避免了長作業的飢4餓現象。

5、時間片輪轉排程演算法:主要用於分時系統,程序排程總是選擇就緒佇列中的第乙個程序執行。

6、多級反饋佇列排程演算法:時間片輪轉排程演算法和優先順序排程演算法的綜合。

分時系統中,相應時間跟時間片和使用者數成正比。

中斷向量本身是用於存放中斷服務例行程式的入口位址,那麼中斷向量位址就應該是該入口位址的位址。

執行緒是由cpu直接執行的實體

乙個程序多執行緒

多執行緒共享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佇列 初始值為空值

相當於結構體中的兩個成員變數

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的值

如:設定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的執行緒統統...