1️⃣ 併發程式設計主要內容:
作業系統工作原理介紹、執行緒、程序演化史、特點、區別、互斥鎖、訊號、事件、join、gil、程序間通訊、管道、佇列。生產者消費者模型、非同步模型、io多路復用模型、
select\poll\epoll 高效能io模型原始碼例項解析、高併發ftp server開發
一、問答題
1、簡述計算機作業系統中的「中斷」的作用?
中斷是指計算機在執行期間,系統內發生任何非尋常或非預期的繼續處理事件,使得cpu暫時中斷當前正在執行的程式,轉而去執行相應的事件處理程式。待處理完畢後又返回原來的被中斷處繼續執行或排程新的程序執行的過程。優點:它使計算機能夠更好更快利用有限的系統資源解決系統響應速度和執行效率的一種控制技術,實時響應,系統排程。
2、簡述計算機記憶體中的「核心態」和「使用者態」?
核心態:cpu可以訪問記憶體的所有資料,包括外圍裝置,例如硬碟,網絡卡等,cpu也可以將自己從乙個程式切換到另乙個程式。使用者態:只能受限的訪問記憶體,且不允許訪問外圍裝置,占用cpu的能力被剝奪,cpu資源被其他程式獲取。
劃分核心態和使用者態的原因:
① 限制不同程式之間的訪問能力,防止他們獲取其他程式的內初步資料,或者獲取外圍裝置,併發送到網路。
② cou劃分兩個許可權等級:核心態和使用者態
3、什麼是程序?
正在執行的乙個程式或者任務,負責執行任務的是cpu。程序是用來把資源集中到一起的,程序是指資源單位,或者資源集合。
4、什麼是執行緒?
執行緒是cpu上的執行單位,同乙個程序內的多個執行緒共享該程序內的位址資源。建立執行緒的開銷要遠小於建立程序的開銷。
5、簡述程式的執行過程
① 啟用python的直譯器,有乙個直譯器級別的垃圾**執行緒(gil鎖);② 乙個程序內的多個執行緒先訪問直譯器的**,多執行緒去搶gil鎖,搶到將程式當作引數傳遞給直譯器去執行;
③ 保護不同的資料應該用不同的鎖。
④ python程式是按照順序執行的;
⑤ 一段python程式以.py檔案執行時,檔案屬性__name__ == __main__ ,作為模組名匯入時,檔案屬性__name__為檔名。
6、什麼是」系統呼叫「?
所有的使用者程式都是執行在使用者態的,但是有時候程式確實需要做一些核心態的事情,例如從硬碟讀取資料,或者從鍵盤獲取輸入等,而唯一能做這些事情的就是作業系統,所以此時程式就需要向作業系統請求以程式的名義來執行這些操作。這時就需要乙個機制:使用者態程式切換到核心態,但是不能控制在核心態中執行的指令,這種機制就叫系統呼叫。
7、threading模組event和condition的區別
關於event:乙個執行緒需要根據另外乙個執行緒的狀態來確定自己的下一步操作,需要呼叫threading庫中event物件;event包含乙個可由執行緒設定的訊號標誌,在初始情況下,event物件的標誌位為假(false);。如果乙個執行緒等待乙個event物件,而這個event物件標誌為假,那麼這個執行緒將會被一直阻塞到標誌為真(true)。
具體引數如下:
from threading import
event
event =event()
event.set()
#設定event的狀態值為true,所有阻塞池的執行緒啟用進入就緒狀態, 等待作業系統排程;
event.is_set() #
返回event的狀態值;
event.wait() #
如果 event.is_set()==false將阻塞執行緒;
event.clear() #
恢復event的狀態值為false
event事件的應用例項:
from threading importthread,event
import
time
defstudent(name):
print('
%s上課了
'%name)
event.wait()
print('
%s下課了
'%name)
defteacher(name,t_course):
print('
%s準備講課了
'%name)
print('
%s開始上課
'%name)
time.sleep(t_course)
event.set()
print('
學生們放學了')
if__name__ == '
__main__':
event =event()
t = thread(target=teacher,args=('
劉老師',10))
s1 = thread(target=student,args=('
jack
',))
s2 = thread(target=student,args=('
alice
',))
s3 = thread(target=student,args=('
france
',))
t.start()
s1.start()
s2.start()
s3.start()
未完待續...
併發程式設計總結
一 併發基礎 1 用synchronized來修飾乙個方法,如同給乙個方法上了一把鎖,當多個執行緒同時訪問這個方法,每個執行緒都要先拿到這個鎖才能執行這個方法,執行完方法之後釋放鎖,其他的執行緒繼續 競爭鎖 來搶鎖,搶到之後執行再釋放,迴圈結束。2 多個執行緒多個鎖,乙個物件有一把鎖,如果想用多個物...
Java併發程式設計實戰 總結
1.可變狀態是至關重要的。所有的併發問題都可以歸結為如何協調對併發狀態的訪問,可變狀態越少,就越容易確保執行緒安全性。2.盡量將域宣告為final型別,除非需要它們是可變的。3.不可變物件一定是執行緒安全的。不可變物件能極大地降低併發程式設計的複雜性。它們更為簡單而且安全,可以任意共享而無須使用加鎖...
併發程式設計的知識總結
對併發領程式設計從全面的去看待,可以抽象成三個核心問題 分工 同步 互斥 分工 分工重要且複雜 同步 乙個執行緒完成任務後,如何通知執行後續任務的執行緒 互斥 同一時刻,只允許乙個執行緒訪問共享變數 併發程式設計有三大問題 可見性 原子性 有序性 可見性產生的原因 計算機記憶體和cup的速度相差很多...