什么是線程?什么是進程?為什么要有線程?有什么關系與區別?


進程:

  • 程序執行時的一個實例
  • 每個進程都有獨立的內存地址空間
  • 系統進行資源分配和調度的基本單位
  • 進程里的堆,是一個進程中最大的一塊內存,被進程中的所有線程共享的,進程創建時分配,主要存放 new 創建的對象實例
  • 進程里的方法區,是用來存放進程中的代碼片段的,是線程共享的
  • 在多線程 OS 中,進程不是一個可執行的實體,即一個進程至少創建一個線程去執行代碼


      
為什么要有線程?

      每個進程都有自己的地址空間,即進程空間。一個服務器通常需要接收大量並發請求,為每一個請求都創建一個進程系統開銷大、請求響應效率低,因此操作系統引進線程。      

 


線程:

  • 進程中的一個實體
  • 進程的一個執行路徑
  • CPU 調度和分派的基本單位
  • 線程本身是不會獨立存在
  • 當前線程 CPU 時間片用完后,會讓出 CPU 等下次輪到自己時候在執行
  • 系統不會為線程分配內存,線程組之間只能共享所屬進程的資源
  • 線程只擁有在運行中必不可少的資源(如程序計數器、棧)
  • 線程里的程序計數器就是為了記錄該線程讓出 CPU 時候的執行地址,待再次分配到時間片時候就可以從自己私有的計數器指定地址繼續執行
  • 每個線程有自己的棧資源,用於存儲該線程的局部變量和調用棧幀,其它線程無權訪問

 

      
關系:

  • 一個程序至少一個進程,一個進程至少一個線程,進程中的多個線程是共享進程的資源
  • Java 中當我們啟動 main 函數時候就啟動了一個 JVM 的進程,而 main 函數所在線程就是這個進程中的一個線程,也叫做主線程
  • 一個進程中有多個線程,多個線程共享進程的堆和方法區資源,但是每個線程有自己的程序計數器,棧區域

如下圖



區別:

  •  本質:進程是操作系統資源分配的基本單位;線程是任務調度和執行的基本單位
  •  內存分配:系統在運行的時候會為每個進程分配不同的內存空間,建立數據表來維護代碼段、堆棧段和數據段;除了 CPU 外,系統不會為線程分配內存,線程所使用的資源來自其所屬進程的資源
  • 資源擁有:進程之間的資源是獨立的,無法共享;同一進程的所有線程共享本進程的資源,如內存,CPU,IO 等
  •  開銷:每個進程都有獨立的代碼和數據空間,程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行程序計數器和棧,線程之間切換的開銷小
  • 通信:進程間 以IPC(管道,信號量,共享內存,消息隊列,文件,套接字等)方式通信 ;同一個進程下,線程間可以共享全局變量、靜態變量等數據進行通信,做到同步和互斥,以保證數據的一致性
  • 調度和切換:線程上下文切換比進程上下文切換快,代價小
  • 執行過程:每個進程都有一個程序執行的入口,順序執行序列;線程不能夠獨立執行,必須依存在應用程序中,由程序的多線程控制機制控制
  • 健壯性:每個進程之間的資源是獨立的,當一個進程崩潰時,不會影響其他進程;同一進程的線程共享此線程的資源,當一個線程發生崩潰時,此進程也會發生崩潰,穩定性差,容易出現共享與資源競爭產生的各種問題,如死鎖等
  • 可維護性:線程的可維護性,代碼也較難調試,bug 難排查


進程與線程的選擇:

  • 需要頻繁創建銷毀的優先使用線程。因為進程創建、銷毀一個進程代價很大,需要不停的分配資源;線程頻繁的調用只改變 CPU 的執行
  • 線程的切換速度快,需要大量計算,切換頻繁時,用線程
  • 耗時的操作使用線程可提高應用程序的響應
  • 線程對 CPU 的使用效率更優,多機器分布的用進程,多核分布用線程
  • 需要跨機器移植,優先考慮用進程
  • 需要更穩定、安全時,優先考慮用進程
  • 需要速度時,優先考慮用線程
  • 並行性要求很高時,優先考慮用線程

 

Java 編程語言中線程是通過 java.lang.Thread 類實現的。

Thread 類中包含 tid(線程id)、name(線程名稱)、group(線程組)、daemon(是否守護線程)、priority(優先級) 等重要屬性。


 來一道刷了進BAT的面試題?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM