1. 程式人生 > >《深入理解計算機系統》讀書筆記7--- 併發程式設計1

《深入理解計算機系統》讀書筆記7--- 併發程式設計1

CSAPP介紹了三種併發程式設計技術:(1)程序(2)I/O多路複用(3)執行緒

還有對於多執行緒併發程式設計的一些問題的思考

本帖先介紹三種併發模型,下一貼介紹多執行緒併發注意事項。

(1)基於程序的併發程式設計

核心函式就是fork。用父程序不停接受socket連線,fork建立子程序,用子程序來服務每一個client。

主要流程就是在echo伺服器的基礎上。

1.server會while迴圈阻塞在connfd=accept()那裡。每當請求到達接受後,就fork一個子程序。

2.子程序會一直在echo程式裡面的while迴圈。echo程式見書P632頁。

3.子程序在client端那邊輸入EOF或者關掉以後,會檢測到然後也終止程序。我們用SIGCHLD訊號+waitpid來回收僵死程序。

注意:①程序的特點在前面的帖子裡面有講到。包括:共享檔案表,相同但獨立的地址空間等。

②由於fork的子程序會繼承父程序的檔案表,所以需要先給子程序關閉listenfd描述符,對於父程序也要相應關掉connfd描述符。

(2)基於I/O多路複用的併發程式設計

核心函式就是select。select就是用核心來監聽我們關心的事件,當有任意事件發生,select返回,我們可以檢測到底是發生了什麼事件,進行相應地處理。

其實I/O多路複用,本質上並沒有實現併發,但是如果我們將每一次的事件控制在很小的粒度,然後一次又一次地去處理髮生的事件,就相當於併發了。

主要流程就是

1.server會while迴圈阻塞在select函式,每當有我們關心的事件發生,select函式就返回。我們進行相應地處理。

處理包括:

2.若是有新連線請求到來,接受請求,並將新接受connfd的有資訊到來加入監聽事件集合。

3.若是有已連線connfd有資訊到來,讀取一行資訊。若是讀到了EOF,就關閉該connfd,並將該connfd從監聽事件集合裡面移除。

注意:①I/O多路複用在使用select時涉及到蠻多的細節,比如,當select返回需要去迴圈檢測到底是哪一個事件發生,需要隨時增加或者刪除需要監聽的事件,需要對於clientfd進行一定的管理,等等。具體可以參見Unix網路程式設計,或者man select。

②之前提到的細粒度的操作,具體地說,在基於程序的併發程式設計之中,我們採用了echo函式來反彈client的資訊。

而echo函式是利用while迴圈rio_readlineb,直到遇到EOF,這樣會使程式一直在while之中。

這裡我們每次select返回,對於某一個connfd我們只會呼叫一次rio_readlineb來讀取一行的資訊,所以稱為細粒度。

這個細粒度的好處當然是實現了併發,但是壞處是對於故意只發送部分文字然後就停止的惡意客戶端攻擊顯得很脆弱。

(3)基於執行緒的併發程式設計

核心函式就是pthread_create()。它用來建立新的執行緒,指定執行緒的執行函式,向新執行緒傳遞引數,以及通過引數返回執行緒的tid。

主要流程是

1.server會進入while迴圈,阻塞在accept。將connfd傳入新執行緒處理函式。

2.然後裡面分離執行緒(分離執行緒使得該執行緒結束後由系統回收資源),echo進入迴圈狀態。

注意:①執行緒的特點是,像程序一樣由核心排程,分配一個整數ID來識別。

                                            像I/O複用一樣,執行與單一的程序上下文中,共享同一個虛擬地址空間。

好處是非常容易進行同一程序的執行緒之間通訊(傳遞資訊)比如直接利用全域性變數,區域性static變數,指向同一區域性變數的指標均可。

壞處是這種方便的執行緒間通訊是很容易發生危險的。有同步錯誤,競爭,死鎖這樣的問題。

②多執行緒由於方便的共享問題,可能出現各種問題,其中的競爭,表示一個執行緒要使用一個東西,但是在還沒使用之前就被另一個執行緒修改了。

這裡可以用到malloc技術,將某個執行緒需要用的的東西,先存在一個唯一的地方,然後使用之後釋放。

相關推薦

深入理解計算機系統讀書筆記7--- 併發程式設計1

CSAPP介紹了三種併發程式設計技術:(1)程序(2)I/O多路複用(3)執行緒 還有對於多執行緒併發程式設計的一些問題的思考 本帖先介紹三種併發模型,下一貼介紹多執行緒併發注意事項。 (1)基於程序的併發程式設計 核心函式就是fork。用父程序不停接受socket連線,f

3.2《深入理解計算機系統筆記(二)內存和高速緩存的原理【插圖】

img sram 本質 text ddr rate too 是我 很大的 《深入計算機系統》筆記(一)主要是講解程序的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程序性能”,這兩章的筆記繼續往後延遲! 《深入計算機系統》的一個很大的用處

深入理解計算機系統————第一筆記

計算機系統是由硬體和系統軟體組成,他們共同工作來執行應用程式,這本書的目的就在於幫助人們理解·當系統在執行hello程式時,系統發生了什麼以及為什麼會這樣,換句話說,當執行簡單程式hello時,整個電腦系統從應用程式,作業系統,快取裝置,等等,在這個程式執行的過程中做了什麼,以及為什麼會這樣

