操做系統

內容:html

1.操做系統簡介node

2.進程python

3.線程linux

4.協程nginx

5.IO多路複用程序員

 

參考:
web

操做系統: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.補充

多道技術:

  • 產生背景:針對單核,實現併發(如今的主機通常是多核,那麼每一個核都會利用多道技術)
  • 例若有4個cpu,運行於cpu1的某個程序遇到io阻塞,會等到io結束再從新調度,會被調度到4個cpu中的任意一個,具體由操做系統調度算法決定
  • 空間上的複用:如內存中同時有多道程序
  • 時間上的複用:複用一個cpu的時間片
  • 強調:遇到io切,佔用cpu時間過長也切,核心在於切以前將進程的狀態保存下來,這樣才能保證下次切換回來時,能基於上次切走的位置繼續運行

 

 

 

2、進程

1.什麼是進程

顧名思義,進程即正在執行的一個過程。進程是對正在運行程序的一個抽象

進程的概念起源於操做系統,是操做系統最核心的概念,也是操做系統提供的最古老也是最重要的抽象概念之一。操做系統的其餘全部內容都是圍繞進程的概念展開的。

狹義定義:進程是正在運行的程序的實例(an instance of a computer program that is being executed)

廣義定義:進程是一個具備必定獨立功能的程序關於某個數據集合的一次運行活動。它是操做系統動態執行的基本單元,在傳統的操做系統中,進程既是基本的分配單元,也是基本的執行單元

 

程序和進程的區別

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

 

 

2.進程調度

想多個進程交替運行,操做系統必須對這些進程進行調度,這個調度不是隨機進行的,而須要遵循必定的法則,由此就有了進程的調度算法:

  • 先來先服務調度算法
  • 短做業優先調度算法
  • 時間片輪轉法
  • 多級反饋隊列

 

 

3.進程的併發與並行

並行 : 並行是指二者同時執行(多核同時刻運行多個進程)

併發 : 併發是指資源有限的狀況下,二者交替輪流使用資源,目的是提升效率(單CPU多進程併發)

區別:

  • 並行是從微觀上,在一個精確的時間點上有不一樣的程序在執行,這就要求必須有多個處理器(多核CPU)
  • 併發是從宏觀上,在一個時間段不一樣的程序在同時執行的,好比一個服務器同時處理多個任務

 

 

4.同步、異步、阻塞、非阻塞

(1)進程3狀態

 

如上圖進程有三個狀態:就緒,運行和阻塞

  • 就緒狀態:當進程已分配到除CPU之外的全部必要的資源,只要得到處理機即可當即執行,這時的進程狀態稱爲就緒狀態
  • 執行/運行狀態:當進程已得到處理機,其程序正在處理機上執行,此時的進程狀態稱爲執行狀態
  • 阻塞狀態:正在執行的進程,因爲等待某個事件發生而沒法執行時,便放棄處理而處於阻塞狀態。引發進程阻塞的事件可有多種,例如等待I/O完成、申請緩衝區不能知足、等待信件(信號)等

 

進程三狀態實例:

 

(2)同步與異步

同步:一個進程在執行某個任務時,另外一個進程必須等待其執行完畢,才能繼續執行,同一時間只能作一個操做
異步:一個進程在執行某個任務時,另外一個進程無需等待其執行完畢,就能夠繼續執行,當有消息返回時,系統會通知後者進行處理,這樣能夠提升執行效率,同一時間能夠作兩個操做

 

(3)阻塞與非阻塞

阻塞與非阻塞與線程等待消息通知(無所謂同步異步)時的狀態有關,主要是程序(線程)等待消息通知時的狀態角度來講的

注:不少時候同步操做會以阻塞的形式表現出來,而異步操做通常都不會在真正的IO操做處被阻塞

簡單說程序到了IO處就中止運行就是阻塞(python),而程序到了IO處繼續向後執行就是非阻塞(node.js)

 

 

5.進程的建立與結束

(1)進程的建立

  • 系統初始化(查看進程linux中用ps命令,windows中用任務管理器,前臺進程負責與用戶交互,後臺運行的進程與用戶無關,運行在後臺而且只在須要時才喚醒的進程,稱爲守護進程,如電子郵件、web頁面、新聞、打印)
  • 一個進程在運行過程當中開啓了子進程(如nginx開啓多進程,os.fork,subprocess.Popen等)
  • 用戶的交互式請求,而建立一個新進程(如用戶雙擊暴風影音)
  • 一個批處理做業的初始化(只在大型機的批處理系統中應用)

注:不管哪種,新進程的建立都是由一個已經存在的進程執行了一個用於建立進程的系統調用而建立的

 

(2)進程的結束

  • 正常退出(自願,如用戶點擊交互式頁面的叉號,或程序執行完畢調用發起系統調用正常退出,在linux中用exit,在windows中用ExitProcess)
  • 出錯退出(自願,python a.py中a.py不存在)
  • 嚴重錯誤(非自願,執行非法指令,如引用不存在的內存,1/0等,能夠捕捉異常,try...except...)
  • 被其餘進程殺死(非自願,如kill -9)

 

 

 

