進程與線程總結

什麼是進程、線程

     進程是對運行時程序的封裝,時系統進行資源調度和分配的基本單位,實現了操作系統的併發;

     線程是進程的子任務,時CPU調度和分配的基本單位,用於保證程序的實時性,實現進程內部的併發,線程是操作系統可識別的最下執行單位和調度單位。每個線程都獨佔用一個虛擬處理器:獨自的寄存器組,指令計數器和處理器狀態,每個線程完成不同的動態內存,但是共享同一地址空間(同樣的動態內存,映射地址,目標代碼等等),打開的文件隊列和其他內核資源。


區別

  1. 一個線程只能屬於一個進程,而一個進程可以用多個線程,但至少有一個線程,線程依賴進程而存在
  2. 進程在執行過程中游泳獨立的內存單元,而多個線程共享進程的內存(資源分配給進程,同一進程的所有線程共享該進程的所有資源,同一進程中的多個線程共享代碼段,數據段(全局變量和靜態變量),擴展段(堆存儲),但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量)
  3. 進程是資源分配的最下單位,線程是CPU調度的最下單位
  4. 系統開銷:由於在創建和這撤銷進程時,系統都要爲之分配和回收資源,如內存空間、I/O設備等,因此,操作系統所付出的開銷將顯著地大於在創建或撤銷時的開銷。類似地,在進程切換時,涉及到整個當前進程CPU環境的保存以及新被調度運行的進程的CPU環境設置。而線程切換隻須保存和設置少量寄存器的內容,並不涉及存儲器管理方面的操作,所以進程的切換開銷遠大於線程切換的開銷
  5. 通信:由於同一進程中的多個線程具有相同的地址空間,使它們之間的同步和通信的實現也變得比較容易。進程間通信IPC,線程間也可以直接讀寫進程數據段來進行通信——需要進程同步和互斥手段的輔助,以保證數據的一致性。在有的系統中,線程的切換、同步和通信都無須操作系統內核的干預
  6. 進程編程調試簡單可靠性高,但是創建銷燬開銷大;線程相反,開銷小,切換速度快,但是編程調試相對複雜
  7. 進程間不會相互影響,線程一個線程掛掉將導致整個進程廢掉
  8. 進程適應於多核,多機分佈;線程適用於多核

進程間通信的方式

進程間通信主要通過管道、系統IPC(包括消息隊列,信號量,信號,共享內存等),套接字socket

1.管道:

        管道主要包括無名管道和命名管道,管道可用於具有親緣關係的父子進程間的通信,有名管道除了具有管道所具有的功能外,它還允許無親緣關係進程間的通信

        1.1普通PIPE管道

             ①它是半雙工的(數據只能在一個方向上流動),具有固定的讀端和寫端

             ②它只能用於具有親緣關係的進程之間的通信(父子,兄弟進程之間)

             ③它可以看成是一種特殊文件,對於它的讀寫也可以使用普通的read,write等函數。但它不是普通的文件,並不屬於其                他任何文件系統,並且只存在於內存中。

       1.2命名管道FIFO

             ①FIFO可以在無關的進程之間交換數據

             ②FIFO有路徑名與之相關聯,它以一種特殊設備文件形式存在於文件系統中

2系統IPC

        2.1消息隊列

          消息隊列是消息的鏈接表,存放在內核中,一個消息隊列由一個標識符來標記。消息隊列克服了信號傳遞信息少,管道只能承載無格式字節流以及緩衝區大小受限等特點。具有寫權限的進程可以按照一定的規則向消息隊列中添加新信息,對消息隊列有讀權限的進程可以從消息隊列中讀取信息

         特點:

                  ①消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級

                  ②消息隊列獨立於發送與接收進程,進程終止時,消息隊列及其內容並不會刪除。

                 ③消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取

      2.2信號量

        信號量與IPC結構不同,它是一個計數器,可以用來控制多個進程對共享資源的訪問。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間的數據

        特點:

                ①信號量用於進程間同步,若要在進程間傳遞數據需要結合共享內存

                ②信號量基於操作系統的PV操作,程序對信號量的操作都是原子操作

                ③每次對信號量的PV操作不僅限於對信號量值加1或減1,而且可以加減任意正整數。

                ④支持信號量組

     2.3信號

               信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生

     2.4共享內存

             共享內存使得多個進程可以訪問同一塊內存空間,不同進程可以及時看到對方進程中對共享內存中的數據的更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量

           特點:

                ①共享內存是最快的一種IPC,因爲進程是直接對內存進行讀取

                ②因爲多個進程可以同時操作,所以需要進行同步

                ③信號量+共享內存通常結合在一起使用,信號量用來同步對共享內存的訪問

     3套接字socket

      socket是一種進程間通信機制,與其它通信機制不同的是它可以用於不同主機之間的通信


線程間的通信方式

      臨界區:通過多線程的串行化來訪問公共資源或一段代碼段,速度快,適合控制數據訪問

     互斥量:採用互斥對象機制,只有擁有互斥對象的線程纔有訪問公共資源的權限。因爲互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問

     信號量:爲控制具有有限數量的用戶資源而設計的,它允許多個線程在同一時刻去訪問此資源的最大線程數目

     事件(信號):通過通知操作的方式來保持多線程同步,還可以方便的實現多線程優先級的比較操作


線程產生的原因

      進程可以使多個程序併發執行,以提高資源的利用率和系統的吞吐量,但進程同一時間只能幹一件事,進程在執行的過程中如果阻塞,整個進程都會掛起,即使進程中有些工作不依賴於等待的資源,任然不會執行。因此操作系統引入了比進程粒度更小的線程,作爲併發執行的基本單位,從而減少程序在併發執行時所付出的時空滯銷,提高併發性。

     從資源上講,線程是一種非常節儉的多任務操作方式。在Linux系統下,啓動一個新的進程必須分配給它獨立的地址空間,建立衆多的數據表來維護它的代碼段、堆棧段和數據段。

     從切換效率上講,運行一個進程中的多個線程,它們之間使用相同的地址空間,而且線程間彼此切換所需要的時間也遠遠小於進程間切換的時間。

    從通信機制上講,對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過進程間的通信的方式,不僅浪費時間而且很不方便。線程則不同,由於同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接爲其他線程所使用,不僅快捷而且方便

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章