原创 Linux 多任務編程——多任務的同步與互斥

現代操作系統基本都是多任務操作系統,即同時有大量可調度實體在運行。在多任務操作系統中,同時運行的多個任務可能: 都需要訪問/使用同一種資源 多個任務之間有依賴關係,某個任務的運行依賴於另一個任務 這兩種情形是多任務編程中遇到的最基本的問題

原创 Linux 多任務編程——多線程之線程池實現

線程池基本原理 在傳統服務器結構中,常是有一個總的監聽線程監聽有沒有新的用戶連接服務器,每當有一個新的用戶進入,服務器就開啓一個新的線程用戶處理這 個用戶的數據包。這個線程只服務於這個用戶,當用戶與服務器端關閉連接以後,服務器端銷燬這個線

原创 Linux 多任務編程——多線程實現多任務

概述 每個進程都擁有自己的數據段、代碼段和堆棧段,這就造成進程在進行創建、切換、撤銷操作時,需要較大的系統開銷。爲了減少系統開銷,從進程中演化出了線程。爲了讓進程完成一定的工作,進程必須至少包含一個線程。線程存在於進程中,共享進程的資源。

原创 Linux 多任務編程——線程堆棧大小的使用介紹

先來講說線程內存相關的東西,主要有下面幾條: 進程中的所有的線程共享相同的地址空間。 任何聲明爲 static/extern 的變量或者堆變量可以被進程內所有的線程讀寫。 一個線程真正擁有的唯一私有儲存是處理器寄存器。 線程棧可以通過暴露

原创 Linux 多任務編程——線程私有數據

在多線程程序中,經常要用全局變量來實現多個函數間的數據共享。由於數據空間是共享的,因此全局變量也爲所有線程共有。   測試代碼如下: #include <stdio.h> #include <pthread.h> #includ

原创 Linux 多任務編程——進程和線程的區別與聯繫

在許多經典的操作系統教科書中,總是把進程定義爲程序的執行實例,它並不執行什麼, 只是維護應用程序所需的各種資源,而線程則是真正的執行實體。 爲了讓進程完成一定的工作,進程必須至少包含一個線程。 進程,直觀點說,保存在硬盤上的程序運行以後

原创 Linux 多任務編程——進程間通信:共享內存(Shared Memory)

概述 共享內存是進程間通信中最簡單的方式之一。共享內存允許兩個或更多進程訪問同一塊內存,就如同 malloc() 函數向不同進程返回了指向同一個物理內存區域的指針。當一個進程改變了這塊地址中的內容的時候,其它進程都會察覺到這個更改。

原创 Linux 多任務編程——進程間通信:有名管道(FIFO)

命名管道的概述 無名管道,由於沒有名字,只能用於親緣關係的進程間通信(更多詳情,請看《無名管道》)。爲了克服這個缺點,提出了命名管道(FIFO),也叫有名管道、FIFO 文件。 命名管道(FIFO)不同於無名管道之處在於它提供了一個路徑名

原创 Linux 多任務編程——進程間通信:消息隊列(Message Queues)

概述 消息隊列提供了一種在兩個不相關的進程之間傳遞數據的簡單高效的方法,其特點如下: 1)消息隊列可以實現消息的隨機查詢。消息不一定要以先進先出的次序讀取,編程時可以按消息的類型讀取。 2)消息隊列允許一個或多個進程向它寫入或者讀取消息。

原创 Linux 多任務編程——進程間通信:無名管道(pipe)

管道的概述 管道也叫無名管道,它是是 UNIX 系統 IPC(進程間通信) 的最古老形式,所有的 UNIX 系統都支持這種通信機制。 無名管道有如下特點: 1、半雙工,數據在同一時刻只能在一個方向上流動。 2、數據只能從管道的一端寫入,從

原创 Linux 多任務編程——進程間通信:信號中斷處理

什麼是信號? 信號是 Linux 進程間通信的最古老的方式。信號是軟件中斷,它是在軟件層次上對中斷機制的一種模擬,是一種異步通信的方式 。信號可以導致一個正在運行的進程被另一個正在運行的異步進程中斷,轉而處理某一個突發事件。 “中斷”在我

原创 Linux 環境編程——信號列表

在 Linux 下,每個信號的名字都以字符 SIG 開頭,每個信號和一個數字編碼相對應,在頭文件 signum.h 中,這些信號都被定義爲正整數。信號名定義路徑:/usr/include/i386-linux-gnu/bits/signu

原创 Linux 環境編程——淺談可重入函數與不可重入函數

在實時系統的設計中,經常會出現多個任務調用同一個函數的情況。如果有一個函數不幸被設計成爲這樣:那麼不同任務調用這個函數時可能修改其他任務調用這個函數的數據,從而導致不可預料的後果。這樣的函數是不安全的函數,也叫不可重入函數。 相反,肯定有

原创 Linux 多任務編程——進程間通信概述

進程是一個獨立的資源分配單元,不同進程(這裏所說的進程通常指的是用戶進程)之間的資源是獨立的,沒有關聯,不能在一個進程中直接訪問另一個進程的資源(例如打開的文件描述符)。 但是,進程不是孤立的,不同的進程需要進行信息的交互和狀態的傳遞等,

原创 Linux 多任務編程——進程替換:exec 函數族

在 Windows 平臺下,我們可以通過雙擊運行可執行程序,讓這個可執行程序成爲一個進程;而在 Linux 平臺,我們可以通過 ./ 運行,讓一個可執行程序成爲一個進程。 但是,如果我們本來就運行着一個程序(進程),我們如何在這個進程內部