併發編程理論執行歸納

基於景老師博客https://www.cnblogs.com/Eva-J/articles/8253549.html#_label2和 egon老師博客 http://www.cnblogs.com/linhaifeng/p/6295875.html 整理

若是你發現了問題或者有新的知識點添加 ,請在文件下方標出行號,並寫下修改後的內容,方便你們整理,謝謝!

多道程序系統 原理,缺點

#容許多個程序同時進入內存並運行。即同時把多個程序放入內存,並容許它們交替在CPU中運行,它們共享系統中的各類硬、軟件資源。當一道程序因I/O請求而暫停運行時,CPU便當即轉去運行另外一道程序。
# 多道技術中的多道指的是多個程序,多道技術的實現是爲了解決多個程序競爭或者說共享同一個資源(好比cpu)的有序調度問題,解決方式即多路複用,多路複用分爲時間上的複用和空間上的複用。
    # 時間複用,空間複用
            # 空間上的多路複用: 將內存分爲幾部分,每一個部分放入一個程序,這樣,同一時間內存中就有了多道程序。
                    # 空間上的複用最大的問題是:程序之間的內存必須分割,這種分割須要在硬件層面實現,由操做系統控制。若是內存彼此不分割,則一個程序能夠訪問另一個程序的內存,
                            # 首先喪失的是安全性,好比你的qq程序能夠訪問操做系統的內存,這意味着你的qq能夠拿到操做系統的全部權限。
                            # 其次喪失的是穩定性,某個程序崩潰時有可能把別的程序的內存也給回收了,比方說把操做系統的內存給回收了,則操做系統崩潰。
            # 時間上的多路複用: 當一個程序在等待I/O時,另外一個程序可使用cpu,若是內存中能夠同時存放足夠多的做業,則cpu的利用率能夠接近100%

    # 操做系統採用了多道技術後,能夠控制進程的切換,或者說進程之間去爭搶cpu的執行權限。這種切換不只會在一個進程遇到io時進行,一個進程佔用cpu時間過長也會切換,或者說被操做系統奪走cpu的執行權限

INPUT OUTPUT

# INPUT 數據進入內存
# OUTPUT 數據移除內存

什麼是操做系統?

# 操做系統就是一個協調、管理和控制計算機硬件資源和軟件資源的控制程序。
# 操做系統由操做系統的內核(運行於內核態,管理硬件資源)以及系統調用(運行於用戶態,爲應用程序員寫的應用程序提供系統調用接口)兩部分組成

posix是IEEE提出的一個unix標準,(可移植的操做系統接口Portable Operating System Interface)

操做系統的功能?

# 隱藏了醜陋的硬件調用接口,爲應用程序員提供調用硬件資源的更好,更簡單,更清晰的模型(系統調用接口)。應用程序員有了這些接口後,就不用再考慮操做硬件的細節,專心開發本身的應用程序便可。
# 將應用程序對硬件資源的競態請求變得有序化

操做系統的做用?

# 做用一:爲應用程序提供如何使用硬件資源的抽象。例如:操做系統提供了文件這個抽象概念,對文件的操做就是對磁盤的操做,有了文件咱們無需再去考慮關於磁盤的讀寫控制
# 做用二:管理硬件資源。操做系統的任務是在相互競爭的程序之間有序地控制對處理器、存儲器以及其餘I/O接口設備的分配。

什麼是進程?進程與程序的區別?

# 進程正在執行的一個過程。進程是對正在運行程序的一個抽象。# 進程是一個實體。每個進程都有它本身的地址空間,#是系統進行資源分配和調度的基本單位
    # 包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。

進程與程序的區別

# 程序是指令和數據的有序集合,其自己沒有任何運行的含義,是一個靜態的概念。
# 而進程是程序在處理機上的一次執行過程,它是一個動態的概念。
# 程序能夠做爲一種軟件資料長期存在,而進程是有必定生命期的。
# 程序是永久的,進程是暫時的。

進程與進程間數據的關係

#  進程直接的內存空間是隔離的
# 父子
    # 父進程只負責通知操做系統啓動子進程
    # 接下開的工做由操做系統接手,父進程繼續執行
    # 父進程執行完畢以後並不會直接結束程序,而是會等待全部的全部的子進程完畢以後才結束
    # 父進程要負責回收子進程的資源

什麼是pid?pid的原理是什麼?有什麼特色?

