1. 程式人生 > >python3.6入門到高階(全棧) day30 程序

python3.6入門到高階(全棧) day30 程序

1、作業系統瞭解

  現代的計算機系統主要是由一個或者多個處理器,主存,硬碟,鍵盤,滑鼠,顯示器,印表機,網路介面及其他輸入輸出裝置組成, 這些都是硬體裝置, 而作業系統就是負責呼叫這些硬體為使用者服務的.

  作業系統位於計算機硬體與應用軟體之間,本質也是一個軟體. 

  精簡的說的話,作業系統就是一個協調、管理和控制計算機硬體資源和軟體資源的控制程式。

2、作業系統發展中幾個比較重要的系統階段

  多道程式系統

     多道程式設計技術,就是指允許多個程式同時進入記憶體並執行。即同時把多個程式放入記憶體,並允許它們交替在CPU中執行,它們共享系統中的各種硬、軟體資源。當一道程式因I/O請求而暫停執行時,CPU便立即轉去執行另一道程式。

    特點: 空間複用:將記憶體分為幾部分,每個部分放入一個程式,這樣,同一時間記憶體中就有了多道程式.

        時間複用:當一個程式在等待I/O時,另一個程式可以使用cpu,如果記憶體中可以同時存放足夠多的作業,則cpu的利用率可以接近100%.

    缺點: 空間複用:程式之間的記憶體沒有確切分割,不由作業系統控制。如果記憶體彼此不分割,則一個程式可以訪問另外一個程式的記憶體。

        時間複用:必須等某個程式出現I/O阻塞, cpu才會進行切換, 否則該程式一直佔用cpu資源. 

  分時系統(互動式系統)

    把處理機的執行時間分成很短的時間片,按時間片輪流把處理機分配給各聯機作業使用。若某個作業在分配給它的時間片內不能完成其計算,則該作業暫時中斷,把處理機讓給另一作業使用,等待下一輪時再繼續其執行。由於計算機速度很快,作業執行輪轉得很快,給每個使用者的印象是,好象他獨佔了一臺計算機。而每個使用者可以通過自己的終端向系統發出各種操作控制命令,在充分的人機互動情況下,完成作業的執行。

    特點: 

      (1)多路性。若干個使用者同時使用一臺計算機。微觀上看是各使用者輪流使用計算機;巨集觀上看是各使用者並行工作.

      (2)互動性。使用者可根據系統對請求的響應結果,進一步向系統提出新的請求。這種能使使用者與系統進行人機對話的工作方式,又被稱為互動式系統.

      (3)及時性。系統可對使用者的輸入及時作出響應.

      (4)獨立性。使用者之間可以相互獨立操作,互不干擾。系統保證各使用者程式執行的完整性,不會發生相互混淆或破壞現象.     缺點:        計算機的效率變低 ( 分時系統的分時間片工作,在沒有遇到IO操作的時候就用完了自己的時間片被切走了,這樣的切換工作其實並沒有提高cpu的效率,反而使得計算機的效率降低了。為什麼下降了呢?因為CPU需要切換,並且記錄每次切換程式執行到了哪裡,以便下次再切換回來的時候能夠繼續之前的程式,雖然我們犧牲了一點效率,但是卻實現了多個程式共同執行的效果,這樣你就可以在計算機上一邊聽音樂一邊聊qq了 ) 。

3、什麼是程序

  程序: 就是執行中的程式. 當cpu呼叫程式計算時才是一個程序. 

  特點: 

    動態性:程序的實質是程式在多道程式系統中的一次執行過程,程序是動態產生,動態消亡的  

    併發性:任何程序都可以同其他程序一起併發執行

    獨立性:程序是一個能獨立執行的基本單位,同時也是系統分配資源和排程的獨立單位;

    非同步性:由於程序間的相互制約,使程序具有執行的間斷性,即程序按各自獨立的、不可預知的速度向前推進

    結構特徵:程序由程式、資料和程序控制塊三部分組成。

    多個不同的程序可以包含相同的程式:一個程式在不同的資料集裡就構成不同的程序,能得到不同的結果;但是執行過程中,程式不能發生改變。

4、併發與並行

  併發:是偽並行,即看起來是同時執行。單個cpu+多道技術就可以實現併發,(並行也屬於併發)

  並行:並行:同時執行,只有具備多個cpu才能實現並行

  記憶體中同時存入多道(多個)程式,cpu從一個程序快速切換到另外一個,使每個程序各自執行幾十或幾百毫秒,這樣,雖然在某一個瞬間,一個cpu只能執行一個任務,但在1秒內,cpu卻可以執行多個程序,這就給人產生了並行的錯覺,即偽並行,以此來區分多處理器作業系統的真正硬體並行(多個cpu共享同一個實體記憶體)

