1. 程式人生 > >Unix C雜談(筆記)

Unix C雜談(筆記)

記憶體中地址從小到大各儲存域的劃分:
程式碼區,只讀常量區,全域性區,BSS段,堆,棧。
其中,堆區和棧區沒有明顯的界限,可以適當調整。
使用malloc申請動態記憶體的注意事項
1.使用malloc申請動態記憶體時,可能還需要額外的12位元組來儲存一些用於管理 動態記憶體的資訊,比如記憶體的大小等。
2.malloc函式底層採用連結串列形式去處理多個記憶體塊,也就是需要儲存有關下一個記憶體塊/上一個記憶體塊的資訊。
3.使用malloc申請的動態記憶體,千萬不要越界訪問,因為極有可能破壞管理資訊,從而引發段錯誤。
4.一般來說,使用malloc申請比較小的動態記憶體時,作業系統會一次性分配33個記憶體頁(目前主流作業系統一個記憶體頁4Kb,即4096位元組),從而提高效率。而當申請的記憶體超過33個記憶體頁時,系統會再次分33個記憶體頁。
UC還有個兩個記憶體專門的函式,sbrk(),brk()函式,根據其引數來確定是申請還是釋放記憶體,還是獲取記憶體當前地址。申請比較小的記憶體時不像malloc,是預設分配1個記憶體頁。
使用sbrk函式申請記憶體比較方便,釋放記憶體不太方便;
使用brk函式釋放記憶體比較方便,申請記憶體不太方便。
free相關


使用free釋放動態記憶體時,釋放多少則在動態記憶體總數中減去多少,當所有記憶體釋放完畢時,程序還保留33個記憶體頁備用,直到程序結束,主要是為了提高效率。
程序
使用fork創建出來的子程序會複製父程序中除了程式碼區之外的其他記憶體區域,程式碼區和父程序共享。
使用vfork創建出來的子程序不會拷貝父程序的記憶體區域,而是直接佔用,導致父程序進入阻塞狀態,直到子程序終止,或者呼叫exec系列函式跳出為止。
所以fork建立的父子程序同時 進行,不一定誰先完成。而vfork建立的一般子程序先完成。
程序的終止:(正常方式)
a.main函式中執行了return 0;
b.呼叫exit()函式終止了程序;
c.呼叫_exit()(UC函式)/_Exit()(標C函式)函式;
d.最後一個執行緒返回;
e.最後一個執行緒呼叫了pthread_exit()函式。
非正常方式:
a.採用訊號終止程序;
b.最後一個程序執行緒被其他執行緒取消。
程序間通訊方式:
1.檔案
2.訊號(注意和訊號量不一樣)
3.管道:本質是以檔案作為媒介來實現程序間通訊,該檔案叫管道檔案,管道分為:
有名管道:一般採用命令建立管道檔案,實現任意兩個程序之間的通訊;
無名管道:一般採用系統函式建立管道檔案,用於父子程序之間的通訊。
管道檔案本身並不會儲存傳遞的資料

4.共享記憶體:本質上是由核心維護的一塊記憶體區域,共享在兩個/多個程序之間,然後兩個/多個程序分別對該區域進行讀寫操作,從而實現通訊,是最快的IPC通訊方式
使用共享記憶體通訊的基本流程:
1.獲取key值,使用ftok函式;
2.建立/獲取共享記憶體,從而得到ID,使用shmget函式;
3.掛接共享記憶體,使用shmat函式;
4.使用共享記憶體,進行讀寫操作等;
5.脫接共享記憶體,使用shmdt函式;
6.如果不再使用,使用shmctl函式刪除共享記憶體。

5.訊息佇列:使用不同的程序將傳送的資料打包成具體格式的訊息,然後將訊息放入到訊息佇列中,使用其他程序從訊息佇列中取出訊息,從而實現程序間通訊。
使用訊息佇列通訊的流程:
1.獲取key值,使用ftok函式;
2.建立/獲取訊息佇列,使用msgget函式;
3.傳送訊息/接受訊息,使用msgsnd和msgrcv函式;
4.如果不再使用訊息佇列,使用msgctl函式刪除訊息佇列。

6.訊號量集:訊號量本質就是一個計數器,用於控制同時訪問共享資源的程序數/執行緒數,也就是說解決有限資源的分配問題 。訊號量集表示訊號量的集合,也就是多個計數器的集合,用於控制同時訪問多種共享資源的程序數/執行緒數。
訊號量的工作方式:
1.先把訊號量初始化,初始化為最大值;
2.如果有程序申請到共享資源,那麼訊號量的值減一;
3.當訊號量的值為0時,終止程序對共享資源的申請,讓申請共享資源的程序進入阻塞狀態;
4.如果有程序釋放資源,那麼訊號量的值加一;
5.當訊號量的值大於0時,阻塞的程序可以繼續搶佔資源,搶佔不到資源的程序繼續進入阻塞狀態等待。
使用訊號量集通訊的流程:
1.獲取key值,使用ftok函式;
2.建立/獲取訊號量集,使用semget函式;
3.初始化訊號量集,使用semctl函式;
4.操作訊號量集,使用semop函式;
5.如果不再使用則刪除,使用semctl函式。

7.網路

執行緒
程序是重量級單位,每個程序都需要獨立的記憶體空間,啟動新的程序很消耗資源,而執行緒是輕量級單位,執行緒共享所在程序的記憶體空間,但是每個執行緒都有一塊很小的獨立棧區。
執行緒同步
多執行緒共享程序中資源,多個執行緒同時訪問相同的共享資源時,需要相互協調,以避免出現數據的不一致和混亂問題,而執行緒之間的協調和通訊叫做執行緒的同步問題。執行緒中提供了互斥量(互斥鎖)機制來實現執行緒的同步。
訊號量:本質就是一個計數器,主要用於控制同時訪問共享資源的程序數/執行緒數,當訊號量的值是1時,效果等同於互斥量。