【Linux】---進程和線程(面試常考點)

注:本文集結了很多大廠小夥伴的面經,嘔心瀝血撰寫而成!!!

1.進程是什麼

答:進程(Process)是指計算機中已運行的程序,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。進程是程序真正運行的實例,若干進程可能與同一個程序相關,且每個進程皆可以同步或異步的方式獨立運行。(來自百度百科)

2.爲什麼引入進程

答:進程是爲了提高CPU的執行效率,減少因爲程序等待帶來的CPU空轉以及其他計算機硬件資源浪費而提出的。

3.進程特點

(1)動態性
  進程是程序的一次執行過程,動態產生且動態消亡;
(2)併發性
  進程同其他進程一起向前推進;
(3)異步性
  進程按照各自的速度向前推進(每一個進程按照自定邏輯,不考慮其他進程的運行,各自佔用CPU);
(4)獨立性
  進程是系統分配資源和調度CPU的單位(但是有了線程後,操作系統調度CPU的單位就變成了線程)。

4.進程間通信方式有哪些(重點)

管道(pipe)
有名管道(named pipe)
信號量(semophore)
消息隊列(message queue)
信號(signal)
套接字(socket)

5.如何用代碼創建一個進程呢?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
printf("hello proc : %d!, ret: %d\n", getpid(), ret);
sleep(1);
return 0;
}

6.什麼是線程?

答:線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。每一個程序都至少有一個線程,那就是程序本身。
線程是程序中一個單一的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱爲多線程。

7.爲什麼引入線程?

答:爲了減少進程間切換和創建的開銷,提高執行效率和節省資源。

8.線程間通信方式有哪些?

事件(Event)
信號量(semaphore)
互斥量(mutex)
臨界區(Critical section)

9.線程的優點

1)創建一個新線程的代價要比創建一個新進程小得多
2)與進程之間的切換相比,線程之間的切換需要操作系統做的工作要少很多
3)線程佔用的資源要比進程少很多
4)能充分利用多處理器的可並行數量
5)在等待慢速I/O操作結束的同時,程序可執行其他的計算任務
6)計算密集型應用,爲了能在多處理器系統上運行,將計算分解到多個線程中實現
7)I/O密集型應用,爲了提高性能,將I/O操作重疊。線程可以同時等待不同的I/O操作。

10.線程的缺點

  • 性能損失
    一個很少被外部事件阻塞的計算密集型線程往往無法與共它線程共享同一個處理器。如果計算密集型線程的數量比可用的處理器多,那麼可能會有較大的性能損失,這裏的性能損失指的是增加了額外的同步和調度開銷,而可用的資源不變。
  • 健壯性降低
    編寫多線程需要更全面更深入的考慮,在一個多線程程序裏,因時間分配上的細微偏差或者因共享了不該共享的變量而造成不良影響的可能性是很大的,換句話說線程之間是缺乏保護的。
  • 缺乏訪問控制
    進程是訪問控制的基本粒度,在一個線程中調用某些OS函數會對整個進程造成影響。
  • 編程難度提高
    編寫與調試一個多線程程序比單線程程序困難得多

11.什麼是線程異常?

  • 1)單個線程如果出現除零,野指針問題導致線程崩潰,進程也會隨着崩潰
  • 2)線程是進程的執行分支,線程出異常,就類似進程出異常,進而觸發信號機制,終止進程,進程終止,該進程內的所有線程也就隨即退出

12.代碼如何實現一個線程?

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
void *rout(void *arg) {
  int i;
  for( ; ; ) {
    printf("I'am thread 1\n");
    sleep(1);
 }
}
int main( void )
{
  pthread_t tid;
  int ret;
  if ( (ret=pthread_create(&tid, NULL, rout, NULL)) != 0 ) {
    fprintf(stderr, "pthread_create : %s\n", strerror(ret));
    exit(EXIT_FAILURE);
 }
  int i;
  for(; ; ) {
    printf("I'am main thread\n");
    sleep(1);
 }
}

13.什麼時候用進程?什麼時候用線程?

進程與線程的選擇取決以下幾點:

  • 需要頻繁創建銷燬的優先使用線程;因爲對進程來說創建和銷燬一個進程代價是很大的;
  • 線程的切換速度快,所以在需要大量計算,切換頻繁時用線程,還有耗時的操作使用線程可提高應用程序的響應;
  • 因爲對CPU系統的效率使用上線程更佔優,所以可能要發展到多機分佈的用進程,多核分佈用線程;
  • 並行操作時使用線程,如C/S架構的服務器端併發線程響應用戶的請求; 需要更穩定安全時,適合選擇進程;需要速度時,選擇線程更好;
  • I/O密集型和CPU密集型適合多線程。

14.進程和線程的區別?(點擊率最高)

  • 調度:線程是獨立調度的基本單位,進程是擁有資源的基本單位。在同一進程 中,線程的切換不會引起進程的切換;在不同的進程中,進行線程切換,則會引起進程的切換。

  • 擁有資源:進程是擁有資源的基本單位,線程不擁有資源,但線程可以共享器隸屬進程的系統資源。

  • 併發性:進程可以併發執行,而且同一進程內的多個線程也可以併發執行,大大提高了系統的吞吐量。

  • 系統開銷:創建和撤銷進程時,系統都要爲之分配或回收資源,在進程切換時,涉及當前執行進程CPU環境的保存以及新調度的進程CPU環境的設置;而線程切換時只需保存和設置少量寄存器內容,因此開銷很小,另外,由於同一進程內的多個線程共享進程的地址空間,因此這些線程之間的同步與通信比較容易實現,甚至無須操作系統的干預。

  • 通信方面:進程間通信需要藉助操作系統,而線程間可以直接讀/寫進程數據段來進行通信。同一個進程下,線程共享全局變量、靜態數據等數據,進程之間的通信需要以通信的方式(IPC)進行.

  • 安全方面:多進程程序更安全,生命力強,一個進程死掉不會對另一個進程造成影響(源於有獨立的地址空間);多線程程序更不易維護,一個線程死掉,整個進程就死掉了(因爲共享地址空間);

    進程對資源保護要求高,開銷大,效率相對較低;線程資源保護要求不高,但開銷小,效率高,可頻繁切換。

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