5、同步/非同步/阻塞/非阻塞

  程式的三個狀態

    就緒狀態: 當程序已分配到除CPU以外的所有必要的資源,只要獲得cpu便可立即執行,這時的程序狀態稱為就緒狀態。

    執行/執行狀態: 當程序已獲得cup,其程式正在cpu上執行,此時的程序狀態稱為執行狀態。

    阻塞狀態: 正在執行的程序,由於等待某個事件發生而無法執行時,便放棄cpu而處於阻塞狀態。引起程序阻塞的事件可有多種,例如,等待I/O完成、申請緩衝區不能滿足、等待信件(訊號)等。

  

  同步: 第一個程式執行完才執行第二個程式, 序列.

  非同步: 不需要等待第一個程式結束, 就可以執行第二個程式. 

  阻塞: 程式在等待某個指令之外不能做其他的事, 這個機制就是阻塞.

  非阻塞: 程式在等待某個指令之外, 還能做其他的事情, 即非阻塞. 

  同步阻塞: 程式被阻塞著, 除了等不能幹其他的事情, 效率最低.

  非同步阻塞: 非同步操作是可以被阻塞的, 不過不是在處理訊息時阻塞, 而是在等待訊息通知時被阻塞, 效率較低.

  同步非阻塞: 程式沒有阻塞, 但要在兩種不同的行為之間來回切換, 效率較低. 

  非同步非阻塞: 可以幹其他的事情而且不會被阻塞.

6、建立程序的兩種方式

  建立Process類的程序物件.

1 import os
 2 from multiprocessing import Process
 3 
 4 def func1(a):
 5     print(a)
 6     print("執行func1函式")
 7     print("子程序的程序號-----",os.getpid())
 8     print("子程序的父程序的程序號////////",os.getppid())       # 和主程序的程序號一樣
 9 
10 def func2():
11     print("執行func2函式")
12 
13 
14 
15 a = "123456"
16 if __name__ == '__main__':
17     # --------> 在windows下必須要寫的, 在建立子程序時, 系統會把當前模組內的所有程式碼複製一份到子程序中去,
18     # 加上 if __name__ == '__main__', 子程序執行時, __name__在子程序中為"__mp_main__", 不等於"__main__", 不會被執行. 
19 
20 
21 
22     p = Process(target=func1,args=(563,))     # 建立一個程序物件, args引數必須是一個元組的形式
23     p.start()       # 子程序執行start方法,並不是呼叫子程序, 而是告訴作業系統, 子程序建立好了, 可以讓cpu去呼叫子程序了
24 
25     print("主程序的程序號+++++",os.getpid())
26     print("執行到最後了")
27 
28 
29 
30 
31     print(a+"主程序",__name__)    # 放在  if __name__ == '__main__' 中, 只能執行一次
32 print(a+"子程序",__name__)   # 會被執行兩次
建立程序第一種方式

繼承Process類, 以類的方式建立程序.

1 from multiprocessing import Process
 2 
 3 class MyProcess(Process):
 4 
 5     def __init__(self,m):       # 想要傳參必須先繼承父類的__init__方法, 然後再封裝引數在物件中.
 6         super().__init__()
 7         self.m = m
 8 
 9     def run(self):          # 方法名一定是run(), 否則無意義.
10         print("執行run方法")
11         print(self.m)
12 
13 
14 
15 if __name__ == '__main__':
16 
17     p = MyProcess(360)       # 例項化自己定義的程序類
18     p.start()
建立程序的第二種方式

引數介紹:   1 group引數未使用,值始終為None

      2 target表示呼叫物件,即子程序要執行的任務

      3 name為子程序的名稱

 

      4 args表示呼叫物件的位置引數元組,args=(1,2,'egon',)

      5 kwargs表示呼叫物件的字典,kwargs={'name':'egon','age':18}

7、幾種方法

  p.terminate() : 強制終止程序

  p.is_alive() : 如果p還在執行,就返回True

  p.join() : 等待子程序結束後主程序再結束. 

  os.getpid() : 獲取該程序的程序號

  os.getppid() : 獲取該程序父程序的程序號

  p.pid: p程序的程序號

  p.name: p程序的名字

1 import time
 2 from multiprocessing import Process
 3 
 4 class MyProcess(Process):
 5 
 6     def __init__(self,m):       # 想要傳參必須先繼承父類的__init__方法, 然後再封裝引數在物件中.
 7         super().__init__()
 8         self.m = m
 9 
10     def run(self):          # 方法名一定是run(), 否則無意義.
11         print("執行run方法")
12         print(self.m)
13         time.sleep(5)
14         print("看看terminate好使不")
15 
16 
17 
18 if __name__ == '__main__':
19 
20     p = MyProcess(360)       # 例項化自己定義的程序類
21     p.start()
22 
23     p.terminate()       # 關閉程序,不會立即關閉,有個等著作業系統去關閉這個程序的時間,所以is_alive立刻檢視的結果可能還是存活,但是稍微等一會,就被關掉了
24     print(p.is_alive())       # True
25     time.sleep(0.1)
26     print(p.is_alive())         # False
幾種方法演示

8、程序之間的資料是隔離的, 一般情況下不同程序間的資料是相互訪問不到的.

 

1 from multiprocessing import Process
 2 
 3 numb = 100
 4 class MyProcess(Process):
 5 
 6     def run(self):
 7         global numb
 8         numb += 100
 9         print("子程序的numb: ",numb)            # numb都是200, 非同步,每個子程序都開始搶佔cpu資源
10 
11 
12 
13 
14 if __name__ == '__main__':
15 
16     p_lst = []
17     for i in range(10):
18         p = MyProcess()
19         p.start()
20         p_lst.append(p)         # 建立10個程序並加進列表裡
21     for p in p_lst:
22         p.join()         # 等所有的程序都跑完了再走主程序
23 
24     print(numb)             # 還是100, 說明建立的10個子程序都訪問不到主程序裡的numb, 空間隔離說法成立. 
驗證程序間的記憶體互相訪問不到

9、殭屍程序: 一個子程序退出, 那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序

   孤兒程序:一個父程序退出,而它的一個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。

   (瞭解ok)