# PID(Process Identification)操做系統裏指進程識別號,也就是進程標識符。
        # 特色:
            # 只要運行一程序,系統會自動分配一個標識。
            # 是暫時惟一:進程停止後,這個號碼就會被回收,並可能被分配給另外一個新進程。
            # 只要沒有成功運行其餘程序,這個PID會繼續分配給當前要運行的程序。
            # 若是成功運行一個程序,而後再運行別的程序時,系統會再次自動分配另外一個PID。

什麼是進程調度三狀態圖?

# 新提交的任務會進入就緒隊列的末尾,操做系統系統會將就緒隊列添加到狀態中並執行一個單位的時間片,若是在時間片的時間內執行完畢,任務結束。若是沒有執行完那麼繼續將其添加到就緒隊列的末尾等待下一次執行。若是在運行的過程當中遇到了阻塞那麼將其添加進阻塞隊列中,等待阻塞的IO執行完畢再添加進就緒隊列中,開始新的一輪運行。

進程都有哪些調度算法?

FCFS 原理

# 用於做業調度,進程調度。FCFS算法比較有利於長做業(進程),而不利於短做業(進程)。適合於CPU繁忙型做業,而不利於I/O繁忙型的做業(進程)。

SPF 原理

# 指對短做業或短進程優先調度的算法,用於做業調度,進程調度。但其對長做業不利;不能保證緊迫性做業(進程)被及時處理;做業的長短只是被估算出來的。

RR 原理

# 讓每一個進程在就緒隊列中的等待時間與享受服務的時間成比例。
# 在時間片輪轉法中,須要將CPU的處理時間分紅固定大小的時間片。若是一個進程在被調度選中以後用完了系統規定的時間片,但又未完成要求的任務,則它自行釋放本身所佔有的CPU而排到就緒隊列的末尾,等待下一次調度。同時,進程調度程序又去調度當前就緒隊列中的第一個進程。
# 因爲做業調度是對除了CPU以外的全部系統硬件資源的分配,其中包含有不可搶佔資源,因此做業調度不使用輪轉法。
# 在輪轉法中,加入到就緒隊列的進程有3種狀況:
        # 一種是分給它的時間片用完,但進程還未完成,回到就緒隊列的末尾等待下次調度去繼續執行。
        # 另外一種狀況是分給該進程的時間片並未用完,只是由於請求I/O或因爲進程的互斥與同步關係而被阻塞。當阻塞解除以後再回到就緒隊列。
        # 第三種狀況就是新建立進程進入就緒隊列。

多級反饋隊列算法原理

# 1. 設置多個就緒隊列,併爲各個隊列賦予不一樣的優先級。第一個隊列的優先級最高,第二個隊列次之,其他各隊列的優先權逐個下降。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權愈高的隊列中,爲每一個進程所規定的執行時間片就愈小。
        # 2. 當一個新進程進入內存後,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,即可準備撤離系統;若是它在一個時間片結束時還沒有完成,調度程序便將該進程轉入第二隊列的末尾,再一樣地按FCFS原則等待調度執行;若是它在第二隊列中運行一個時間片後仍未完成,再依次將它放入第三隊列,……,如此下去,當一個長做業(進程)從第一隊列依次降到第n隊列後,在第n 隊列便採起按時間片輪轉的方式運行。
        # 3. 僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,纔會調度第i隊列中的進程運行。若是處理機正在第i隊列中爲某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶佔正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。

什麼是並行,串行

# 並行: 同時運行,只有具有多個CPU才能實現

什麼是併發

# 併發: 僞並行,單個cpu+多道技術可實現併發

併發的實現:

# 進程併發的實如今於硬件中斷一個正在運行的進程,把此時進程運行的全部狀態保存下來,爲此操做系統維護一張表格,進程表。
    # 每一個進程佔用一個進程表項(進程程序塊)

什麼是同步,異步,阻塞,非阻塞,說說各個組合的應用?

# 同步一個任務的完成須要依賴另一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麼成功都成功,失敗都失敗,兩個任務的狀態能夠保持一致。
    # 異步是不須要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工做,依賴的任務也當即執行,只要本身完成了整個任務就算完成了。
    # 進程在等待輸入(I/O)時的狀態稱爲阻塞

    # 異步阻塞
    # 異步操做是能夠被阻塞住的,只不過它不是在處理消息時阻塞,而是在等待消息通知時被阻塞。
    # 異步非阻塞
    # 即不會一個任務完完整整執行完纔去執行另外一個一個任務,也不會在任務執行中等待IO完畢再執行任務。

