天天看點

程序與線程總結

什麼是程序、線程

     程序是對運作時程式的封裝,時系統進行資源排程和配置設定的基本機關,實作了作業系統的并發;

     線程是程序的子任務,時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系統下,啟動一個新的程序必須配置設定給它獨立的位址空間,建立衆多的資料表來維護它的代碼段、堆棧段和資料段。

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

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

繼續閱讀