併發編程總結

1,簡述計算機操做系統的中斷的做用python

中斷請求,中斷響應,中斷處理,中斷返回linux

中斷是指在計算機執行期間,系統內發生任何非尋常的或非預期的急需處理事件,
使得cpu暫時中斷當前正在執行的程序,轉去執行相應的事件處理程序。待處理完畢
後又返回原來被中斷處繼續執行或調度新的進程執行的過程。它使計算機能夠更好更
快利用有限的系統資源解決系統響應速度和運行效率的一種控制技術。實時響應,系統調度。web

2,簡述計算機內存的「內核態」和「用戶態」
內核態:cpu能夠訪問內存的全部數據,包括外圍設備,
用戶態:只能受限的訪問內存,且不容許訪問外圍設備,
佔用cpu的能力被剝奪,cpu資源能夠被其餘程序獲取windows

3,爲何要有內核態和用戶態?
因爲須要限制不一樣的程序之間的訪問能力,防止他們獲取別的程序的內存數據,
或者獲取外圍設備的數據,併發送到網絡網絡

cpu劃分出兩個權限等級:用戶態和內核態。
多線程

4,什麼是進程?
正在執行的一個程序或者說一個任務,負責執行任務的是cpu。
進程是用來把資源集中到一塊兒的,進程是資源單位,或者說資源集合。併發


5,什麼是線程?異步

線程是cpu上的執行單位。同一個進程內的多個線程共享該進程內的地址資源。
建立線程的開銷要遠小於建立進程的開銷。
線程是操做系統可以進行運算調度的最小單位。
它被包含在進程之中,是進程中的實際運做單位。
一條線程指的是進程中一個單一順序的控制流,一個進程中能夠併發多個線程,
每條線程並行執行不一樣的任務socket


6,什麼是系統調用?
全部用戶程序都是運行在用戶態的,可是有時候程序確實須要作一些內核態的事情,
例如從硬盤讀取數據,或者從鍵盤獲取輸入等,
而惟一能作這些事情的就是操做系統,因此此時程序就須要向操做系統請求以程序
的名義來執行這些操做。這時,就須要一個機制:用戶態程序切換到內核態,可是不能
控制在內核態中執行的指令。這種機制就叫系統調用。async


7,threading模塊event和condition的區別;
condition: 某些事件觸發或達到特定的條件後才處理數據,默認建立了一個lock對象。
con = threading.Condition()
con.acquire()
con.release()


event:其餘線程須要經過判斷某個線程的狀態來肯定本身的下一步操做,就能夠用event。
from threading import Event
event = Event()
event.set(): 設置event的狀態值爲True,全部阻塞池的線程激活進入就緒狀態, 等待操做系統調度;
event.is_set():返回event的狀態值;
event.wait():若是 event.is_set()==False將阻塞線程;
event.clear():恢復event的狀態值爲False。


8,進程間通訊方式有哪些?
消息隊列 管道 信號量 信號 共享內存 套接字

9,簡述對管道,隊列的理解
隊列 = 管道 + 鎖
from multiprocessing import Queue,Process
queue = Queue()
queue.put(url)
url = queue.get()
from multiprocessing import Pipe,Process
pipe = Pipe()
pipe.send(url)
pipe.recv()


10,請簡述你對join、daemon方法的理解,舉出它們在生產環境中的使用場景;
join: 等待一個任務執行完畢;能夠將併發變成串行。

daemon:
守護進程(守護線程)會等待主進程(主線程)運行完畢後被銷燬。
運行完畢:
1.對主進程來講,運行完畢指的是主進程代碼運行完畢。
2.對主線程來講,運行完畢指的是主線程所在的進程內全部非守護線程通通運行完畢,主線程纔算運行完畢。


11,簡述IO多路複用模型的工做原理
IO多路複用實際上就是用select,poll,epoll監聽多個io對象,當io對象有
變化(有數據)的時候就通知用戶進程。好處就是單個進程能夠處理多個socket。

1.當用戶進程調用了select,那麼整個進程會被block;

2.而同時,kernel會「監視」全部select負責的socket;

3.當任何一個socket中的數據準備好了,select就會返回;

