併發編程練習題

##一、簡述計算機操做系統中的「中斷」的做用?html

概念:中斷是指在計算機執行期間,系統內發生任何非尋常的或非預期的急需處理事件,使得CPU暫時中斷當前正在執行的程序而轉去執行相應的時間處理程序。待處理完畢後又返回原來被中斷處繼續執行或調度新的進程執行的過程python

做用:算法

1.CPU與外設同步工做數組

2.實時處理安全

3.故障處理服務器

##二、簡述計算機內存中的「內核態」和「用戶態」;網絡

內核態: CPU能夠訪問內存全部數據, 包括外圍設備, 例如硬盤, 網卡. CPU也能夠將本身從一個程序切換到另外一個程序多線程

用戶態: 只能受限的訪問內存, 且不容許訪問外圍設備. 佔用CPU的能力被剝奪, CPU資源能夠被其餘程序獲取併發

爲何要有用戶態和內核態

因爲須要限制不一樣的程序之間的訪問能力, 防止他們獲取別的程序的內存數據, 或者獲取外圍設備的數據, 併發送到網絡, CPU劃分出兩個權限等級 — 用戶態內核態異步

用戶態與內核態的切換

全部用戶程序都是運行在用戶態的, 可是有時候程序確實須要作一些內核態的事情, 例如從硬盤讀取數據, 或者從鍵盤獲取輸入等. 而惟一能夠作這些事情的就是操做系統, 因此此時程序就須要先操做系統請求以程序的名義來執行這些操做.

這時須要一個這樣的機制: 用戶態程序切換到內核態, 可是不能控制在內核態中執行的指令

這種機制叫系統調用, 在CPU中的實現稱之爲陷阱指令(Trap Instruction)

他們的工做流程以下:

  1. 用戶態程序將一些數據值放在寄存器中, 或者使用參數建立一個堆棧(stack frame), 以此代表須要操做系統提供的服務.
  2. 用戶態程序執行陷阱指令
  3. CPU切換到內核態, 並跳到位於內存指定位置的指令, 這些指令是操做系統的一部分, 他們具備內存保護, 不可被用戶態程序訪問
  4. 這些指令稱之爲陷阱(trap)或者系統調用處理器(system call handler). 他們會讀取程序放入內存的數據參數, 並執行程序請求的服務
  5. 系統調用完成後, 操做系統會重置CPU爲用戶態並返回系統調用的結果

三、進程間通訊方式有哪些?

1)管道

管道分爲有名管道和無名管道

無名管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用.進程的親緣關係通常指的是父子關係。無明管道通常用於兩個不一樣進程之間的通訊。當一個進程建立了一個管道,並調用fork建立本身的一個子進程後,父進程關閉讀管道端,子進程關閉寫管道端,這樣提供了兩個進程之間數據流動的一種方式。

有名管道也是一種半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。

2)信號量

信號量是一個計數器,能夠用來控制多個線程對共享資源的訪問.,它不是用於交換大批數據,而用於多線程之間的同步.它常做爲一種鎖機制,防止某進程在訪問資源時其它進程也訪問該資源.所以,主要做爲進程間以及同一個進程內不一樣線程之間的同步手段.

3)信號

信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生.

4)消息隊列

消息隊列是消息的鏈表,存放在內核中並由消息隊列標識符標識.消息隊列克服了信號傳遞信息少,管道只能承載無格式字節流以及緩衝區大小受限等特色.消息隊列是UNIX下不一樣進程之間可實現共享資源的一種機制,UNIX容許不一樣進程將格式化的數據流以消息隊列形式發送給任意進程.對消息隊列具備操做權限的進程均可以使用msget完成對消息隊列的操做控制.經過使用消息類型,進程能夠按任何順序讀信息,或爲消息安排優先級順序.

5)共享內存

共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問.共享內存是最快的IPC(進程間通訊)方式,它是針對其它進程間通訊方式運行效率低而專門設計的.它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步與通訊.

6)套接字:可用於不一樣及其間的進程通訊

四、簡述你對管道、隊列的理解;

見T3

五、請列舉你知道的進程間通訊方式;

見T3

