1. 程式人生 > >POSIX執行緒:支援記憶體共享的簡捷工具

POSIX執行緒:支援記憶體共享的簡捷工具

POSIX(可移植作業系統介面)執行緒是提高程式碼響應和效能的有力手段。

  • 執行緒是有趣的

執行緒類似於程序。如同程序,執行緒由核心按時間分片進行管理。在單處理器系統中,核心使用時間分片來模擬執行緒的併發執行,這種方式和程序的相同。而在多處理器系統中,如同多個程序,執行緒實際上一樣可以併發執行。

那麼為什麼對於大多數合作性任務,多執行緒比多個獨立的程序更優越呢?這是因為,執行緒共享相同的記憶體空間。不同的執行緒可以存取記憶體中的同一個變數。所以,程式中的所有執行緒都可以讀或寫宣告過的全域性變數。如果曾用 fork() 編寫過重要程式碼,就會認識到這個工具的重要性。為什麼呢?雖然 fork() 允許建立多個程序,但它還會帶來以下通訊問題: 如何讓多個程序相互通訊,這裡每個程序都有各自獨立的記憶體空間。對這個問題沒有一個簡單的答案。雖然有許多不同種類的本地 IPC (程序間通訊),但它們都遇到兩個重要障礙:

  1. 強加了某種形式的額外核心開銷,從而降低效能
  2. 對於大多數情形,IPC 不是對於程式碼的“自然”擴充套件。通常極大地增加了程式的複雜性

雙重壞事: 開銷和複雜性。如果曾經為了支援 IPC 而對程式大動干戈過,那麼您就會真正欣賞執行緒提供的簡單共享記憶體機制。由於所有的執行緒都駐留在同一記憶體空間,POSIX 執行緒無需進行開銷大而複雜的長距離呼叫。只要利用簡單的同步機制,程式中所有的執行緒都可以讀取和修改已有的資料結構。而無需將資料經由檔案描述符轉儲或擠入緊窄的共享記憶體空間。僅此一個原因,就足以讓您考慮應該採用單程序/多執行緒模式而非多程序/單執行緒模式。

  • 執行緒是快捷的

與標準 fork() 相比,執行緒帶來的開銷很小。核心無需單獨複製程序的記憶體空間或檔案描述符等等。這就節省了大量的 CPU 時間,使得執行緒建立比新程序建立快上十到一百倍。因為這一點,可以大量使用執行緒而無需太過於擔心帶來的 CPU 或記憶體不足。使用 fork() 時導致的大量 CPU 佔用也不復存在。這表示只要在程式中有意義,通常就可以建立執行緒。

當然,和程序一樣,執行緒將利用多 CPU。如果軟體是針對多處理器系統設計的,這就真的是一大特性(如果軟體是開放原始碼,則最終可能在不少平臺上執行)。特定型別執行緒程式(尤其是 CPU 密集型程式)的效能將隨系統中處理器的數目幾乎線性地提高。如果正在編寫 CPU 非常密集型的程式,則絕對想設法在程式碼中使用多執行緒。一旦掌握了執行緒編碼,無需使用繁瑣的 IPC 和其它複雜的通訊機制,就能夠以全新和創造性的方法解決編碼難題。所有這些特性配合在一起使得多執行緒程式設計更有趣、快速和靈活。

  • 執行緒是可移植的

如果熟悉 Linux 程式設計,就有可能知道 __clone() 系統呼叫。__clone() 類似於 fork(),同時也有許多執行緒的特性。例如,使用 __clone(),新的子程序可以有選擇地共享父程序的執行環境(記憶體空間,檔案描述符等)。這是好的一面。但 __clone() 也有不足之處。正如__clone() 線上幫助指出:

__clone 呼叫是特定於 Linux 平臺的,不適用於實現可移植的程式。欲編寫執行緒化應用程式(多執行緒控制同一記憶體空間),最好使用實現 POSIX 1003.1c 執行緒 API 的庫,例如 Linux-Threads 庫。參閱 pthread_create(3thr)。

雖然 __clone() 有執行緒的許多特性,但它是不可移植的。當然這並不意味著程式碼中不能使用它。但在軟體中考慮使用 __clone() 時應當權衡這一事實。值得慶幸的是,正如 __clone() 線上幫助指出,有一種更好的替代方案:POSIX 執行緒。如果想編寫可移植的多執行緒程式碼,程式碼可運行於 Solaris、FreeBSD、Linux 和其它平臺,POSIX 執行緒是一種當然之選。

  • 簡單的多執行緒例子

 

  • 訪問全域性變數的多執行緒例子

 

相關推薦

POSIX執行支援記憶體共享簡捷工具

POSIX(可移植作業系統介面)執行緒是提高程式碼響應和效能的有力手段。 執行緒是有趣的 執行緒類似於程序。如同程序,執行緒由核心按時間分片進行管理。在單處理器系統中,核心使用時間分片來模擬執行緒的併發執行,這種方式和程序的相同。而在多處理器系統中,如同多個程序,執行緒實

POSIX執行執行私有資料

