對jiq中一段程式以及prepare_to_wait的理解

來源:互聯網
上載者:User
其中一個程式的代碼如下:
static int jiq_read_wq(char *buf, char **start, off_t offset,
                   int len, int *eof, void *data)
{
    DEFINE_WAIT(wait);
   
    jiq_data.len = 0;                /* nothing printed, yet */
    jiq_data.buf = buf;              /* print in this place */
    jiq_data.jiffies = jiffies;      /* initial time */
    jiq_data.delay = 0;
   prepare_to_wait(&jiq_wait, &wait, TASK_INTERRUPTIBLE);
    printk(KERN_ALERT "work qian is %4li/n",jiffies);
    schedule_work(&jiq_work);
    printk(KERN_ALERT "work hou is %4li/n",jiffies);
    schedule();
    printk(KERN_ALERT "schedule hou is %4li/n",jiffies);
    finish_wait(&jiq_wait, &wait);
 
    *eof = 1;
    return jiq_data.len;
}
其中還有一個用於喚醒if (len > LIMIT) {
        printk(KERN_ALERT "jiffies of len wake_up is %4li/n",jiffies);
        wake_up_interruptible(&jiq_wait);
        return 0;
    }
還有一個初始化INIT_WORK(&jiq_work, jiq_print_wq, &jiq_data);

我的理解如下:
1   首先在初始化時由INIT_WORK(&jiq_work, jiq_print_wq, &jiq_data)初始化一個工作隊列。這個隊列並提交給核心由一個單獨的線程去管理。
2 程式按照這個步驟執行
    prepare_to_wait(&jiq_wait, &wait, TASK_INTERRUPTIBLE);
    printk(KERN_ALERT "work qian is %4li/n",jiffies);
    schedule_work(&jiq_work);
    printk(KERN_ALERT "work hou is %4li/n",jiffies);
   其中要說明的是prepare_to_wait的作用是把該進程標記為TASK_INTERRUPTIBLE,並添加到等待隊列中。(通過實驗知道,程式並不會在這裡停下來,不知道理解的對不對)
  schedule_work(&jiq_work);使工作隊列起作用。
3 程式繼續執行
    schedule();
    printk(KERN_ALERT "schedule hou is %4li/n",jiffies);
    finish_wait(&jiq_wait, &wait);
  程式通過schedule();調度另一個程式運行。另一個程式通過喚醒當前的這個程式,然後到finish_wait結束。
通過實驗知道程式會在schedule();處停住。不知道對不對。只有繼續看書,以後在理解了。

掛起的進程並不會自動轉入啟動並執行,因此,還需要一個喚醒動作,這個動作由wake_up_interruptible()完成,它將遍曆作為參數傳入的 log_wait等待隊列,將其中所有的元素(通常都是task_struct)置為運行態,從而可被調度到,執行 __wait_event_interruptible()中的代碼。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.