六、什麼是同步I/O,什麼是異步I/O?

    A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;    An asynchronous I/O operation does not cause the requesting process to be blocked;  二者的區別就在於synchronous IO作」IO operation」的時候會將process阻塞。

七、請問multiprocessing模塊中的Value、Array類的做用是什麼?舉例說明它們的使用場景

alue,Array(用於進程通訊,資源共享)

multiprocessing 中Value和Array的實現原理都是在共享內存中建立ctypes()對象來達到共享數據的目的,二者實現方法大同小異,只是選用不一樣的ctypes數據類型而已。

Value

構造方法:Value((typecode_or_type, args[, lock])

  • typecode_or_type:定義ctypes()對象的類型,能夠傳Type code或 C Type,具體對照表見下文。
  • args:傳遞給typecode_or_type構造函數的參數
  • lock:默認爲True,建立一個互斥鎖來限制對Value對象的訪問,若是傳入一個鎖,如Lock或RLock的實例,將用於同步。若是傳入False,Value的實例就不會被鎖保護,它將不是進程安全的。

typecode_or_type支持的類型:

| Type code | C Type             | Python Type       | Minimum size in bytes |
| --------- | ------------------ | ----------------- | --------------------- |
| `'b'`     | signed char        | int               | 1                     |
| `'B'`     | unsigned char      | int               | 1                     |
| `'u'`     | Py_UNICODE         | Unicode character | 2                     |
| `'h'`     | signed short       | int               | 2                     |
| `'H'`     | unsigned short     | int               | 2                     |
| `'i'`     | signed int         | int               | 2                     |
| `'I'`     | unsigned int       | int               | 2                     |
| `'l'`     | signed long        | int               | 4                     |
| `'L'`     | unsigned long      | int               | 4                     |
| `'q'`     | signed long long   | int               | 8                     |
| `'Q'`     | unsigned long long | int               | 8                     |
| `'f'`     | float              | float             | 4                     |
| `'d'`     | double             | float             | 8                     |

參考地址:docs.python.org/3/library/a…

Array

構造方法:Array(typecode_or_type, size_or_initializer, **kwds[, lock])

  • typecode_or_type:同上
  • size_or_initializer:若是它是一個整數,那麼它肯定數組的長度,而且數組將被初始化爲零。不然,size_or_initializer是用於初始化數組的序列,其長度決定數組的長度。
  • kwds:傳遞給typecode_or_type構造函數的參數
  • lock:同上

使用示例:

import multiprocessing
 
def f(n, a):
    n.value = 3.14
    a[0] = 5
 
if __name__ == '__main__':
    num = multiprocessing.Value('d', 0.0)
    arr = multiprocessing.Array('i', range(10))
    p = multiprocessing.Process(target=f, args=(num, arr))
    p.start()
    p.join()
    print(num.value)
    print(arr[:])

注意:Value和Array只適用於Process類。

八、請問multiprocessing模塊中的Manager類的做用是什麼?與Value和Array類相比,Manager的優缺點是什麼?

Manager(用於資源共享)

Manager()返回的manager對象控制了一個server進程,此進程包含的python對象能夠被其餘的進程經過proxies來訪問。從而達到多進程間數據通訊且安全。Manager模塊常與Pool模塊一塊兒使用。

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

管理器是獨立運行的子進程,其中存在真實的對象,並以服務器的形式運行,其餘進程經過使用代理訪問共享對象,這些代理做爲客戶端運行。Manager()是BaseManager的子類,返回一個啓動的SyncManager()實例,可用於建立共享對象並返回訪問這些共享對象的代理。

九、寫一個程序,包含十個線程,子線程必須等待主線程sleep 10秒鐘以後才執行,並打印當前時間;

十、寫一個程序,包含十個線程,同時只能有五個子線程並行執行;

十一、寫一個程序,要求用戶輸入用戶名和密碼,要求密碼長度很多於6個字符,且必須以字母開頭,若是密碼合法,則將該密碼使用md5算法加密後的十六進制概要值存入名爲password.txt的文件,超過三次不合法則退出程序;

十二、寫一個程序,使用socketserver模塊,實現一個支持同時處理多個客戶端請求的服務器,要求每次啓動一個新線程處理客戶端請求;

相關文章
相關標籤/搜索