4.這個時候用戶進程再調用read操做,將數據從kernel拷貝到用戶進程。

總結:
1.I/O 多路複用的特色是經過一種機制一個進程能同時等待多個文件描述符,
而這些文件描述符(套接字描述符)其中的任意一個進入讀就緒狀態,
select()函數就能夠返回。
2.IO多路複用:須要兩個系統調用,system call (select 和 recvfrom),
而blocking IO只調用了一個system call (recvfrom)。可是,用select的優點
在於它能夠同時處理多個connection。
3.若是處理的鏈接數不是很高的話,使用select/epoll的web server不必定
比使用多線程 + 阻塞 IO的web server性能更好,可能延遲還更大。
4.select/epoll的優點並非對於單個鏈接能處理得更快,而是在於能處理更多的鏈接。


12,threading中Lock和RLock的相同點和不一樣點
Lock():互斥鎖,只能被acquire一次,可能會發生死鎖狀況。
RLock():遞歸鎖,能夠連續acquire屢次。
RLock = Lock + counter
counter:記錄了acquire的次數,直到一個線程全部的acquire都被release,其餘線程才能得到資源。

1三、什麼是select,請簡述它的工做原理,簡述它的優缺點;
python中的select模塊專一於I/O多路複用,提供了select poll epoll三個方法;後兩個在linux中可用,

優勢:使用select() 的事件驅動模型只用單線程(進程)執行,佔用資源少,
不消耗太多 CPU,同時可以爲多客戶端提供服務。

缺點:一、當文件描述符過多時,文件描述符在用戶空間與內核空間進行copy會很費時
二、當文件描述符過多時,內核對文件描述符的遍歷也很浪費時間
三、select最大僅僅支持1024個文件描述符


1四、什麼是epoll,請簡述它的工做原理,簡述它的優缺點;
epoll: 性能最好的多路複用I/O就緒通知方法。相比於select,epoll最大的
好處在於它不會隨着監聽fd數目的增加而下降效率。


1五、簡述select和epoll的區別;
select 是不斷輪詢去監聽的socket,socket個數有限制,通常爲1024個;
poll仍是採用輪詢方式去監聽,只不過沒有個數限制。
epoll並不用採用輪詢方式去監聽,而是當socket有變化時經過回調方式主動告知用戶進程。
select支持多平臺,epoll只支持linux平臺。


1六、簡述多線程和多進程的使用場景;
多進程用於計算密集型,如金融分析;利用多核實現併發。
多線程用於IO密集型,如socket,爬蟲,web。

17,請分別簡述threading.Condition、threading.event、threading.semaphore的使用場景;
condition: 某些事件觸發或達到特定的條件後才處理數據。
event: 用來通知線程有一些事情已發生,從而啓動後繼任務的開始。
semaphore: 爲控制一個具備有限數量用戶資源而設計。

1八、假設有一個名爲threading_test.py的程序裏有一個li = [1, 2, 3, 4]的列表,
另有a,b兩個函數分別往該列表中增長元素,
a函數須要修改li以前須要得到threading.Lock對象,b函數不須要,
請問當線程t1執行a函數獲取到Lock對象以後並無release該對象的狀況下,
線程t2執行b函是否能夠修改li,爲何?

能夠,線程的數據是共享的,a 函數雖然上了鎖,沒有釋放。因爲b 函數不須要上鎖,就能夠訪問資源。


1九、簡述你對Python GIL的理解;
GIL(global interpreter lock)全局解釋器鎖
GIL是CPython的一個概念,本質是一把互斥鎖,將併發運行變成串行。
解釋器的代碼是全部線程共享的,因此垃圾回收線程也有可能訪問到解釋器的代碼去執行。
所以須要有GIL鎖,保證python解釋器同一時間只能執行一個任務的代碼。

GIL:解釋器級別的鎖(保護的是解釋器級別的數據,好比垃圾回收的數據)
Lock:應用程序的鎖(保護用戶本身開發的應用程序的數據)


20、什麼是同步I/O,什麼是異步I/O?
同步I/O:作」IO operation」的時候會將process阻塞;阻塞IO,非阻塞IO,IO多路複用都屬於同步IO
異步I/O:當進程發起IO 操做以後,就直接返回不再理睬了,直到kernel發送一個信號,告訴進程說IO完成。


