程序 執行緒及共享記憶體學習筆記

2021-08-29 12:14:40 字數 3173 閱讀 4591

理論基礎:

wait()

system();

exec函式族:

exit()

多執行緒相關:

pthread_create()

如果呼叫該函式成功建立了乙個執行緒,那麼該執行緒的id會儲存在thread引數中。這個標誌會在其他的函式中用到。

pthread_join()

pthread_detach()

pthread_self()

pthread_equal

pthread_exit()

執行緒同步機制:

互斥:pthread_mutex_init()pthread_mutex_destroy()

pthread_mutex_init()

pthread_mutex_lock()pthread_mutex_trylock()pthread_mutex_unlock

pthread_mutex_trylock()

pthread_mutex_unlock()

讀寫鎖:

``pthread_rwlock_init()pthread_rwlock_destory()`:

pthread_rwlock_rdlock()

pthread_rwlock_wrlock()

pthread_rwlock_unlock()

條件變數:

thread_cond_init()thread_cond_destory()

thread_cond_wait()thread_cond_timedwait()

thread_cond_signal()thread_cond_broadcast()

共享記憶體相關:

shmget()

shmat()shmdt()

shmctl()

附錄1(摘自網路):

字尾引數

l接收以逗號為分隔的引數列表,以null為結束符

v接收以null為結束的字串陣列

p接收以null為結束的字串陣列指標,並可以利用dos的path變數查詢子程式檔案

e傳遞環境變數。

附錄2(摘自網路):

不在函式內部使用靜態或全域性資料。

不返回靜態或全域性資料,所有資料都由函式的呼叫者提供。

使用本地資料,或通過拷貝全域性資料到本地來保護全域性資料。

不呼叫不可重入性函式。

附錄三(翻譯自man手冊):

巨集名稱意義

ipc_creat

建立乙個新的段,如果這個標誌沒有被使用,shmget()函式將會尋找與這個段相對應的key引數值,並且檢查使用者是否有讀取這個段的許可權。

ipc_excl

該標誌與ipc_breat一起被用作確認本次建立共享記憶體的呼叫成功與否。

ipc_private

它不是乙個標誌字段,而是乙個key_t型別的值,如果函式呼叫的時候key引數中儲存這個特殊的值,系統呼叫會忽略除了shm***中最不重要的9位意外的所有並且建立乙個新的共享記憶體。

ipc_stat

從核心中拷貝shmid中由buf指向的shmid_ds結構相關的資料結構資訊。對於共享記憶體段呼叫者必須擁有可讀許可權。

ipc_set

往引數buf指標指向的shmid_ds結構體的某些成員寫入與該共享記憶體段相關聯的核心資料結構,並且更新該結構體中的shm_ctime成員。以下成員可能會被改變:shm_perm.uid、shm_perm.gid和(最不重要的九位)shm_perm.mode。呼叫程序的有效uid必須與擁有者(shm_perm.uid)或共享記憶體的建立者(shm_per.cuid)相匹配,或者與一定是擁有特權的呼叫者相匹配。

ipc_rmid

標記被銷毀的共享記憶體段,實際上,這個共享記憶體段實在程序銷毀的時候被銷毀。(當shmid_ds相關構成員shm_nattch為空的時候)。呼叫者必須是共享記憶體的擁有者或者建立者,或者擁有特權。buf引數被忽略。

shm_noresreve

(從linux核心2.6.15以後)這個標誌與mmap()函式的map_noreserve 標誌具有同樣的目的。不保留交換空間對於共享記憶體段,當交換空間被保留了,他會保證共享記憶體是可用的。當交換空間沒有被保留,並且物理記憶體不可用,那麼可能會在寫入時獲取sigsegv。也可以查閱/proc/sys/vm/overcommit檔案。

shm_remap

(linux特有)這個標誌指定了在共享記憶體段中從shmaddr引數開始到段最後的範圍內的段對映應該被替換成現有的對映。(一般情況下,乙個einval錯誤可能是由於乙個對映在位址範圍內已經存在)在這個案例中,shmaddr引數必須不為空。

shm_rdonly

以唯讀的方式鏈結共享記憶體段。程序對共享記憶體段必須有讀取許可權。如果標誌沒有被指定,那麼共享記憶體段會被以可讀可寫方式鏈結,並且程序對於該共享記憶體段必須擁有可讀和可寫許可權。但這不意味著對共享記憶體段有只寫許可權。

shm_exec

(linux特有,從linux2.6.9以後)允許執行共享記憶體段中的內容。呼叫者對於共享記憶體段必須擁有可執行許可權。

shm_hugetlb

(從linux核心2.6版以後)為共享記憶體段分配巨大空間,詳情見linux核心原始碼檔案中documentation/vm/hugetlbpage.txt獲取更多資訊。

shm_huge2mb,shm_huge1gb

(從linux核心3.8之後)與shm_hugetlb一起被用作選擇替代hugetlb大頁面的大小(分別是2mb和1gb),並且支援超過hugetlb大頁面的大小。

程序 共享記憶體

swoole 本身也是個多程序模型。有多個 worker 程序和 master 程序。由於程序之間的變數時不能相互通用的。所以應該怎樣實現程序之間的通訊呢?作業系統中實現程序通訊的方法有多種,其中一種是共享記憶體 是作業系統內比較特殊的一種記憶體,他並不依賴於任何的程序也不屬於任何程序 可以呼叫系統...

程序通訊 共享記憶體 聽課筆記

多個程序共享一段物理記憶體 是程序間共享資料最快的方法 size x large 步驟 size 1 建立共享記憶體,使用shmget函式 2 對映共享記憶體,使用shmat函式,將共享記憶體對映到具體的程序空間去 3 解除對映共享記憶體,使用shmdt函式 4 刪除共享記憶體,使用shmctl函式...

學習筆記之共享記憶體

共享記憶體 共享記憶體是程序間通訊方式中效率最高的一種,因為程序可以對記憶體進行直接讀寫,而沒有複製等其他操作,共享記憶體在核心中被建立,用時對映在使用者空間,在使用者空間操作。由於多個程序可同時訪問共享記憶體,因此需要同步和互斥機制配合使用 一 函式介面 申請key值,除建立共享記憶體以外的程序需...