如何建立一個進程?

# 系統初始化
    # 一個進程在運行過程當中開啓子進程
    # 用戶的交互式請求而建立的進程
    # 批處理做業的初始化
    # 新進程的建立都是由一個已存在的進程執行了一個用於建立進程的系統調用而建立的

如何結束一個進程?

# 正常退出
# 出錯退出
# 嚴重退出
# 被殺死

進程的屬性,和方法

# p.start() 只是向操做系統開啓子進程的信號, 子進程創造,運行多長時間應用沒法管理。p.start() 會調用run 若是繼承類須要重寫run
    # join() 主進程等待子進程終止. 等到子進程執行完畢後,將佔用的操做系統的pid回收.join並無使進程串行,僅僅是主進程等待調用join方法子進程。
    # p.terminate() 只是告訴操做系統殺進程,操做系統何時殺,殺沒殺完他都不知道
    # p.run() 進程啓動時運行的方法,是他調用target指定的函數,自定義類必須實現
    # p.daemon 在調用start()以前使用 True將子進程設置爲守護進程
    # p.is_alive() p運行,返回bool 查看子進程是否存活
    # p.name 進程名
    # p.pid 進程的pid

主進程的任務與子進程的任務分爲哪兩種狀況?

# 在主進程的任務與子進程的任務彼此獨立的狀況下,主進程的任務先執行完畢後,主進程還須要等待子進程執行完畢,而後統一回收資源。
    # 若是主進程的任務在執行到某一個階段時,須要等待子進程執行完畢後才能繼續執行,就須要有一種機制可以讓主進程檢測子進程是否運行完畢,在子進程執行完畢後才繼續執行,不然一直在原地阻塞。

子進程在不一樣操做系統中有哪些差別?

# windows上開啓子進程時將父進程當作模塊,,將父進程以導入模塊的方式導入子進程執行造成命名空間。 須要開啓子進程須要放入main中
    # unix經過fork機制複製主進程的名稱空間內的變量名。

什麼是殭屍進程?應用?

# 一種數據結構 子進程死亡以後佔用的內存釋放了,
    #但保留着進程的pid號,給父進程查看。
    # 父進程代碼運行完畢而且等全部子進程都死亡以後回收這些ID號。 wait_pid()
    #父進程一直不死 還一直不向子進程回收id的操做。殭屍進程越積越多。pid佔過多,其餘程序起不來。
    # linux 用ps aux 查看進程實時查看進程 top

什麼是孤兒進程?什麼時候產生?

#父進程被kill以前沒回收id 子進程就變成孤兒進程。最後會經過別的機制回收。佔pid號還不釋放其餘的進程就起不來。

join 原理

#1. 若是子進程沒執行完就會阻塞,執行完了就不會阻塞
    #2. 當指望全部子進程執行完再執行父進程

什麼是守護進程?應用?

#1.
    # 守護進程會隨着主進程代碼執行完畢而結束
    # 若是主進程代碼已經執行完畢,可是子進程還沒執行完,守護進程仍然會消失
#2.
    # 兩種查看電腦應用存活的方式
    # 經過網絡找到機器,再查看進程是否開啓
    # 五十臺機器主動向我彙報,程序執行就能獲得信息
    # 守護進程:每隔五分鐘就向一臺機器彙報本身的狀態

鎖產生的緣由?

# 共享帶來競爭資源,競爭帶來混亂,同一時間對資源的訪問須要串行訪問。

鎖的屬性和方法?

# lock.acquire() 加鎖
    # lock.release() 釋放鎖
    # 共享空間 ,硬盤空間文件是共享的。

如何解決加鎖產生的效率問題?

# 1. 共享文件是硬盤空間 效率低
    # 使用內存空間
    # 2. 處理好鎖的問題
    # 隊列是管道+鎖實現

join與lock的區別?

# 使用join能夠將一個任務總體串行
    # 互斥鎖能夠將一個任務中的某一段代碼串行

死鎖現象是如何產生的?如何解決?

# 兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象。
    # 遞歸鎖 RLock

信號量原理是什麼? 實現?

# 信號量同一時間容許多個任務拿到鎖去使用資源
    # 信號量同步基於內部計數器,每調用一次acquire(),計數器減1;每調用一次release(),計數器加1.當計數器爲0時,acquire()調用被阻塞

什麼是事件?都有哪些屬性和方法?

