Linux線程學習筆記

最近做的項目,要利用線程進行優化:將原有的邏輯,從串行,改造爲並行。作爲沒有學習過計算機課程的人來講,尼瑪又要從頭開始看線程。

開搞。

插入下:Linux中內存區域的劃分:主要包括棧、堆、全局區、常量區及代碼區。可以通過size命令,來查看各個段的大小。


在進程的地址空間中

1、棧區(stack):由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。 

2、堆區(heap):一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。 

3、全局區(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域,程序結束後有系統釋放。 

4、文字常量區:常量字符串就是放在這裏的, 程序結束後由系統釋放。 

5、程序代碼區:存放函數體的二進制代碼。 

在Linux下,所有的進程,至少有一個線程。即使是單進程,單進程本身也是一個線程。當時某個教材上寫的:進程是資源分配的基本單位,而線程是程序執行的基本單位。有道理。當用fork創建出一個進程的時候,新的進程將有自己的PID,時間調度也是獨立的。但是創建一個新線程時,新的執行線程將有自己的棧,但是與它的創建者共享全局變量、文件描述符、信號句柄和當前目錄狀態。

一些線程的例子,便於進行理解:

1.在編輯文檔的同時也要對文檔中的單詞個數進行統計。一個線程負責處理用戶的輸入,而另一個更新線程則不段刷新字數;

2.處理多個連接的網絡服務器;

線程之前的切換需要操作系統所做的工作,要比進程之間的切換少得多,因此多線程的資源需要少於多個進程。這個很關鍵,降低對資源的消耗。


兩個線程同時執行:

1.最簡單也是效率最低的方法是,創建一個全局變量global=1,然後兩個線程分別對這個變量進行修改,比如P_thread_a發現global=1,則進行它的動作,然後將global置爲2,繼續死循環;而P_thread_b發現global=2,則進行它的處理,然後將global置爲1,繼續循環判斷;這個時候,a發現global=1,開始它的處理,如此反覆,可以發現兩個線程是同時在執行;

 線程的同步常用的方法是:1.信號量;2.互斥量。兩種方法適應的場景不同,比如如果想控制任一時刻,只能有一個線程可以訪問一些共享內存,使用互斥量要自然得多。

用信號量進行同步

頭文件:#include <semaphore.h>

四個函數:int  sem_init(sem_t *sem, int pshared, unsigned int value);   //初始化信號量

    int sem_wait(sem_t *sem);  //信號量值減1,這個函數如果對值爲0的信號量操作,會阻塞

    int sem_post(sem_t *sem);//信號量值增1

    int  sem_destroy(sem_t *sem);//信號量銷燬

          這些函數,成功之後,返回0.

暫時停到這裏。



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