從App的角度看進程和線程

從App的角度看進程和線程

在現在人人都有一部手機或電腦的年代,我們幾乎天天都在使用各種app,如微信,QQ,抖音,優酷等等軟件,表面上我們是與各種app交互,但如果站在操作系統的角度來看,其實我們每天都是在和各種進程或者線程打交道,如果你已經有點疑惑了,沒關係,下面我們慢慢來聊個明白。

先看這麼幾個問題:

1,你手機或者電腦上裝的各種app在本質上是什麼?

2,一個軟件打開和不打開的區別是什麼?

3,為什麼打開的軟件越多就感覺系統越慢?

4,為什麼你在用微信語音的時候,還能和別人聊天發消息?

下面我們帶著問題來學習一下這其中的知識:

首先對於第一個問題比較簡單,我們的各種app其實都是一個軟件,描述的再專業一些就是一個程序或者一份能執行的代碼。

第二個問題,在使用者層面,打開了就是能用的app,不打開就是一個快捷圖標,但在操作系統層面就不一樣了,打開時候操作系統實際上會創建一個進程來運行,而關閉的時候,進程就會退出。

那麼問題來了,什麼是進程:簡單的說就是一個正在運行的程序實例。 程序的運行是需要內存和各種操作系統資源的,不同的程序使用的資源是不一樣的,比如你打開一個吃雞遊戲和打開一個記事本兩者消耗的資源是有很大差異的。

這也就解釋了為什麼打開的軟件越多系統就越卡頓,本質上軟件越多,打開的進程就越多,而每個進程都需要一定能資源才能維持運行,我們的操作系統的資源又是有限的,所以佔用的越多系統就會越繁忙,就會出現各種卡頓和反應變慢。

僅僅把軟件運行起來還是不夠的,因為我們還要在軟件裡面各種交互,比如使用微信語音的同時,還能給對方發圖片,或者撈個漂流瓶。再或者使用有道雲筆記的時候,你在不停的寫字,後臺有一個線程會自動每隔一段時間保存一下內存,避免突然斷電時內容全部丟失,這底層其實就是使用不同的線程來處理的。

到這裡,我們在總結下進程和線程的定義:

進程:一個正在運行的程序實例,包含一個或多個線程,最少有一個線程。

線程:執行進程的一部分程序或者代碼指令。

那麼他們之間的區別和聯繫是什麼?

從App的角度看進程和線程

(1)進程包含至少一個線程,果只有一個線程,這個線程通常叫做主線程。線程是進程的一部分代碼或者指令

(2)進程有獨立的內存存儲,線程共享進程的內存空間,此外線程有自己獨立的的棧存儲。

(3)進程通信只能依靠pipe管道或者socket,一個進程內的線程可以直接通信

(4)創建一個進程是重量級操作,而創建一個線程是輕量級操作

(5)進程的文件描述符大部分不共享,線程共享文件描述符

(6)進程有獨立的signal信號,線程共享進程的signal信號

(7)進程相互之間不依賴,線程之間有依賴。

(8)進程不需要同步,線程一般需要同步

(9)進程是數據組織的概念,線程是cpu調度的概念

(10) 進程上下文切換慢,線程上下文切換快

最後還有一個問題,子進程與線程有什麼關係?這裡需要注意子進程也是一個進程,一般用於多任務的操作系統,子進程也稱子任務與進程的性質是一樣的,也可以包含一個或多個線程。

總結:

本文主要介紹了操作系統中進程和線程的定義,區別和聯繫。瞭解這些知識將更加有助於我們學習和使用多線程編程。有一點需要大家注意,進程是程序的運行實例,類似面向對象編程裡面的對象,而程序則更像是一個類,通過這個程序我們可以構造多個對象,也就是我們可以啟動多個進程,比如PC上的QQ是可以啟動數個的,當然跟軟件有關係,有些軟件只能啟動一個,每啟動一個程序,其實就是啟動了一個進程。如在java的程序裡面每啟動一個main方法,其實就是啟動了一個jvm進程,而main方法就是我們上面所說的進程中至少包含一個線程的主線程。


分享到:


相關文章: