進程與線程的區別? 進程間通信與線程間通信

要理解進程與線程先來看多任務機制:

  1. 多任務處理機制是指用戶可以在同一時間內運行多個應用程序,每個正在執行的應用程序被稱爲一個任務。多任務操作是系統使用某種調度(shedule)支持多個任務併發執行,多任務操作系統通常有三個基本概念:任務、進程和線程

  2. 進程的基本概念:進程是指一個具有獨立功能的程序在某個數據集合上的動態執行過程,它是操作系統進行資源分配的基本單元。簡單的說,進程是一個程序的一次執行過程。例如打開一個Windows資源管理器是在執行一次進程,運行一個瀏覽器閱讀Web網頁也是在執行一次進程。進程具有併發性、動態性、交互性和獨立性等重要特性。
    進程和程序的區別程序是一段靜態的代碼,是一段指令和數據的有序集合,沒有任何執行的概念,程序是永久的、靜態的。進程是一個動態的概念,它是程序的一次執行過程(在RAM上執行),包括了動態創建、調度、執行和消亡的整個過程,它是程序執行和資源分配的最小單位,進程是暫時的、動態的。

  3. 線程的基本概念:通常線程是指共享相同地址空間的多個任務。線程最大的特點就是在同一個進程中創建的線程共享該進程的地址空間,線程和進程都參與統一調度。多線程的優點體現於:①大大提高任務切換的效率;②線程間通信方便,因爲在同一塊地址空間數據共享。缺點:因爲共享地址空間,如果其中一個線程出錯,整個線程都會崩潰。

  4. 概括進程與線程之間的區別
    根本區別:進程是操作系統資源分配的基本單位,而線程是任務調度和執行的基本單位。
    開銷方面:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。
    所處環境:在操作系統中能同時運行多個進程(程序);而在同一個進程(程序)中有多個線程同時執行(通過CPU調度,在每個時間片中只有一個線程執行)。
    內存分配方面:系統在運行的時候會爲每個進程分配不同的內存空間;而對線程而言,除了CPU外,系統不會爲線程分配內存(線程所使用的資源來自其所屬進程的資源),線程組之間只能共享資源。
    包含關係:沒有線程的進程可以看做是單線程的,如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱爲輕權進程或者輕量級進程。

進程間通信
每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到,所以進程之間交換數據要靠內核,在內核中開闢一塊緩衝區,進程1把數據從用戶空間複製到內核緩衝區,進程2再從內核緩衝區把數據讀走,內核提供的這種機制稱爲進程間通信(InterProcess Communication,IPC)。
使用較多的進程間通信的方式主要有以下幾種:
管道(Pipe)及有名管道(Named Pipe)。管道可用於具有親緣關係進程間的通信,有名管道,除了具有管道所具有的功能外,它還允許無親緣關係進程間的通信。
共享內存(Shared Memory)。可以說這是最有用的進程間通信方式。它使得多個進程可以訪問同一塊內存空間,不同進程可以及時看到對方進程中對共享內存中數據的更新。這種通信方式需要依靠某種同步機制,如互斥鎖和信號量等。
消息隊列(Message Queue)。消息隊列是消息的鏈接表,包括Posix消息隊列和SystemV消息隊列。它克服了前兩種通信方式中信息有限的缺點,具有寫權限的進程可以按照一定的規則向消息隊列中添加新的信息;對消息隊列有讀權限的進程可以從中讀取消息。
信號(Signal)。信號是在權健層次上對中斷機制的一種模擬,它是比較複雜的通信方式,用於通知進程有某時間發生,一個進程接收到一個信號與處理器收到一箇中斷請求效果上可以說是一樣的。
信號量(Semaphore)。其主要作爲進程之間以及同一進程的不同線程之間的同步和互斥手段。
套接字(Socket)。這是一種更爲一般的進程間通信機制,它可用於網絡中不同機器之間的進程間通信,應用非常廣泛。

線程間通信:(線程間通信參考:https://blog.csdn.net/liubing8609/article/details/81700284)
線程間通信常用的方法有如下三種:
全局變量。由於屬於同一個進程的各個線程共享操作系統分配該進程的資源,故解決線程間通信最簡單的一種方法是使用全局變量。對於標準類型的全局變量,我們建議使用volatile修飾符,它告訴編譯器無需對該變量作任何的優化,即無需將它放到一個寄存器中,並且該值可被外部改變。
參數傳遞方式。該方式是線程通信的官方標準方法,多數情況下,主線程創建子線程並讓其子線程爲其完成特定的任務,主線程在創建子線程時,可以通過傳給線程函數的參數和其通信。
Message消息機制。常用的Message通信的接口主要有兩個:PostMessagePostThreadMessage。PostMessage爲線程向主窗口發送消息,而PostThreadMessage是任意兩個線程之間的通信接口。
線程同步法。還可以通過線程同步來實現線程間通信。例如有兩個線程,線程A寫入數據,線程B讀出線程A準備好的數據並進行一些操作。這種情況下,只有當線程A寫好數據後線程B才能讀出,只有線程B讀出數據後線程A才能繼續寫入數據,這兩個線程之間需要同步進行通信。關於線程同步的方法和控制是編寫多線程的核心和難點,方法也比較多。

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