概念及作用   執行緒私有資料(thread-specify data,TSD)類似於全域性變數,可以跨函式使用,區別是TSD是執行緒私有的。 建立和登出 int pthread_key_create(pthread_key_t *key, void (*destr_func

執行間的記憶體共享問題----你弄懂了嗎?

對執行緒間共享記憶體的問題,許多同學是不是都覺得很簡單?就是用全域性變數來共享碼,然而你說的並沒有什麼卵用…….(^__^)……. 對於執行緒間記憶體關係不弄得清清楚楚,很難寫好多執行緒程式。最簡練而

POSIX 執行詳解(1)——一種支援記憶體共享簡捷工具

級別: 初級 2000 年 7 月 01 日 POSIX(可移植作業系統介面)執行緒是提高程式碼響應和效能的有力手段。在本系列中,Daniel Robbins 向您精確地展示在程式設計中如何使用執行緒。其中還涉及大量幕後細節,讀完本系列文章,您完全可以運用 POSIX 執

執行1一種支援記憶體共享簡捷工具

執行緒是有趣的 瞭解如何正確運用執行緒是每一個優秀程式設計師必備的素質。執行緒類似於程序。如同程序,執行緒由核心按時間分片進行管理。在單處理器系統中,核心使用時間分片來模擬執行緒的併發執行,這種方式和程序的相同。而在多處理器系統中,如同多個程序,執行緒實際上一樣可以併發執行

POSIX 執行詳解 一種支援記憶體共享簡捷工具

執行緒是有趣的 瞭解如何正確運用執行緒是每一個優秀程式設計師必備的素質。執行緒類似於程序。如同程序,執行緒由核心按時間分片進行管理。在單處理器系統中,核心使用時間分片來模擬執行緒的併發執行,這種方式和程序的相同。而在多處理器系統中,如同多個程序,執行緒實際上一樣可以併

Java併發程式設計基礎//程序每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換開銷比較大,一個程序包含1-n個執行緒 //執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒擁有獨立的執行棧和程式計

1.實現多執行緒的兩種方式: (1)繼承Thread類; (2)實現Runnable介面 //程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換開銷比較大,一個程序包含1-n個執行緒 //執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒擁有獨立的執行

POSIX 執行程式設計中避免記憶體洩漏

POSIX 執行緒簡介 使用執行緒的主要原因是要提高程式效能。執行緒的建立和管理只需要較小的作業系統開銷和較少的系統資源。一個程序內的所有執行緒共享相同的地址空間,使得執行緒間的通訊更高效,且比程序間通訊更易於實現。例如,如果一個執行緒在等待一個輸入/輸出系統呼叫完成,其他執行緒可以處理 CPU 密集型任務

java多執行3、Java對多執行支援1

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 1、Java在語言級提供了對多執行緒程式設計的支援。 2、實現多執行緒程式的兩種方式 3、後臺執行緒 4、yield方法 5、執行緒優先順序 1、Java在語言級提

執行學習(二)執行間的資料共享

資料不共享的情況 public class MyThread04 extends Thread{ private int count=5; public MyThread04(String threadName) { this.setName(threadName); }

十二、JAVA多執行機器硬體CPU、Java記憶體模型

  大家都知道,計算機在執行程式時,每條指令都是在CPU中執行的,而執行指令過程中,勢必涉及到資料的讀取和寫入。由於程式執行過程中的臨時資料是存放在主存(實體記憶體)當中的,這時就存在一個問題,由於CPU執行速度很快,而從記憶體讀取資料和向記憶體寫入資料的過程跟CPU執行指令的速度比起來要慢的多,因

java多執行5、Java對多執行支援(二)執行優先順序

一、執行緒優先順序 在java當中,每一個執行緒都有一個優先順序,我們可以通過Thread當中的getPriority()方法、setPriority方法去得到一個執行緒的優先順序和設定一個執行緒的優先順序。  設定執行緒優先順序,它的引數是一個整形。最小為1(Thread.M

java多執行4、Java對多執行支援(二)後臺執行setDaemon、暫停執行yield

文章目錄 一、設定後臺執行緒 二、yield方法,暫停執行緒讓別的執行緒執行 上篇文章介紹了執行緒實現方式、執行緒的隨機性,大家如需瞭解可參考 java多執行緒:3、Java對多執行緒的支援(一)執行緒實現方式、執行緒的隨機性 這篇我們來看看後臺執行緒setD

多程序與多執行的優劣 與 共享記憶體的同步問題

通常會說:程序之間的地址空間是獨享的,而執行緒是共享程序的地址空間,執行緒的資源比程序小,建立執行緒比建立程序快,執行緒間切換快,執行緒間通訊快,執行緒資源利用率好.下面做個補充:1,執行緒掛則可能導致程序掛,穩定性差。對長時間執行的serve程式,這一點尤為重要。所以為了

執行 執行共享區域性變數的方法

1. 操作相同時,寫一個 Runnable 實現類,內部設定成員變數,run 方法修改該變數,將該Runnable傳給不同Thread使用; 2. 操作不同時,在Thread呼叫類例項化一個數據實例,傳遞給不同Runnable處理,再把不同的Runnable傳給不同Thre

java多執行4、執行範圍內的資料共享_公共變數

直接上例項,注意事項已經在程式中做了註釋,以此共勉。加油 import java.util.Map; import java.util.Random; import java.util.concu

Java多執行記憶體可見性

Java中對於volatile變數,通俗點說可以把它看做多執行緒之間分享的共享記憶體,可見性是立即的。 實際上它分成了兩部分,volatile write和volatile read。由於Unsafe提供了getXXXVolatile和putXXXVolatile介面。所以

一種支援記憶體共享簡捷工具

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

linux網路程式設計之posix 執行(四)posix 條件變數與互斥鎖 示例生產者--消費者問題

#include <unistd.h>#include <sys/types.h>#include <pthread.h>#include <semaphore.h>#include <stdlib.h>#include <stdio.h>

一個神奇的bugOOM?優雅終止執行?系統記憶體佔用較高?

摘要:該專案是DAYU平臺的資料開發(DLF),資料開發中一個重要的功能就是ETL(資料清洗)。ETL由源端到目的端,中間的業務邏輯一般由使用者自己編寫的SQL模板實現,velocity是其中涉及的一種模板語言。 Velocity之OOM Velocity的基本使用 Velocity模板語言的基本使用程式碼如