21,什麼是管道,若是兩個進程嘗試從管道的同一端讀寫數據,會出現什麼狀況?
管道:是兩個進程間進行單向通訊的機制。因爲管道傳遞數據的單向性。管道又稱爲半雙工管道。

管道傳遞數據是單向性的,讀數據時,寫入管道應關閉。寫數據時,讀取管道應關閉。


22,爲何要使用線程池/進程池?
對服務端開啓的進程數或線程數加以控制,讓機器在一個本身能夠承受的範圍內運行,這就是進程池或線程池的用途.


23,若是多個線程都在等待同一個鎖被釋放,請問當該鎖對象被釋放的時候,哪個線程將會得到該鎖對象?
這個由操做系統的調度決定。

24,import threading;s = threading.Semaphore(value=-1)會出現什麼狀況?
當threading.Semaphore(1) 爲1時,表示只有一個線程可以拿到許可,
其餘線程都處於阻塞狀態,直到該線程釋放爲止。

固然信號量不可能永久的阻塞在那裏。信號量也提供了超時處理機制。
若是傳入了 -1,則表示無限期的等待。

26,某進程在運行過程當中須要等待從磁盤上讀入數據,此時該進程的狀態將發生什麼變化?
一個程序有三種狀態:運行態,阻塞態,就緒態;
遇到IO阻塞,進程從運行態轉到阻塞態,cpu切走,保存當前狀態;

27,請問selectors模塊中DefaultSelector類的做用是什麼;
IO多路複用:select poll epoll
select: 列表循環,效率低。windows 支持。
poll: 可接收的列表數據多,效率也不高。linux 支持。
epoll: 效率最高 異步操做 + 回調函數。linux 支持。

selectors 模塊:
sel=selectors.DefaultSelector()
自動根據操做系統選擇select/poll/epoll

28,簡述異步I/O的原理;
用戶進程發起read操做以後,馬上就能夠開始去作其它的事。
而另外一方面,從kernel的角度,當它受到一個asynchronous read以後,
首先它會馬上返回,因此不會對用戶進程產生任何block。
而後,kernel會等待數據準備完成,而後將數據拷貝到用戶內存,
當這一切都完成以後,kernel會給用戶進程發送一個signal,告訴它read操做完成了。

29,請問multiprocessing模塊中的Value、Array類的做用是什麼?舉例說明它們的使用場景
python 多進程通訊Queue Pipe Value Array
queue和pipe用來在進程間傳遞消息;
Value + Array 是python中共享內存映射文件的方法;速度比較快.

30,請問multiprocessing模塊中的Manager類的做用是什麼?與Value和Array類相比,Manager的優缺點是什麼
Python multiprocessing.Manager(進程間共享數據)

Python中進程間共享數據,除了基本的queue,pipe和value+array外,
還提供了更高層次的封裝。使用multiprocessing.Manager能夠簡單地使用這些高級接口。

Manager支持的類型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,
Event,Queue,Value和Array。


31,請說說你對multiprocessing模塊中的Queue().put(), Queue().put_nowait(), Queue().get(), Queue().get_nowait()的理解;
q = Queue(3) 隊列 先進先出 進程間通訊; 隊列 = 管道 + 鎖
q.put()
q.put_nowait() # 無阻塞,當隊列滿時,直接拋出異常queue.Full
q.get()
q.get_nowait() # 無阻塞,當隊列爲空時,直接拋出異常queue.Empty

32,什麼是協程?使用協程與使用線程的區別是什麼?協程:單線程下的併發。協程是一種用戶態的輕量級線程,即協程是由用戶程序本身控制調度的。 1.python的線程是屬於內核級別的,即由操做系統控制調度(如單線程遇到io或執行時間過長就會被迫交出cpu執行權限,切換其餘的線程運行) 2.單線程內開啓協程,一旦遇到io,就會從應用程序級別(而非操做系統)控制切換,以此來提高效率(!!非io操做的切換與效率無關)

相關文章
相關標籤/搜索