# 進程之間的狀態是獨立運行且不可預測的。Event對象可以實現進程間的同步。
    # Event對象包含一個可由進程設置的信號標誌,它容許進程等待某些事件的發生。初始時,信號標誌爲假,若是有進程等待event對象,那麼這些進程會一直被阻塞。若是信號標誌設置爲真,它將喚醒全部等待對象的進程。
    # event.is_set() 返回event的狀態值
    # event.wait() 若是event.is_set()==False將阻塞進程
    # event.set() 設置event的狀態爲True,全部阻塞池的線程激活進入就緒狀態,等待操做系統調度。
    # event.clear() 回覆envent狀態值爲False

什麼是隊列 隊列的屬性和方法?

# 進程間互相隔離,要實現進程間通訊IPC. multiprocessing 支持隊列和管道使用消息傳遞。
# 1.隊列內存放的是消息而非大數據
# 2.隊列佔用的是內存空間,所以maxsize即使是無大小限制也受限於內存大小
# 3.隊列只能只在兩個進程間傳遞,不能再進程池內部傳遞。
# 插入數據到隊列
    #q.put() 阻塞方法
    #q.put_nowait() 非阻塞方法
# 從隊列讀取並刪除一個元素
    # q.get() 阻塞方法
    # q.get_nowait() 非阻塞方法
# q.empty(),q.full()判斷不許確的緣由?
    # 在多進程場景下進程間的狀態是不可預測的。一個進程判斷到隊列爲空或滿但此時另外一個進程會對隊列進行修改

什麼是生產者消費者模型?

# 在併發編程中若是處理數據或者生產數據的一方效率過快會讓另外一方必須等待另外一方。爲了解決這個問題而實現這個模型。
# 生產者消費者模式是經過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通信,而經過阻塞隊列來進行通信,因此生產者生產完數據以後不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要數據,而是直接從阻塞隊列裏取,阻塞隊列就至關於一個緩衝區,平衡了生產者和消費者的處理能力。
# 能夠平衡兩個角色之間效率
# 使程序解耦合

JoinableQueue 使用方法?

# task_done 使用者使用此方法發出信號,表示q.get()的返回項目已經被處理。若是調用此方法的次數大於從隊列中刪除項目的數量,引起ValueError異常
    # join 生產者調用此方法阻塞,知道隊列中全部的項目均被處理。阻塞將持續隊列中的每一個項目均調用q.task_done()方法爲止
    # 生產者每放一個數據都會計數,消費者每取一個數據也會計數並會提示處理數據完畢task_done計數-1

什麼是管道?屬性方法?實現?

# 基於pickle,socket實現 管道是數據不安全的。
# 由兩個collection對象組成的元組 表示管道兩端的鏈接對象,必須在產生Process對象以前產生管道
# send()  發送數據pickle支持的類型
# recv() 接收數據,若是沒有消息可接收,recv方法會一直阻塞。若是鏈接的另一端已經關閉,那麼recv方法會拋出EOFError。
# close() 關閉鏈接
# 開啓一個進程,並向進程內傳遞管道,此時操做系統管理4個端口。每關閉一個端口,端口數減一。直到全部的端口都關閉了剩餘一個端口的時候,這時recv沒有數據接收判斷出結束。就會拋出EOFError異常

爲何要有進程池?

# 服務開啓的進程數會隨着併發的客戶端數目增多而增多,爲服務端主機帶來壓力,進程開啓過多,效率反而會降低,因此咱們須要讓機器在一個可承受的範圍運行以內。
    # 這就是進程池的用途

進程池都有哪些方法和屬性?

# po.apply() apply是同步執行,馬上獲取結果
# po. apply_async() 返回值是AsyncResult的實例  使用get來獲取apply_aync的結果
# po.join() 等待全部工做進程退出 只能在po.close()或po.teminate()以後調用
# po.close() 關閉進程池。若是全部操做持續掛起,它們將在工做進程終止前完成
# po.map(func,Iterable)  提供異步方式對Iterable元素執行func函數,有返回值。
# po.ready()調用完成返回True
# po.successful() 若是調用完成且沒有引起異常,返回True,若是在結果就緒以前調用此方法,引起異常
# po.wait() 等待結果變爲可用。
# obj.terminate():當即終止全部工做進程,同時不執行任何清理或結束任何掛起工做。若是p被垃圾回收,將自動調用此函數
相關文章
相關標籤/搜索