程序間通訊機制(管道、訊號、共享記憶體/訊號量/訊息佇列)、執行緒間通訊機制(互斥鎖、條件變數、posix匿名訊號量)
阿新 • • 發佈:2019-01-24
(1)系統中每個訊號量的資料結構(sem)
struct sem
{
int semval; /* 訊號量的當前值 */
unsigned short semzcnt; /* # waiting for zero */
unsigned short semncnt; /* # waiting for increase */
int sempid; /*在訊號量上最後一次操作的程序識別號*/
};
(2)系統中表示訊號量集合(set)的資料結構(semid_ds)
struct semid_ds
{
struct ipc_perm sem_perm; /* IPC 許可權 */
long sem_otime; /* 最後一次對訊號量操作(semop)的時間 */
long sem_ctime; /* 對這個結構最後一次修改的時間 */
struct sem *sem_base; /* 在訊號量陣列中指向第一個訊號量的指標 */
struct sem_queue *sem_pending; /* 待處理的掛起操作*/
struct sem_queue **sem_pending_last; /* 最後一個掛起操作 */
struct sem_undo *undo; /* 在這個陣列上的undo 請求 */
ushort sem_nsems; /* 在訊號量陣列上的訊號量號 */
};
(3)系統中每一訊號量集合的佇列結構(sem_queue)
struct sem_queue
{
struct sem_queue *next; /* 佇列中下一個節點 */
struct sem_queue **prev; /* 佇列中前一個節點, *(q->prev) == q */
struct wait_queue *sleeper; /* 正在睡眠的程序 */
struct sem_undo *undo; /* undo 結構*/
int pid; /* 請求程序的程序識別號 */
int status; /* 操作的完成狀態 */
struct semid_ds *sma; /*有操作的訊號量集合陣列 */
struct sembuf *sops; /* 掛起操作的陣列 */
int nsops; /* 操作的個數 */
};
struct sem
{
int semval; /* 訊號量的當前值 */
unsigned short semzcnt; /* # waiting for zero */
unsigned short semncnt; /* # waiting for increase */
int sempid; /*在訊號量上最後一次操作的程序識別號*/
};
(2)系統中表示訊號量集合(set)的資料結構(semid_ds)
struct semid_ds
{
struct ipc_perm sem_perm; /* IPC 許可權 */
long sem_otime; /* 最後一次對訊號量操作(semop)的時間 */
long sem_ctime; /* 對這個結構最後一次修改的時間 */
struct sem *sem_base; /* 在訊號量陣列中指向第一個訊號量的指標 */
struct sem_queue *sem_pending; /* 待處理的掛起操作*/
struct sem_queue **sem_pending_last; /* 最後一個掛起操作 */
struct sem_undo *undo; /* 在這個陣列上的undo 請求 */
ushort sem_nsems; /* 在訊號量陣列上的訊號量號 */
};
(3)系統中每一訊號量集合的佇列結構(sem_queue)
struct
{
struct sem_queue *next; /* 佇列中下一個節點 */
struct sem_queue **prev; /* 佇列中前一個節點, *(q->prev) == q */
struct wait_queue *sleeper; /* 正在睡眠的程序 */
struct sem_undo *undo; /* undo 結構*/
int pid; /* 請求程序的程序識別號 */
int status; /* 操作的完成狀態 */
struct semid_ds *sma; /*有操作的訊號量集合陣列 */
struct
int nsops; /* 操作的個數 */
};