1. 程式人生 > >Python中建立程序的方法,以及併發並行,殭屍程序,孤兒程序的相關概念

Python中建立程序的方法,以及併發並行,殭屍程序,孤兒程序的相關概念

一、併發與並行

並行:多個計算機核心在同時處理多個任務,這時多個任務間是並行關係

併發:同時處理多個任務,但是核心在多個任務間不斷地切換,達到好像都在處理執行的效果,但實際一個時間點核心只能處理其中一個任務。

二、程序

 程序與執行緒是實現多工程式設計的實施方案

程序與執行緒:

程式:是一個可執行的檔案,是靜態的佔有磁碟空間,不佔有計算機的執行資源

程序:   是一個動態過程的描述,佔有計算機的資源,有一定的生命週期

*同一個程式的不同執行過程是不同的程序,佔用資源和生命週期都不一樣。

1、程序的建立流程:

   (1)使用者空間通過執行程式或者呼叫介面發起建立程序
   (2)作業系統接受使用者請求,開始建立程序
   (3)作業系統分配計算機資源,確定程序狀態,開闢程序空間等工作
   (4)作業系統將建立好的程序提供給應用程式使用

 2、關於程序的概念
    
   PCB(程序控制塊): 在記憶體中開闢的一塊空間,用來記錄程序的資訊。
                       程序控制塊是作業系統查詢識別程序的標誌。

   cpu時間片:如果一個程序佔有計算機核心,我們稱為該程序佔有計算機cpu時間片
       
              *多個任務之間是爭奪cpu的關係

              *誰佔有cpu最終是作業系統決定

    程序的狀態:

        三態 :

            *就緒態:程序具備執行條件,等待系統分配資源

            *執行態:程序佔有cpu處於執行態

             *等待態:程序暫時不具備執行條件,阻塞等待滿足條件後再執行

        五態(三態基礎上增加新建態,終止態): 

             *新建態:建立一個新的程序,獲取資源的過程

             *終止態:程序執行結束,資源釋放回收的過程

    程序的特徵:

            (1)程序之間執行互不影響,各自獨立執行

            (2)程序是作業系統資源分配的最小單位 

            (3)每個程序空間獨立,各自佔有一定的虛擬記憶體

三、多程序程式設計

    import   os  

    pid = os.fork()

     功能:建立新的程序

     引數:無

     返回值:失敗返回一個負數,

     成功:在原有程序中返回新的程序的PID號,在新的程序中返回0   
                

      *子程序會複製父程序全部程式碼段,包括fork之前產生的記憶體空間

      *子程序從fork的下一句開始執行,與父程序互不干擾

      *父子程序的執行順序是不一定的,父子程序共用一個終端 

      *父子程序通常會根據fork返回值的差異選擇執行不同的程式碼,所以if結構幾乎是fork的固定搭配

      *父子程序空間獨立,操作的都是本空間的內容,互不影響

      *子程序也有自己的特特性,比如PID號,PCB,命令集等

  

   程序相關的函式:

   獲取程序

           PID:os.getpid()

           功能:獲取當前程序的程序號

           返回值:返回程序號

                      

            os.getppid()

            功能:獲取當前程序父程序的的PID號

            返回值:返回程序號



             os._exit(status)

             功能:程序退出

             引數:程序的退出狀態



              sys.exit(status)

              功能:程序退出

              引數:數字表示退出狀態,不寫預設為0

                    字串,表示退出時列印的內容

           

             *sys.exit()  可以通過捕獲SystemExit異常阻止退出

      

   孤兒程序:父程序先於子程序退出,此時子程序稱為孤兒程序

   *孤兒程序會被作業系統指定的程序收養,系統程序就成為孤兒程序的新的父程序

     

   殭屍程序:子程序先於父程序退出,但是父程序沒有處理子程序的退出狀態,此時子程序就會成為殭屍程序

   *殭屍程序會存留少量PCB資訊在記憶體中,大量的殭屍程序會消耗系統資源,應該避免殭屍程序的產生

四、如何避免殭屍程序產生

     *處理子程序退出狀態

         pid,status = os.wait()

         功能:在父程序中阻塞等待處理子程序退出

         返回值:pid  退出的子程序的PID號

                 tatus  獲取子程序的退出狀態

                 

          pid,status = os.waitpid(pid,option)

          功能:在父程序中阻塞等待處理子程序退出

           引數:pid   -1   表示等待任意子程序退出

                        >0    表示等待對應PID號的子程序退出

               option   0  表示阻塞等待

                        WNOHANG  表示非阻塞

       *讓父程序先退出

                (1)父程序建立子程序等待子程序退出

                (2)子程序建立二級子程序後立即退出

                (3)二級子程序成為孤兒

五、multiprocessing模組建立程序

          1、需要將要執行的事情封裝為函式

          2、使用multiprocessing模組中Process類建立程序物件

          3、通過物件屬性設定和Process的初始化函式對程序進行設定,繫結要執行的函式

          4、啟動程序,會自動執行程序繫結的函式

          5、完成程序的回收

   

  Process()

   功能:建立程序物件

   引數:name    程序名稱    Process-1

        target   繫結函式

        args      元組    給target函式按照位置傳參

        kwargs    字典    給target函式按照鍵值對傳參

  p.start()

 功能:啟動程序

 *target函式會自動執行,此時程序真正被建立

  
 p.join([timeout])

 功能:阻塞等待回收子程序

 引數:超時時間  



*使用multiprocessing建立子程序,同樣子程序複製父程序的全部程式碼段,父子程序各自執行互不影響,父子程序有各自的執行空間

*如果不使用join回收子程序則子程序退出後會成為殭屍程序

*使用multiprocessing建立程序往往父程序只是用來建立程序回收程序