作業



1、簡述Linux進程內存空間分爲哪幾個段?作用分別是什麼?

 

答:Linux中的進程包含3個段,分別爲“數據段”、“代碼段”和“堆棧段”。

“數據段”:已被初始化的變量,包括全局變量和已被初始化的靜態變量;未初始化數據段,存儲未被初始化的靜態變量,又稱BBS

“代碼段”存放的是程序代碼的數據;

“堆棧段”存放的是子程序的返回地址、子程序的參數以及程序的局部變量等。

 

2、如何查看進程的信息(線程數):

三種方法:

(1) 使用top命令,具體用法是 top -H

          加上這個選項,top的每一行就不是顯示一個進程,而是一個線程。

2) 使用ps命令,具體用法是 ps -xH

        這樣可以查看所有存在的線程,也可以使用grep作進一步的過濾。

3) 使用ps命令,具體用法是 ps -mq PID ubuntu下貌似不能使用)

        這樣可以看到指定的進程產生的線程數目。

 

 

3、進程間通信方式有哪些?以及在什麼情況下用什麼通信方式?

(1)管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。

 

(2)有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關係進程間的通信

 

(3)信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段

 

(4)消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。

 

(5)信號 ( sinal ) : 信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生

 

(6)共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信

 

(7)套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,我們熟知的WWW服務、FTP服務、TELNET服務 等都是基於套接口編程來實現的。除了在異地的計算機進程間以外,套接口同樣適用於本地同一臺計算機內部的進程間通信。

 

4、進程同步的幾種方法?

Linux下,進程同步的解決方式主要有四種:

(1)信號量

(2) 文件鎖

(3) 無鎖CAS

(4) 校驗方式(CRC32校驗)

 

 

5、進程死鎖產生的原因及四個必要條件和解決預防

v  產生死鎖的原因主要是:

1) 因爲系統資源不足。

2) 進程運行推進的順序不合適。

3) 資源分配不當等。

如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則

就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。

v  產生死鎖的四個必要條件:

1 互斥條件:一個資源每次只能被一個進程使用。

2 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

3 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。

4 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

v 死鎖的解除與預防:

理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和

解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確

定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態

的情況下佔用資源。因此,對資源的分配要給予合理的規劃。

 

6、什麼是守護進程,什麼是殭屍進程?

答:

1.守護進程:

指在後臺運行的,沒有控制終端與之相連的進程。它獨立於控制終端,通常週期性地執行某種任務。Linux的大多數服務器都是使用守護進程的方式實現。

 

2.殭屍進程:

當子進程先於父進程終止,而父進程又沒有調用wait函數等待子進程結束,子進程進入僵死狀態,並且會一直保持下去除非系統重啓.子進程處於僵死狀態,內核只保存該進程的一些必要信息以備父進程所需.此時子進程始終佔用着資源,同時也減少了系統可以創建的最大進程數;如果子進程先於父進程終止,且父進程調用了waitwaitpid函數,則父進程會等待子進程結束

 

 

 

7、解釋一下進程同步和進程互斥的區別?

進程之間的相互作用關係分爲兩種,一種是共享資源的關係,一種是相互合作的關係,前者屬於進程互斥、後者屬於進程同步。

進程互斥:進程間的間接作用關係。兩個或兩個以上的進程,不能同時進入關於同一組共享變量的臨界區域。比較典型的問題是打印機的共享訪問。

進程同步:進程間的直接作用關係。在多道程序環境下,進程是併發執行的,不同進程之間存在着不同的相互制約關係。比較典型的問題有生產消費者問題、哲學家進餐問題等。

 

8、進程與線程之間有何區別?

答:1.進程是一個具有一定獨立功能的程序的一次運行活動,同時也是資源分配的最小單元;而線程是進程的一個執行流,CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

2.進程有獨立的地址空間,線程沒有單獨的地址空間(同一進程內的線程共享進程的地址空間)。所以,一個進程崩潰後,在保護模式下不會對其它進程產生影響;而線程只是一個進程中的不同執行路徑。

3.線程有自己的堆棧和局部變量,但線程沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯

4.但在進程切換時,耗費資源較大,其效率比不上線程高

9、線程同步有哪些方法?

答:進行多線程編程,因爲無法知道哪個線程會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決線程之間對資源的競爭,以到達線程同步的目的:

        1 互斥量Mutex

        2 信號燈Semaphore

        3 條件變量Conditions

 

10、父子進程終止順序到底會造成什麼樣的影響?

v  父進程在子進程之前終止

對於父進程已經終止的所有進程,它們的父進程都改變爲init進程。我們稱這些進程由init進程收養。其操作過程大致是:在一個進程終止時,內核逐個檢查所有活動的進程,以判斷它是否是要終止進程的子進程,如果是,則該進程父進程ID就更改爲1init進程的ID)。

 

v 子進程在父進程之前終止

如果子進程在父進程之前終止時,內核爲每個終止的子進程保存了一定量的信息,所以當終止進程的父進程調用waitwaitpid時,可以得到這些信息。內核可以釋放終止進程所使用的所有存儲區,關閉其所有打開文件,但至少會保存包括進程ID、該進程的終止狀態以及該進程使用的CPU時間總量等信息。

一個已經終止、但是其父進程尚未對其進行善後處理(獲取終止子進程的有關信息、釋放它仍佔用的資源)的進程被稱爲僵死進程。

1、簡述Linux進程內存空間分爲哪幾個段?作用分別是什麼?

 

