『壹』 linux系統中實現阻塞有哪些方法 等待隊列 自旋鎖 中斷
你只在 server 進程中(對應spid==0),調用 open_queue 來打開消息隊列,即msqid只在這個進程中有效,在host進程中(內對應cpid==0),由於容msqid無效,所以無法發送消息。 解決方法:只要把 do { msqid = open_queue(key); } while (msqid == -1); 這段代碼移到第一個fork之前,這樣所有的進程中的msqid就都指向那個隊列了。 還有問題可以 hi我,別忘了加分。
『貳』 Linux 工作隊列和等待隊列的區別
work queue是一種bottom half,中斷處理的後半程,強調的是動態的概念,即是重點,而queue是其次。
wait queue是一種「任務隊列」,可以把一些進程放在上面睡眠等待某個事件,強調靜態多一些,重點在queue上,即它就是一個queue,這個queue如何調度,什麼時候調度並不重要
等待隊列在內核中有很多用途,尤其適合用於中斷處理,進程同步及定時。這里只說,進程經常必須等待某些事件的發生。例如,等待一個磁碟操作的終止,等待釋放系統資源,或者等待時間經過固定的間隔。
等待隊列實現了在事件上的條件等待,希望等待特定事件的進程把放進合適的等待隊列,並放棄控制權。因此。等待隊列表示一組睡眠的進程,當某一條件為真時,由內核喚醒進程。
等待隊列由循環鏈表實現,其元素包括指向進程描述符的指針。每個等待隊列都有一個等待隊列頭,等待隊列頭是一個類型為wait_queue_head_t的數據結構。
等待隊列鏈表的每個元素代表一個睡眠進程,該進程等待某一事件的發生,描述符地址存放在task欄位中。然而,要喚醒等待隊列中所有的進程有時並不方便。例如,如果兩個或多個進程在等待互斥訪問某一個要釋放的資源,僅喚醒等待隊列中一個才有意義。這個進程佔有資源,而其他進程繼續睡眠可以用DECLARE_WAIT_QUEUE_HEAD(name)宏定義一個新的等待隊列,該宏靜態地聲明和初始化名為name的等待隊列頭變數。 init_waitqueue_head()函數用於初始化已動態分配的wait queue head變數等待隊列可以通過DECLARE_WAITQUEUE()靜態創建,也可以用init_waitqueue_head()動態創建。進程放入等待隊列並設置成不可執行狀態。
工作隊列,workqueue,它允許內核代碼來請求在將來某個時間調用一個函數。用來處理不是很緊急事件的回調方式處理方法.工作隊列的作用就是把工作推後,交由一個內核線程去執行,更直接的說就是寫了一個函數,而現在不想馬上執行它,需要在將來某個時刻去執行,那就得用工作隊列准沒錯。
如果需要用一個可以重新調度的實體來執行下半部處理,也應該使用工作隊列。是唯一能在進程上下文運行的下半部實現的機制。這意味著在需要獲得大量的內存時、在需要獲取信號量時,在需要執行阻塞式的I/O操作時,都會非常有用。
『叄』 Linux中如何查看等待處理的隊列數
如果是系統性能的話可以用vmstat 的procs 里的b那一項
『肆』 linux的進程等待隊列有幾個
根據等待不同的事件類型分成多個,比如jbd中等待數據寫入完成,還有sched中等待時間經過固定的間隔,都會使用各種wait queue.
『伍』 Linux內核中等待隊列的幾種用法
1. 睡眠等待某個條件發生(條件為假時睡眠):
睡眠方式:wait_event, wait_event_interruptible
喚醒方式:wake_up (喚醒時要檢測條件是否為真,如果還為假則繼續睡眠,喚醒前一定要把條件變為真)
2. 手工休眠方式一:
1)建立並初始化一個等待隊列項
DEFINE_WAIT(my_wait) <== wait_queue_t my_wait; init_wait(&my_wait);
2)將等待隊列項添加到等待隊列頭中,並設置進程的狀態
prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)
3)調用schele(),告訴內核調度別的進程運行
4)schele返回,完成後續清理工作
finish_wait()
3. 手工休眠方式二:
1)建立並初始化一個等待隊列項:
DEFINE_WAIT(my_wait) <== wait_queue_t my_wait; init_wait(&my_wait);
2)將等待隊列項添加到等待隊列頭中:
add_wait_queue
3)設置進程狀態
__set_current_status(TASK_INTERRUPTIBLE);
4)schele()
5)將等待隊列項從等待隊列中移除
remove_wait_queue()
其實,這種休眠方式相當於把手工休眠方式一中的第二步prepare_to_wait拆成兩步做了,即prepare_to_wait <====add_wait_queue + __set_current_status,其他都是一樣的。
4. 老版本的睡眠函數sleep_on(wait_queue_head_t *queue):
『陸』 linux 怎樣讓當前進程進入等待隊列
對於linux而言,進程的等待是由於kernel中的一個事件等待隊列,這個進程排在了這個等待隊列里,他就標志為等待狀態。在這個隊列的等待資源就緒後,隊列里的進程也都會成為就緒。