內容:html
1.操做系統簡介node
2.進程python
3.線程linux
4.協程nginx
5.IO多路複用程序員
操做系統:http://www.cnblogs.com/Eva-J/articles/8253521.html算法
進程:https://www.cnblogs.com/Eva-J/articles/8253549.html編程
線程:https://www.cnblogs.com/Eva-J/articles/8306047.html小程序
協程:https://www.cnblogs.com/Eva-J/articles/8324673.html
IO:https://www.cnblogs.com/Eva-J/articles/8324837.html
1、操做系統簡介
1.什麼是操做系統
操做系統位於計算機硬件與應用軟件之間,本質也是一個軟件。操做系統由操做系統的內核(運行於內核態,管理硬件資源)以及系統調用(運行於用戶態,爲應用程序員寫的應用程序提供系統調用接口)兩部分組成
因此,單純的說操做系統是運行於內核態的,是不許確的。
2.操做系統做用
3.操做系統發展
4.補充
多道技術:
2、進程
1.什麼是進程
顧名思義,進程即正在執行的一個過程。進程是對正在運行程序的一個抽象
進程的概念起源於操做系統,是操做系統最核心的概念,也是操做系統提供的最古老也是最重要的抽象概念之一。操做系統的其餘全部內容都是圍繞進程的概念展開的。
廣義定義:進程是一個具備必定獨立功能的程序關於某個數據集合的一次運行活動。它是操做系統動態執行的基本單元,在傳統的操做系統中,進程既是基本的分配單元,也是基本的執行單元
程序和進程的區別:
2.進程調度
想多個進程交替運行,操做系統必須對這些進程進行調度,這個調度不是隨機進行的,而須要遵循必定的法則,由此就有了進程的調度算法:
3.進程的併發與並行
並行 : 並行是指二者同時執行(多核同時刻運行多個進程)
併發 : 併發是指資源有限的狀況下,二者交替輪流使用資源,目的是提升效率(單CPU多進程併發)
區別:
4.同步、異步、阻塞、非阻塞
(1)進程3狀態
如上圖進程有三個狀態:就緒,運行和阻塞
進程三狀態實例:
(2)同步與異步
同步:一個進程在執行某個任務時,另外一個進程必須等待其執行完畢,才能繼續執行,同一時間只能作一個操做
異步:一個進程在執行某個任務時,另外一個進程無需等待其執行完畢,就能夠繼續執行,當有消息返回時,系統會通知後者進行處理,這樣能夠提升執行效率,同一時間能夠作兩個操做
(3)阻塞與非阻塞
阻塞與非阻塞與線程等待消息通知(無所謂同步異步)時的狀態有關,主要是程序(線程)等待消息通知時的狀態角度來講的
注:不少時候同步操做會以阻塞的形式表現出來,而異步操做通常都不會在真正的IO操做處被阻塞
簡單說程序到了IO處就中止運行就是阻塞(python),而程序到了IO處繼續向後執行就是非阻塞(node.js)
5.進程的建立與結束
(1)進程的建立
注:不管哪種,新進程的建立都是由一個已經存在的進程執行了一個用於建立進程的系統調用而建立的
(2)進程的結束
3、線程
1.線程的引入及背景
(1)進程
程序並不能單獨運行,只有將程序裝載到內存中,系統爲它分配資源才能運行,而這種執行的程序就稱之爲進程。
程序和進程的區別就在於:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬於動態概念。
在多道編程中,咱們容許多個程序同時加載到內存中,在操做系統的調度下,能夠實現併發地執行。這是這樣的設計,大大提升了CPU的利用率。
進程的出現讓每一個用戶感受到本身獨享CPU,所以,進程就是爲了在CPU上實現多道編程而提出的
(2)有進程爲何須要線程
進程雖然有優勢,可是也有缺點:
進程只能在一個時間幹一件事,若是想同時幹兩件事或多件事,進程就無能爲力了
進程在執行的過程當中若是阻塞,例如等待輸入,整個進程就會掛起,即便進程中有些工做不依賴於輸入的數據,也將沒法執行
而線程能夠很好地解決這些缺陷
引入線程的緣由:減小程序在併發執行時所付出的時空開銷,使OS具備更好的併發性
(3)線程的出現
2.進程與線程的區別
3.線程的特色
4.內存中的線程
多個線程共享同一個進程的地址空間中的資源,是對一臺計算機上多個進程的模擬,有時也稱線程爲輕量級的進程;而對一臺計算機上多個進程,則共享物理內存、磁盤、打印機等其餘物理資源。多線程的運行也多進程的運行相似,是cpu在多個線程之間的快速切換。
不一樣的進程之間是充滿敵意的,彼此是搶佔、競爭cpu的關係,如迅雷會和QQ搶資源。而同一個進程是由一個程序員的程序建立,因此同一進程內的線程是合做關係,一個線程能夠訪問另一個線程的內存地址,你們都是共享的
相似於進程,每一個線程也有本身的堆棧,不一樣於進程,線程庫沒法利用時鐘中斷強制線程讓出CPU,能夠調用thread_yield運行線程自動放棄cpu,讓另一個線程運行
線程一般是有益的,可是帶來了不小程序設計難度,線程的問題是:
所以,在多線程的代碼中,須要更多的心思來設計程序的邏輯、保護程序的數據
4、協程
1.協程介紹
協程:是單線程下的併發,又稱微線程,纖程
一句話說明什麼是線程:協程是一種用戶態的輕量級線程,即協程是由用戶程序本身控制調度的。、
注意:
1 python的線程屬於內核級別的,即由操做系統控制調度(如單線程遇到io或執行時間過長就會被迫交出cpu執行權限,切換其餘線程運行) 2 單線程內開啓協程,一旦遇到io,就會從應用程序級別(而非操做系統)控制切換,以此來提高效率(!!!非io操做的切換與效率無關)
對比操做系統控制線程的切換,用戶在單線程內控制協程的切換
優勢:
缺點:
協程特色:
2.greenlet模塊
(1)安裝
pip3 install greenlet
(2)greenlet模塊使用
1 # 使用greenlet模塊 2 # 真正的協程就是使用greenlet模塊完成切換 3 from greenlet import greenlet 4 5 6 def eat(name): 7 print('%s eat 1' % name) 8 g2.switch('egon') 9 print('%s eat 2' % name) 10 g2.switch() 11 12 13 def play(name): 14 print('%s play 1' % name) 15 g1.switch() 16 print('%s play 2' % name) 17 18 19 g1 = greenlet(eat) 20 g2 = greenlet(play) 21 22 g1.switch('egon') # 能夠在第一次switch時傳入參數,之後都不須要
3.gevent模塊
(1)介紹
安裝:pip3 install gevent
Gevent 是一個第三方庫,能夠輕鬆經過gevent實現併發同步或異步編程,在gevent中用到的主要模式是Greenlet, 它是以C擴展模塊形式接入Python的輕量級協程。 Greenlet所有運行在主程序操做系統進程的內部,但它們被協做式地調度
(2)用法
(3)同步與異步
四、協程應用
(1)爬蟲
(2)經過gevent實現單線程下的socket併發
5、IO多路複用