答:Linux中的進程包含3個段,分別爲“數據段”、“代碼段”和“堆棧段”。

“數據段”:已被初始化的變量,包括全局變量和已被初始化的靜態變量;未初始化數據段,存儲未被初始化的靜態變量,又稱BBS

“代碼段”存放的是程序代碼的數據;

“堆棧段”存放的是子程序的返回地址、子程序的參數以及程序的局部變量等。

 

2、如何查看進程的信息(線程數):

三種方法:

(1) 使用top命令,具體用法是 top -H

          加上這個選項,top的每一行就不是顯示一個進程,而是一個線程。

2) 使用ps命令,具體用法是 ps -xH

        這樣可以查看所有存在的線程,也可以使用grep作進一步的過濾。

3) 使用ps命令,具體用法是 ps -mq PID ubuntu下貌似不能使用)

        這樣可以看到指定的進程產生的線程數目。

 

 

3、進程間通信方式有哪些?以及在什麼情況下用什麼通信方式?

(1)管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。

 

(2)有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關係進程間的通信

 

(3)信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段

 

(4)消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。

 

(5)信號 ( sinal ) : 信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生

 

(6)共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信

 

(7)套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,我們熟知的WWW服務、FTP服務、TELNET服務 等都是基於套接口編程來實現的。除了在異地的計算機進程間以外,套接口同樣適用於本地同一臺計算機內部的進程間通信。

 

4、進程同步的幾種方法?

Linux下,進程同步的解決方式主要有四種:

(1)信號量

(2) 文件鎖

(3) 無鎖CAS

(4) 校驗方式(CRC32校驗)

 

 

5、進程死鎖產生的原因及四個必要條件和解決預防

v  產生死鎖的原因主要是:

1) 因爲系統資源不足。

2) 進程運行推進的順序不合適。

3) 資源分配不當等。

如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則

就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。

v  產生死鎖的四個必要條件:

1 互斥條件:一個資源每次只能被一個進程使用。

2 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

3 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。

4 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。

v 死鎖的解除與預防:

理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和

解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確

定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態

的情況下佔用資源。因此,對資源的分配要給予合理的規劃。

 

6、什麼是守護進程,什麼是殭屍進程?

答:

1.守護進程:

指在後臺運行的,沒有控制終端與之相連的進程。它獨立於控制終端,通常週期性地執行某種任務。Linux的大多數服務器都是使用守護進程的方式實現。

 

2.殭屍進程:

當子進程先於父進程終止,而父進程又沒有調用wait函數等待子進程結束,子進程進入僵死狀態,並且會一直保持下去除非系統重啓.子進程處於僵死狀態,內核只保存該進程的一些必要信息以備父進程所需.此時子進程始終佔用着資源,同時也減少了系統可以創建的最大進程數;如果子進程先於父進程終止,且父進程調用了waitwaitpid函數,則父進程會等待子進程結束

 

 

 

7、解釋一下進程同步和進程互斥的區別?

進程之間的相互作用關係分爲兩種,一種是共享資源的關係,一種是相互合作的關係,前者屬於進程互斥、後者屬於進程同步。

進程互斥:進程間的間接作用關係。兩個或兩個以上的進程,不能同時進入關於同一組共享變量的臨界區域。比較典型的問題是打印機的共享訪問。

進程同步:進程間的直接作用關係。在多道程序環境下,進程是併發執行的,不同進程之間存在着不同的相互制約關係。比較典型的問題有生產消費者問題、哲學家進餐問題等。

 

8、進程與線程之間有何區別?

答:1.進程是一個具有一定獨立功能的程序的一次運行活動,同時也是資源分配的最小單元;而線程是進程的一個執行流,CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

2.進程有獨立的地址空間,線程沒有單獨的地址空間(同一進程內的線程共享進程的地址空間)。所以,一個進程崩潰後,在保護模式下不會對其它進程產生影響;而線程只是一個進程中的不同執行路徑。

3.線程有自己的堆棧和局部變量,但線程沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯

4.但在進程切換時,耗費資源較大,其效率比不上線程高

9、線程同步有哪些方法?

答:進行多線程編程,因爲無法知道哪個線程會在哪個時候對共享資源進行操作,因此讓如何保護共享資源變得複雜,通過下面這些技術的使用,可以解決線程之間對資源的競爭,以到達線程同步的目的:

        1 互斥量Mutex

        2 信號燈Semaphore

        3 條件變量Conditions

 

10、父子進程終止順序到底會造成什麼樣的影響?

v  父進程在子進程之前終止

對於父進程已經終止的所有進程,它們的父進程都改變爲init進程。我們稱這些進程由init進程收養。其操作過程大致是:在一個進程終止時,內核逐個檢查所有活動的進程,以判斷它是否是要終止進程的子進程,如果是,則該進程父進程ID就更改爲1init進程的ID)。

 

v 子進程在父進程之前終止

如果子進程在父進程之前終止時,內核爲每個終止的子進程保存了一定量的信息,所以當終止進程的父進程調用waitwaitpid時,可以得到這些信息。內核可以釋放終止進程所使用的所有存儲區,關閉其所有打開文件,但至少會保存包括進程ID、該進程的終止狀態以及該進程使用的CPU時間總量等信息。

一個已經終止、但是其父進程尚未對其進行善後處理(獲取終止子進程的有關信息、釋放它仍佔用的資源)的進程被稱爲僵死進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章