從App的角度看進程和線程

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

先看這麼幾個問題:編程

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

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

3,爲何打開的軟件越多就感受系統越慢?app

4,爲何你在用微信語音的時候,還能和別人聊天發消息?jvm

下面咱們帶着問題來學習一下這其中的知識:socket

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

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

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

這也就解釋了爲何打開的軟件越多系統就越卡頓,本質上軟件越多,打開的進程就越多,而每一個進程都須要必定能資源才能維持運行,咱們的操做系統的資源又是有限的,因此佔用的越多系統就會越繁忙,就會出現各類卡頓和反應變慢。

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

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

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

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

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

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

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

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

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

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

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

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

(8)進程不須要同步,線程通常須要同步

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

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

最後還有一個問題,子進程與線程有什麼關係?這裏須要注意子進程也是一個進程,通常用於多任務的操做系統,子進程也稱子任務與進程的性質是同樣的,也能夠包含一個或多個線程。

侏羅紀世界2

主演:克里斯·帕拉特 / 布萊絲·達拉斯·霍華德 / 泰德·拉文

貓眼電影演出 廣告

購買

總結:

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

相關文章
相關標籤/搜索