深入理解計算機系統筆記——資訊的表示和處理

資訊的儲存 十六進位制表示法 字 資料大小 定址和位元組順序 資料型別 字串的表示 程式碼的表示 資訊的儲存 資訊是客觀事物的反映,是經過處理加工後得出的資料。 資料是客觀事物的記錄。 計算機內所有的資訊均以二進位制的形式表示,

深入理解計算機系統筆記——計算機系統漫遊

1.計算機系統 由硬體與軟體組成,他們共同工作來執行程式。 2.資訊的表示 #include <stdio.h> int main() { printf("Hello World\n"); return 0; //c標準規定建議main函式返回值為int

深入理解計算機系統筆記:幾個重要概念

執行程式系統 編譯系統 從原始碼文字檔案到可執行目標檔案的轉化由編譯系統(compilation system)完成 前處理器(cpp):hello.c —> hello.i 根據以字元 #

深入理解計算機系統筆記(二)記憶體和快取記憶體的原理【插圖】

歡迎檢視《深入理解計算機系統》系列部落格 --------------------------------------------------------------------------------------------------------------

深入理解計算機系統學習筆記(一)

程式的編譯過程 為了說明程式的編譯過程,我們用經典的hello world程式作為例子 #include <stdio.h> int main(int argc, char const *argv[]) { printf("hell

深入理解計算機系統筆記(三)連結知識【附圖】

歡迎檢視《深入理解計算機系統》系列部落格 --------------------------------------------------------------------------------------------------------------

深入理解計算機系統筆記):連結

理解連結有很多好處: 有助於構造大型程式有助於避免一些危險程式設計錯誤有助於理解其他重要的系統概念讓你能夠利用共享庫1. 編譯器驅動程式 編譯命令,假設有main.c和swap.c兩個原始檔 $ gcc -O2 -g -o p main.c swap.c 實際上編譯過程

深入理解計算機系統筆記(一)棧【插圖】

歡迎檢視《深入理解計算機系統》系列部落格 《深入理解計算機系統》筆記(一)棧(本篇) ------------------------------------------------------------------------------------------

深入理解計算機系統》——第7章(連結)

連結 連結:將各種程式碼和資料部分收集起來並組合成為一個單一檔案的過程。(這個檔案可被載入或拷貝到儲存器並執行) 連結可以執行於編譯,載入或執行時。 靜態連結: 兩個主要任務: 1 符號解析:將目標檔案中的每個全域性符號都繫結到一個唯一的定義 2 重

深入理解計算機系統》——讀書筆記(一)

img 可執行 即將 簡單的 world std 加載 完整 .exe   這本書從一個簡單的C語言的HelloWorld程序講起...   這是這個小程序的生命周期的一個部分:   HellOWorld程序,從被創建(文本格式),到被執行(在屏幕上打印出來)。   其

深入理解計算機系統讀書筆記(ch2)+ C 泛型

tex byte 指向 get 讀書筆記 class its n) 支持 本章主要介紹各類型的機器表示,Stanford的CS107的lec2和lec3有精彩解釋,比看書快(當作書中只是的cache吧)。 lec4中介紹的C裏面如何使用泛型(沒有template, refe

深入理解計算機系統讀書筆記——第七章 連結

 連結 有兩個c檔案: /* main.c */ void swap(); int buf[2] = {1, 2}; int main() { swap(); return 0; } /* swap.c */ extern int buf[]; int *b

深入理解計算機系統讀書筆記(第一章)

主要內容 0.計算機系統是由硬體和系統軟體組成的,它們共同工作來執行應用程式。 1.程式是怎樣編譯執行。 2.程序,執行緒,虛擬記憶體,檔案等基本概念。 3.本書內容提前瀏覽。 資訊就是位+上下文 本書用了一個hello.c的表示方法說明了一個思

讀書筆記深入理解計算機系統 第七章

int printf(const char * format,...); int global_init_var = 84; int global_uninit_var; void fun1(int i) { printf("%d\n",i); } int main

深入理解計算機系統》儲存器層次結構——讀書筆記

一、儲存技術       1、 基本的儲存技術包括隨機儲存器(RAM)、非易失性儲存器(ROM)和磁碟。RAM分靜態RAM(SRAM)和動態RAM(DRAM)。SRAM快些,也貴些,主要用做CPU晶片上的快取記憶體,也可以用作晶片下的快取記憶體。DRAM慢些,便宜些,主要用

讀書筆記——《深入理解計算機系統》第三章_程式的機器級表示(一)

    前言:已經大四,沒有去找工作,選擇了保研,之所以這樣選擇,有三個原因,一、剛進校時,聽說保研都是牛人才能行的事,所以一心努力保研;二、2008年開始,經濟危機比較嚴重,工作不好找,雖然軟體專業要找一份工作還是比較容易,但好工作的機會少了很多,再多學習幾年,規避下風險;

深入理解計算機系統讀書筆記

第二章 資訊的表示和處理 二進位制 計算機的資訊儲存和處理都是以二進位制為基礎的,通過一系列的0,1組合,我們能夠去表示有限的整數和實數。 首先了解三種重要的符號表示方法: