併發編程(理論)

併發編程

併發與串行

爲何要併發(以前程序所存在的問題)

  • 程序默認執行方式是串行(即程序自上而下,一行一行順序執行,必須把當前任務執行完畢,才能開始執行下一個任務,不管當前任務須要多長時間)
  • 問題舉例:
    • 如:TCP的服務器中,若是正在進行通信循環,則沒法處理其餘的客戶端請求
    • 如:執行了input語句,用戶不輸入,則一直卡在原理
  • 學習併發的目的就是要編寫能夠同時執行多個任務的程序,來提升效率

串行和併發都是程序處理任務的方式linux

實現併發的方式

  1. 多進程
  2. 多線程
  3. 協程

進程是什麼

進程指的是正在運行中的程序,是操做系統調度以及進行資源分配的基礎單位編程

是一個資源單位windows

當把一個程序從硬盤讀入到內存,進程就產生了瀏覽器

  • 多進程
    • 指的是同一時間有多個程序被裝入內存並執行

進程來自於操做系統,由操做系統進行調度以及資源分配安全

多進程的實現原理其實就是操做系統調度進程的原理服務器

多道技術

實現原理:多線程

1.空間複用 併發

​ 同一時間,加載多個任務到內存中,多個進程之間內存區域須要相互隔離(這種隔離是物理隔離),其目的是爲了保證數據安全socket

2.時間複用

​ 操做系統會在多個進程之間作切換執行

切換任務的兩種狀況

  1. 當一個進程遇到了IO操做時會自動切換

  2. 當一個任務執行時間超過閾值會強制切換(時間不會太長,切換的夠快用戶就感覺不到是串行的)

    注意:在切換前必須保存狀態,以便後續恢復執行。而且頻繁的切換也須要消耗資源

    其實當全部任務都沒有IO操做時,切換執行(上下文切換)效率反而更低,可是爲了保證併發執行,必須犧牲效率

簡單的總結就是切換加保存

有了多道技術,計算機就能夠同時併發的處理多個任務

併發編程中的重要概念

串行:自上而下順序執行

併發:多個任務同時執行,可是本質是在多個進程之間切換執行,因爲速度很是快因此感受是同時運行

並行:是真正的同時運行,必須具有多核CPU,有幾個核心就能並行幾個任務,可是任務數量超過核心數時仍是併發執行

以上三個概念都是用於描述處理任務的方式

阻塞:指的是程序遇到了IO操做,沒法繼續執行代碼時的一種狀態

非阻塞:指的是程序沒有遇到IO操做的一個狀態

​ input() 默認是一個阻塞的操做

​ 咱們能夠用一些手段將阻塞的操做變成非阻塞的操做,例如非阻塞的socket

一個進程的三種狀態

  • 阻塞

  • 運行

  • 就緒

野指針,殭屍指針,內存泄漏

野指針:變量名沒有刪除

殭屍指針:變量值沒有被使用可是引用計數卻不爲0

進程的建立和銷燬(瞭解)

對於計算機而言,必須具有建立和銷燬進程的能力

建立:

  1. 用戶的交互式請求,鼠標雙擊

  2. 由一個正在運行的程序,調用了開啓進程的接口,例如subprocess
  3. 一個批處理做業開始
  4. 系統初始化

銷燬:

  1. 任務完成, 自願退出
  2. 強制結束 taskkill(windows),kill(linux)非自願退出
  3. 程序遇到了異常
  4. 嚴重錯誤,訪問了不應訪問的內存

進程和程序(瞭解)

程序是一堆代碼放在一個文件中,一般後綴是exe,本來是儲存在硬盤上的

進程是將代碼從硬盤讀取到內存而後執行,產生的

進程是由程序產生的

一個程序能夠產生多個進程,例如qq多開,每個進程都具有一個PID,且是惟一的

進程的層級關係(瞭解)

在linux中,進程具有父子關係,是一個樹狀結構,能夠相互查找,但不能使用

當一個程序開啓了另外一個不屬於本身管理的資源,手裏握着對方的地址信息,也就是句柄

在windows中,沒有層級關係,父進程能夠將子進程的句柄轉讓

父進程 子進程?

例如qq開啓了瀏覽器,那麼qq是父進程,瀏覽器是子進程

PID和PPID(瞭解)

PID 當前進程的編號

PPID 父進程的編號

在pycharm中訪問PID與PPID

import os

os.getpid()
os.getppid()

在cmd中查找程序的pid

tasklist | findstr python

注意:當咱們運行Py文件時,其實運行的是python解釋器進程

相關文章
相關標籤/搜索