進(jìn)程&線程

寫這篇博客(不僅僅是這篇)的初衷是在朋友的推薦下,閱讀了一篇文章你應(yīng)該知道的JAVA面試題,里面提出了若干方面的面試題,有興趣的你可以點(diǎn)進(jìn)去看一下。文章的作者是阿里的一位技術(shù)大牛方騰飛,從這一角度來看我認(rèn)為還是非常有意義、有價(jià)值的面試題。我與朋友約定,站在自身的知識角度共同來答復(fù)這些面試題。一方面在于分享與共同探討知識,二是培養(yǎng)自己的思考寫作習(xí)慣,提升自己。本文僅僅是開始。


進(jìn)程

進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。在當(dāng)代面向線程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中,進(jìn)程是線程的容器。程序是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程是程序的實(shí)體。

進(jìn)程相對于程序而言,進(jìn)程是一個(gè)活動的實(shí)體,而程序是一個(gè)沒有生命的實(shí)體。只有當(dāng)系統(tǒng)在執(zhí)行程序時(shí),它才能轉(zhuǎn)為一個(gè)活動的實(shí)體(進(jìn)程)。

進(jìn)程的狀態(tài)圖示如下:


進(jìn)程狀態(tài)圖

線程

線程,有時(shí)被稱為輕量級進(jìn)程,是程序執(zhí)行流的最小單元。一個(gè)標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成。

已經(jīng)有可進(jìn)程,為何要引入線程呢?

60年代,在OS中能擁有資源和獨(dú)立運(yùn)行的基本單位是進(jìn)程,然而隨著計(jì)算機(jī)技術(shù)的發(fā)展,進(jìn)程出現(xiàn)了很多弊端,一是由于進(jìn)程是資源擁有者,創(chuàng)建、撤消與切換存在較大的時(shí)空開銷,因此需要引入輕型進(jìn)程;二是由于對稱多處理機(jī)(SMP)出現(xiàn),可以滿足多個(gè)運(yùn)行單位,而多個(gè)進(jìn)程并行開銷過大。
因此在80年代,出現(xiàn)了能獨(dú)立運(yùn)行的基本單位——線程(Threads)。

總之,相較進(jìn)程而言,線程更加輕巧,同一進(jìn)程內(nèi)的線程切換更加迅速且開銷小。線程可并發(fā)執(zhí)行(你也可以嘗試著去了解并行與并發(fā)的區(qū)別),共享進(jìn)程資源。在多線程操作系統(tǒng)中,進(jìn)程不再是一個(gè)可執(zhí)行的實(shí)體,由線程所取代。

線程的狀態(tài)跟進(jìn)程類似,也有就緒,運(yùn)行,阻塞狀態(tài),不過可能細(xì)節(jié)更加豐富具體。
線程的狀態(tài)示意圖如下:


引自[并發(fā)編程的藝術(shù)]

區(qū)別總結(jié)

上面的闡述中或多或少都有些線程與進(jìn)程的區(qū)別描述,這里做下總結(jié)。

  • 地址空間和其它資源(如打開文件):進(jìn)程間相互獨(dú)立,同一進(jìn)程的各線程間共享。某進(jìn)程內(nèi)的線程在其它進(jìn)程不可見。
  • 通信:進(jìn)程間通信與線程間通信方式不同。
  • 調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多。
  • 在多線程OS中,進(jìn)程不是一個(gè)可執(zhí)行的實(shí)體。

通信方式

進(jìn)程間通信,參考文章如下:
進(jìn)程間通信方式
進(jìn)程間通信介紹

線程間通信,參考文章如下:
線程通信
線程間的通信、同步方式與進(jìn)程間通信方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容