3、線程

1.線程的引入及背景

(1)進程

程序並不能單獨運行,只有將程序裝載到內存中,系統爲它分配資源才能運行,而這種執行的程序就稱之爲進程。

程序和進程的區別就在於:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬於動態概念。

在多道編程中,咱們容許多個程序同時加載到內存中,在操做系統的調度下,能夠實現併發地執行。這是這樣的設計,大大提升了CPU的利用率。

進程的出現讓每一個用戶感受到本身獨享CPU,所以,進程就是爲了在CPU上實現多道編程而提出的

 

(2)有進程爲何須要線程

進程雖然有優勢,可是也有缺點:

  • 進程只能在一個時間幹一件事,若是想同時幹兩件事或多件事,進程就無能爲力了

  • 進程在執行的過程當中若是阻塞,例如等待輸入,整個進程就會掛起,即便進程中有些工做不依賴於輸入的數據,也將沒法執行

而線程能夠很好地解決這些缺陷

引入線程的緣由:減小程序在併發執行時所付出的時空開銷,使OS具備更好的併發性

 

(3)線程的出現

在80年代,出現了 能獨立運行的基本單位——線程(Threads)
注意:進程是資源分配的最小單位,線程是CPU調度和分派的最小單位, 每個進程中至少有一個線程

 

 

2.進程與線程的區別

  • 地址空間和其它資源(如打開文件):進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其它進程不可見
  • 通訊:進程間通訊IPC,線程間能夠直接讀寫進程數據段(如全局變量)來進行通訊——須要進程同步和互斥手段的輔助,以保證數據的一致性
  • 調度和切換:線程上下文切換比進程上下文切換要快得多
  • 在多線程操做系統中,進程不是一個可執行的實體

 

 

3.線程的特色

在多線程的操做系統中,一般是在一個進程中包括多個線程,每一個線程都是做爲利用CPU的基本單位,是花費最小開銷的實體。線程具備如下特色:
  • 輕型實體(不擁有系統資源,只是有一點必不可少的、能保證獨立運行的資源)
  • 獨立調度和分派的基本單位、切換很是迅速且開銷小(在同一進程中的)
  • 在同一進程中的各個線程能夠共享進程資源
  • 可併發執行
 

 

4.內存中的線程

多個線程共享同一個進程的地址空間中的資源,是對一臺計算機上多個進程的模擬,有時也稱線程爲輕量級的進程;而對一臺計算機上多個進程,則共享物理內存、磁盤、打印機等其餘物理資源。多線程的運行也多進程的運行相似,是cpu在多個線程之間的快速切換。

不一樣的進程之間是充滿敵意的,彼此是搶佔、競爭cpu的關係,如迅雷會和QQ搶資源。而同一個進程是由一個程序員的程序建立,因此同一進程內的線程是合做關係,一個線程能夠訪問另一個線程的內存地址,你們都是共享的

相似於進程,每一個線程也有本身的堆棧,不一樣於進程,線程庫沒法利用時鐘中斷強制線程讓出CPU,能夠調用thread_yield運行線程自動放棄cpu,讓另一個線程運行

線程一般是有益的,可是帶來了不小程序設計難度,線程的問題是:

  • 父進程有多個線程,那麼開啓的子線程是否須要一樣多的線程
  • 在同一個進程中,若是一個線程關閉了文件,而另一個線程正準備往該文件內寫內容呢?

所以,在多線程的代碼中,須要更多的心思來設計程序的邏輯、保護程序的數據

 

 

 

4、協程

1.協程介紹

協程:是單線程下的併發,又稱微線程,纖程

一句話說明什麼是線程:協程是一種用戶態的輕量級線程,即協程是由用戶程序本身控制調度的。、

注意:

1 python的線程屬於內核級別的,即由操做系統控制調度(如單線程遇到io或執行時間過長就會被迫交出cpu執行權限,切換其餘線程運行)
2 單線程內開啓協程,一旦遇到io,就會從應用程序級別(而非操做系統)控制切換,以此來提高效率(!!!非io操做的切換與效率無關)

 

對比操做系統控制線程的切換,用戶在單線程內控制協程的切換

優勢:

  • 協程的切換開銷更小,屬於程序級別的切換,操做系統徹底感知不到,於是更加輕量級
  • 單線程內就能夠實現併發的效果,最大限度地利用cpu

缺點:

  • 協程的本質是單線程下,沒法利用多核,能夠是一個程序開啓多個進程,每一個進程內開啓多個線程,每一個線程內開啓協程
  • 協程指的是單個線程,於是一旦協程出現阻塞,將會阻塞整個線程

 

協程特色:

  1. 必須在只有一個單線程裏實現併發
  2. 修改共享數據不需加鎖
  3. 用戶程序裏本身保存多個控制流的上下文棧
  4. 附加:一個協程遇到IO操做自動切換到其它協程(如何實現檢測IO,yield、greenlet都沒法實現,就用到了gevent模塊(select機制))

 

 

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多路複用

相關文章
相關標籤/搜索