进程、线程、堆、栈的理解和区别!
一:進程和線程的定義
(1)進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.?
(2)線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.
二:進程和線程的區別
進程在執行過程中擁有獨立的內存單元,而該進程的多個線程共享內存,從而極大地提高了程序的運行效率。?
每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。?
從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
在很多現代操作系統中,一個進程的(虛)地址空間大小為4G,分為系統(內核?)空間和用戶空間兩部分,系統空間為所有進程共享,而用戶空間是獨立的,一般WINDOWS進程的用戶空間為2G。?
一個進程中的所有線程共享該進程的地址空間,但它們有各自獨立的(/私有的)棧(stack),Windows線程的缺省堆棧大小為1M。堆(heap)的分配與棧有所不同,一般是一個進程有一個C運行時堆,這個堆為本進程中所有線程共享,windows進程還有所謂進程默認堆,用戶也可以創建自己的堆。?
用操作系統術語,線程切換的時候實際上切換的是一個可以稱之為線程控制塊的結構(TCB?),里面保存所有將來用于恢復線程環境必須的信息,包括所有必須保存的寄存器集,線程的狀態等。
多線程的適用場景是什么?為啥要用多線程?
使用多線程是為了提高程序運行的效率。假如有一個程序,要求用戶輸入多個算式,計算出結果,并分別打印到屏幕上。如果用戶一直沒有輸入,那么無法計算,更無法打印。如果用戶輸入了,必須要全部輸入完,才能計算出結果,再打印到屏幕。
使用線程的話,一個線程用來等待用戶輸入,一個用來計算結果,一個用來打印。用戶在輸入算式3的時候,計算線程在計算算式2,打印線程在打印算式1,三個線程同時進行,減少了等待,這樣就提高了運行效率
?三:堆和棧
堆:是大家共有的空間,分全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間。堆在操作系統對進程初始化的時候分配,運行過程中也可以向系統要額外的堆,但是記得用完了要還給操作系統,要不然就是內存泄漏。
棧:是個線程獨有的,保存其運行狀態和局部自動變量的。棧在線程開始的時候初始化,每個線程的棧互相獨立,因此,棧是 thread safe的。操作系統在切換線程的時候會自動的切換棧,就是切換 SS/ESP寄存器。棧空間不需要在高級語言里面顯式的分配和釋放。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的进程、线程、堆、栈的理解和区别!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下的线程属性
- 下一篇: 指针数组、数组指针、数组的区别与联系