亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 3567 | 回復(fù): 10
打印 上一主題 下一主題

關(guān)于等待隊列 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-01-10 23:43 |只看該作者 |倒序瀏覽
關(guān)于等待隊列,關(guān)于等待隊列的具體執(zhí)行過程大家來討論一下,實例代碼:
v2.6.11/net/irda/af_irda.c#L832
832static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
833{
834        ...
875        if (skb == NULL) {
876                int ret = 0;
877                DECLARE_WAITQUEUE(waitq, current);
878
879                /* Non blocking operation */
880                if (flags & O_NONBLOCK)
881                        return -EWOULDBLOCK;
882
883                /* The following code is a cut'n'paste of the
884                 * wait_event_interruptible() macro.
885                 * We don't us the macro because the condition has
886                 * side effects : we want to make sure that only one
887                 * skb get dequeued - Jean II */

888                add_wait_queue(sk->sk_sleep, &waitq);
889                for (;;) {
890                        set_current_state(TASK_INTERRUPTIBLE);
891                        skb = skb_dequeue(&sk->sk_receive_queue);
892                        if (skb != NULL)
893                                break;
894                        if (!signal_pending(current)) {
895                                schedule();
896                                continue;
897                        }
898                        ret = -ERESTARTSYS;
899                        break;
900                }
901                current->state = TASK_RUNNING;
902                remove_wait_queue(sk->sk_sleep, &waitq);
903                if(ret)
904                        return -ERESTARTSYS;
905        }
              ...

論壇徽章:
0
2 [報告]
發(fā)表于 2009-01-11 00:57 |只看該作者
討論什么?

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [報告]
發(fā)表于 2009-01-11 09:13 |只看該作者
這段代碼的大致意思是當(dāng)skb為NULL時,如果不是O_NONBLOCK(非阻塞)型的,就把自己加入等待隊列,等待事件的發(fā)生(也可以說是資源可獲。
當(dāng)被喚醒后:skb = skb_dequeue(&sk->sk_receive_queue);
就是去讀取skb,然后做一些檢查,看是否是信號把自己喚醒的,等待的資源是否真的獲得等。
推出for循環(huán)以后,就把自己的狀態(tài)置為TASK_RUNNING,并把自己從等待隊列中移出。

關(guān)于等待隊列的詳細(xì)描述,LDD和ULK都有比較詳細(xì)的描述。

論壇徽章:
0
4 [報告]
發(fā)表于 2009-01-12 16:10 |只看該作者

回復(fù) #3 dreamice 的帖子

嗯,dreamice解釋的比較清楚

論壇徽章:
0
5 [報告]
發(fā)表于 2009-01-12 17:29 |只看該作者
我?guī)蚻z問兩個問題吧?

  1. for (;;) {
  2. 890                        set_current_state(TASK_INTERRUPTIBLE);
  3. 891                        skb = skb_dequeue(&sk->sk_receive_queue);
  4. 892                        if (skb != NULL)
  5. 893                                break;
  6. 894                        if (!signal_pending(current)) {
  7. 895                                schedule();
  8. 896                                continue;
  9. 897                        }
  10. 898                        ret = -ERESTARTSYS;
  11. 899                        break;
  12. 900                }
復(fù)制代碼


1. 當(dāng)skb為NULL, 且沒有signal pending的時候, 則重新schedule.
問題:為什么schedule之后, 不嘗試從sk->receive_queue中取數(shù)據(jù), 然后如果是null再continue呢?

例如:
當(dāng)它schedule到另外一個task后,突然接收到一個報文存到recevice_queue中, 然后從schedule返回后, 如果按照現(xiàn)在的寫法, 它會執(zhí)行continue的動作.

2. skb為NULL, 且有signal pending為何要從新執(zhí)行一次sys_call, 是不是在執(zhí)行irda_accept之前會處理信號的handler(沒看代碼, 想確認(rèn)下)

論壇徽章:
0
6 [報告]
發(fā)表于 2009-01-12 17:31 |只看該作者
對于問題1, 還有一種情況: 當(dāng)切到另外一個任何后 只收一個報文(以后不會收到任何報文), 那么它schedule返回 按照我能力的理解它會sleep forever.

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [報告]
發(fā)表于 2009-01-13 10:16 |只看該作者
問題1:如果continue的話,你想想這種情況——本身這個進(jìn)程也同時在等待一個信號,但不知道是因為信號到了還是資源可用了,信號就是不能忽略的。
問題2:信號可以說是對一個進(jìn)程的中斷,他也是異步的。

論壇徽章:
0
8 [報告]
發(fā)表于 2009-01-13 10:36 |只看該作者
原帖由 dreamice 于 2009-1-13 10:16 發(fā)表
問題1:如果continue的話,你想想這種情況——本身這個進(jìn)程也同時在等待一個信號,但不知道是因為信號到了還是資源可用了,信號就是不能忽略的。
問題2:信號可以說是對一個進(jìn)程的中斷,他也是異步的。



對于你問題1的描述, 我這樣理解:

a. 信號不可以丟掉.
b. 如果schdule之后, continue之前, 我直接檢查資源然后break, 那么這個信號就被丟掉了.

是不是這樣?


另外, 如果在schdule之后, continue之前, 進(jìn)程收到一個報文(這個時候應(yīng)該回被data_ready喚醒吧), 但進(jìn)程continue繼續(xù)sleep, 那么
這個喚醒信號會不會丟失.

論壇徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
9 [報告]
發(fā)表于 2009-01-13 10:57 |只看該作者

回復(fù) #8 Arthur_ 的帖子

不是不可以丟掉,隨意丟掉信號的后果有時候是不堪設(shè)想的,所以有可靠信號與不可靠信號之分。信號可以和中斷類比,就像不能隨意丟掉一個終端一樣。

論壇徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辭舊歲徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
10 [報告]
發(fā)表于 2009-01-13 15:44 |只看該作者
原帖由 dreamice 于 2009-1-13 10:57 發(fā)表
不是不可以丟掉,隨意丟掉信號的后果有時候是不堪設(shè)想的,所以有可靠信號與不可靠信號之分。信號可以和中斷類比,就像不能隨意丟掉一個終端一樣。

學(xué)習(xí)
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP