go並發編程(一)——進程
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。## 1.定義 ##所有代碼都是在進程中執行的,我們通常把一個程式的執行稱為一個進程。反過來說,進程用來描述程式的執行過程。因此,程式和進程成為了一對相依相靠的概念,他們分別描述了一個程式的靜態形式和動態特徵。除此之外,進程還是作業系統進行資源分派的一個基本單位。## 2.衍生 ##父進程 子進程## 3.進程標識 pid##進程的優先順序和狀態,虛擬位址以及各種存取權限等等這些詳細資料都儲存在進程描述符中。其中,進程描述符中儲存的pid是進程在作業系統中的唯一標識。pid為非負整數且順序的編號,pid可以被重複利用,當進程id已達到最大值,核心會從頭尋找閑置的進程id並使用最先找到的哪一個作為新進程的id。另外描述符中還會包含當前進程的父進程的id(常被稱為PPID)go裡面使用標準庫中的os提供的api來查看當前進程的pid和ppid:pid :=os.Getpid()ppid :=os.Getppid()pid對核心以外的程式非常有用。核心可以把pid高效的轉換為對應進程的描述符。我們可以使用shell命令(kill)來終結某個pid對應的進程。 也可以用類似的方法想某個進程發送訊號。## 4.進程狀態 ##每個進程在不同的時刻會有不同的狀態,這些可能的狀態共有6個:可運行狀態, 可中斷的睡眠狀態,不可中斷的睡眠狀態,暫停狀態或跟蹤狀態,殭屍狀態,退出狀態。## 可運行狀態: ##TASK_RUNNING,簡稱為R進程處在該狀態下,那麼說明他將要、立刻或者正在cpu上運行。啟動並執行時機是不確定的,這會由調度器進行調度## 可中斷的睡眠狀態: ##TASK_INTERRUPTIBLE,簡稱為S當進程等待某個事件的發生時會處於該狀態下。這樣的進程會被放入對應世間的等待隊列中。當事件發生時,等待隊列中一個或多個進程會被喚醒。## 不可中斷的睡眠狀態: ##TASK_UNINTTERRUPTIBLE,簡稱為D這種狀態下的進程不會對任何訊號做出響應。更確切的說,發送給該進程的訊號直到該進程從此狀態下轉出才會被傳遞過去。進程處於該狀態下通常是在等待某個特殊事件。比如等待同步的I/O操作(磁碟I/O等)的完成。在這裡可以把I/O理解為對輸入輸出資訊的處理## 暫停狀態或跟蹤狀態: ##TASK_STOPPED或TASK_TRACED,簡稱T向進程發送暫停訊號時進程就會轉入該狀態,除非該進程處於不可中斷的睡眠狀態下。向正處於暫停進程發送SIGCONT訊號會使該進程轉向可運行狀態。處於被跟蹤狀態的進程會暫停並等待跟蹤它的進程對他進行操作。跟蹤狀態與暫停狀態非常類似。但是,向處於暫停進程發送SIGCONT訊號並不會使他被恢複。只有當調試進程進行了相應的系統調用或者退出後,它才能恢複。## 殭屍狀態: ##TASK_DEAD_EXIT_ZOMBIE 簡稱為Z處於此狀態下的進程將要結束。該進程佔用的大多數資源也都被收回。不過還有一些資訊未被刪除,比如退出碼以及一些統計資訊。保留這些資訊是考慮到該進程的父進程可能需要他們。由於現在進程主體已被刪除而只留下了一個空殼,故此狀態被稱為殭屍狀態。## 退出狀態: ##TASK_DEAD-EXIT_DEAD,簡稱為X在進程退出的過程中,有可能連退出碼和統計資訊都不需要被保留。造成這種情況的原因可能是顯式的讓該進程的父進程忽略掉SIGCHLD訊號,也可能是該進程已經被分離。分離的含義是指父進程和子進程分別獨立運行。分離後的子程式將不會再使用和執行與父進程共用程式碼片段中的指令,而是載入一個全新的程式。在這些情況下,該進程在退出時就不會轉入殭屍狀態,而是直接轉入退出狀態。處於退出狀態的進程會立即被乾淨利落結束掉。他所佔用的資源會被系統自動回收。## 進程間轉化: ##簡單的來說,進程的狀態只分為可運行狀態和非可運行狀態兩個,由於暫停狀態和跟蹤狀態不同,所以也可以分為7個狀態![1525933037.jpg](https://static.studygolang.com/180510/e854ca4c148ba5e4b2098b57469930f5.jpg)339 次點擊