青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

jake1036

linux0.11進(jìn)程切換

就緒態(tài)和運(yùn)行態(tài)之間的切換

    當(dāng)前占用CPU的進(jìn)程,只有調(diào)用了schedule()函數(shù),才會由運(yùn)行態(tài)轉(zhuǎn)變?yōu)榫途w態(tài),schedule()函數(shù)選擇狀態(tài)為TASK_RUNNING的進(jìn)程,
    然后調(diào)用switch函數(shù),將cpu切換到所選定的進(jìn)程。
   schedule()函數(shù)可能會在以下三種情況下調(diào)用:
   (1) 用戶態(tài)時發(fā)生時鐘中斷
        
       如果當(dāng)前進(jìn)程是用戶態(tài)進(jìn)程,并且當(dāng)前進(jìn)程的時間片用完,那么中斷處理函數(shù)do_timer()就會調(diào)用schedule()函數(shù),
      這相當(dāng)于用戶態(tài)的進(jìn)程被搶斷了。
      如果當(dāng)前的進(jìn)程屬于內(nèi)核態(tài)進(jìn)程,那么該進(jìn)程是不會被搶占的。schedule() 函數(shù)不是系統(tǒng)調(diào)用,用戶程序不能直接調(diào)用,
     但是放在時間中斷函數(shù)中,就能夠調(diào)用。所以在時間中斷中調(diào)用schedule()是必要的,這樣就保證用戶進(jìn)程不會永久地占有CPU。
    
   (2)系統(tǒng)調(diào)用時,相應(yīng)的sys_xxxx()函數(shù)返回之后。
         這種情況是為了處理運(yùn)行在內(nèi)核態(tài)的進(jìn)程,應(yīng)用程序一般是通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài),因此,linux系統(tǒng)調(diào)用處理函數(shù)在結(jié)束的時候,
         int 0x80 中斷函數(shù)會檢查當(dāng)前進(jìn)程的時間片和狀態(tài),如果時間片用完或者進(jìn)程的狀態(tài)不為RUNNING ,就會調(diào)用schedule()函數(shù)。
        由此可見,如果系統(tǒng)的某個系統(tǒng)調(diào)用處理函數(shù)或者中斷處理異常永遠(yuǎn)不退出,那么整個系統(tǒng)就會死鎖,任何進(jìn)程都無法運(yùn)行。
   (3)在睡眠函數(shù)內(nèi)
       當(dāng)進(jìn)程等待的資源還不可用的時候,它就進(jìn)入了睡眠狀態(tài),并且調(diào)用schedule()函數(shù)再次調(diào)用CPU。

   
#define switch_to(n) {\
// __tmp用來構(gòu)造ljmp的操作數(shù)。該操作數(shù)由4字節(jié)偏移和2字節(jié)選擇符組成。當(dāng)選擇符
// 是TSS選擇符時,指令忽略4字節(jié)偏移。
// __tmp.a存放的是偏移,__tmp.b的低2字節(jié)存放TSS選擇符。高兩字節(jié)為0。
// ljmp跳轉(zhuǎn)到TSS段選擇符會造成任務(wù)切換到TSS選擇符對應(yīng)的進(jìn)程。
// ljmp指令格式是 ljmp 16位段選擇符:32位偏移,但如果操作數(shù)在內(nèi)存中,順序正好相反。

// %0    內(nèi)存地址    __tmp.a的地址,用來放偏移
// %1    內(nèi)存地址    __tmp.b的地址,用來放TSS選擇符
// %2    edx            任務(wù)號為n的TSS選擇符
// %3    ecx            task[n]
struct {long a,b;} __tmp; \
__asm__(
"cmpl %%ecx,current\n\t" \    // 如果要切換的任務(wù)是當(dāng)前任務(wù)
    "je 1f\n\t" \                    // 直接退出
    "movw %%dx,%1\n\t" \            // 把TSS選擇符放入__tmp.b中
    "xchgl %%ecx,current\n\t" \        // 讓current指向新進(jìn)程的task_struct
    "ljmp *%0\n\t" \                // 任務(wù)切換在這里發(fā)生,CPU會搞定一切
    "cmpl %%ecx,last_task_used_math\n\t" \    // 除進(jìn)程第一次被調(diào)度外,以后進(jìn)程從就緒
                                        
// 態(tài)返回運(yùn)行態(tài)后,都從這里開始運(yùn)行。因
                                        
// 而返回到的是內(nèi)核運(yùn)行態(tài)。
    "jne 1f\n\t" \
    
"clts\n" \
    
"1:" \
    ::
"m" (*&__tmp.a),"m" (*&__tmp.b), \
    
"d" (_TSS(n)),"c" ((long) task[n])); \
}


   進(jìn)程調(diào)度函數(shù)
   
/****************************************************************************/
/* 功能:進(jìn)程調(diào)度。                                                            */
/*         先對alarm和信號進(jìn)行處理,如果某個進(jìn)程處于可中斷睡眠狀態(tài),并且收    */
/*         到信號,則把進(jìn)程狀態(tài)改成可運(yùn)行。之后在處可運(yùn)行狀態(tài)的進(jìn)程中挑選一個    */
/*         并用switch_to()切換到那個進(jìn)程                                        */
/* 參數(shù):(無)                                                                */
/* 返回:(無)                                                                */
/****************************************************************************/
void schedule(void)
{
    
int i,next,c;
    
struct task_struct ** p;

/* check alarm, wake up any interruptible tasks that have got a signal */
// 首先處理alarm信號,喚醒所有收到信號的可中斷睡眠進(jìn)程
    for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
        
if (*p) {
            
// 如果進(jìn)程設(shè)置了alarm,并且alarm已經(jīng)到時間了
            if ((*p)->alarm && (*p)->alarm < jiffies) {
                    
// 向該進(jìn)程發(fā)送SIGALRM信號
                    (*p)->signal |= (1<<(SIGALRM-1));
                    (
*p)->alarm = 0;    // 清除alarm
                }

//可屏蔽信號位圖BLOCKABLE定義在sched.c第24行,(~(_S(SIGKILL) | _S(SIGSTOP)))
// 說明SIGKILL和SIGSTOP是不能被屏蔽的。
// 可屏蔽信號位圖 & 當(dāng)前進(jìn)程屏蔽的信號位圖 = 當(dāng)前進(jìn)程實(shí)際屏蔽的信號位圖
// 當(dāng)前進(jìn)程收到的信號位圖 & ~當(dāng)前進(jìn)程實(shí)際屏蔽的信號位圖 
//                            = 當(dāng)前進(jìn)程收到的允許相應(yīng)的信號位圖
// 如果當(dāng)前進(jìn)程收到允許相應(yīng)的信號,并且當(dāng)前進(jìn)程處于可中斷睡眠態(tài)
// 則把狀態(tài)改成運(yùn)行態(tài),參與下面的選擇過程
            if (((*p)->signal & ~(_BLOCKABLE & (*p)->blocked)) &&
            (
*p)->state==TASK_INTERRUPTIBLE)
                (
*p)->state=TASK_RUNNING;
        }


/* this is the scheduler proper: */
// 下面是進(jìn)程調(diào)度的主要部分
    while (1{
        c 
= -1;
        next 
= 0;
        i 
= NR_TASKS;
        p 
= &task[NR_TASKS];
        
while (--i) {        // 遍歷整個task[]數(shù)組
            if (!*--p)        // 跳過task[]中的空項(xiàng)
                continue;
            
// 尋找剩余時間片最長的可運(yùn)行進(jìn)程,
//  c記錄目前找到的最長時間片
// next記錄目前最長時間片進(jìn)程的任務(wù)號
            if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
                c 
= (*p)->counter, next = i;
        }

    
// 如果有進(jìn)程時間片沒有用完c一定大于0。這時退出循環(huán),執(zhí)行 switch_to任務(wù)切換
        if (c) break;
    
// 到這里說明所有可運(yùn)行進(jìn)程的時間片都用完了,則利用任務(wù)優(yōu)先級重新分配時間片。
    
// 這里需要重新設(shè)置所有任務(wù)的時間片,而不光是可運(yùn)行任務(wù)的時間片。
    
// 利用公式:counter = counter/2 + priority
        for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
            
if (*p)
                (
*p)->counter = ((*p)->counter >> 1+
                        (
*p)->priority;
    
// 整個設(shè)置時間片過程結(jié)束后,重新進(jìn)入進(jìn)程選擇過程
    }

    
// 當(dāng)?shù)纳厦娴难h(huán)退出時,說明找到了可以切換的任務(wù)
    switch_to(next);
}


     
    2   運(yùn)行態(tài)和睡眠態(tài)之間的轉(zhuǎn)化
          當(dāng)進(jìn)程等待資源或者事件的時候,就進(jìn)入了睡眠狀態(tài),有兩種不同的睡眠狀態(tài),   不可中斷睡眠狀態(tài)和可中斷睡眠狀態(tài)。
          處于可中斷睡眠狀態(tài)的進(jìn)程,不光可以由wake_up 喚醒,還可以由信號喚醒,在schedule()函數(shù)中,會把處于可中斷睡眠狀態(tài)的并且接收到信號的
        進(jìn)程變?yōu)檫\(yùn)行狀態(tài)。linux0.11的可中斷睡眠狀態(tài)可以由以下三中函數(shù)進(jìn)入:
       (1)調(diào)用interruptiable_sleep_on()函數(shù)、
       (2)調(diào)用sys_pause()函數(shù)。
       (3)調(diào)用sys_waitpid()函數(shù)。

    進(jìn)程要進(jìn)入不可中斷睡眠狀態(tài),必須調(diào)用sleep_on()函數(shù)。進(jìn)程調(diào)用wake_up()函數(shù),將處于不可中斷狀態(tài)的進(jìn)程喚醒。

   
 
/****************************************************************************/
/* 功能:當(dāng)前進(jìn)程進(jìn)入不可中斷睡眠態(tài),掛起在等待隊(duì)列上                        */
/* 參數(shù):p 等待隊(duì)列頭                                                        */
/* 返回:(無)                                                                */
/****************************************************************************/
void sleep_on(struct task_struct **p)
{
    
struct task_struct *tmp;        // tmp用來指向等待隊(duì)列上的下一個進(jìn)程

    
if (!p)            // 無效指針,退出
        return;
    
if (current == &(init_task.task))    // 進(jìn)程0不能睡眠
        panic("task[0] trying to sleep");
    tmp 
= *p;            // 下面兩句把當(dāng)前進(jìn)程放到等待隊(duì)列頭,等待隊(duì)列是以堆棧方式
    *= current;        //    管理的。后到的進(jìn)程等在前面
    current->state = TASK_UNINTERRUPTIBLE;    // 進(jìn)程進(jìn)入不可中斷睡眠狀態(tài)
    schedule();        // 進(jìn)程放棄CPU使用權(quán),重新調(diào)度進(jìn)程
// 當(dāng)前進(jìn)程被wake_up()喚醒后,從這里開始運(yùn)行。
// 既然等待的資源可以用了,就應(yīng)該喚醒等待隊(duì)列上的所有進(jìn)程,讓它們再次爭奪
// 資源的使用權(quán)。這里讓隊(duì)列里的下一個進(jìn)程也進(jìn)入運(yùn)行態(tài)。這樣當(dāng)這個進(jìn)程運(yùn)行
// 時,它又會喚醒下下個進(jìn)程。最終喚醒所有進(jìn)程。
    if (tmp)    
        tmp
->state=0;
}


 

當(dāng)前進(jìn)程

的地址空間

tmp指針

當(dāng)前進(jìn)程的task_struct

進(jìn)程2

的地址空間

tmp指針

進(jìn)程2task_struct

進(jìn)程1

的地址空間

tmp指針

進(jìn)程1task_struct

*p

current


  以下是喚醒函數(shù) 
  
/****************************************************************************/
/* 功能:喚醒等待隊(duì)列上的頭一個進(jìn)程                                            */
/* 參數(shù):p 等待隊(duì)列頭                                                        */
/* 返回:(無)                                                                */
/****************************************************************************/
void wake_up(struct task_struct **p)
{
    
if (p && *p) {
        (
**p).state=0;        // 把隊(duì)列上的第一個進(jìn)程設(shè)為運(yùn)行態(tài)
        *p=NULL;        // 把隊(duì)列頭指針清空,這樣失去了都其他等待進(jìn)程的跟蹤。
                        
//  一般情況下這些進(jìn)程遲早會得到運(yùn)行。
    }

}



   
  



posted on 2010-11-14 15:17 kahn 閱讀(1586) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久青草欧美一区二区三区| 亚洲国产一成人久久精品| 午夜精品久久久久久久99樱桃 | 国产精品青草久久| 国产精品二区二区三区| 国产精品久久久久一区| 国产精品呻吟| 国产亚洲观看| 亚洲国产综合视频在线观看| 日韩一级黄色av| 亚洲自拍三区| 久久久久久噜噜噜久久久精品| 久久亚洲高清| 亚洲国产一区二区三区高清 | 亚洲午夜精品一区二区| 亚洲欧美在线高清| 蜜臀久久99精品久久久画质超高清| 欧美福利一区| 亚洲视频视频在线| 久久久久久久久久看片| 欧美日韩国产成人在线免费| 国产精品无码永久免费888| 韩日成人av| 亚洲视频www| 99这里有精品| 美女久久一区| 欧美日本精品在线| 国产日韩欧美日韩| 日韩图片一区| 久久免费视频一区| 一本色道久久综合亚洲精品不| 欧美一区二区免费| 欧美日韩国产小视频| 国产主播精品| 午夜激情一区| 亚洲精品一区中文| 久久久久久综合| 国产精品毛片在线| 一本色道久久99精品综合| 美女999久久久精品视频| 99天天综合性| 免费在线看成人av| 精品99一区二区| 欧美在线影院在线视频| 夜夜嗨av一区二区三区免费区 | 免费av成人在线| 国产色产综合产在线视频| 亚洲一区影院| 日韩视频一区二区三区在线播放免费观看 | 一区二区三区黄色| 欧美大片免费| 久久久久久久久综合| 国产欧美一区二区三区另类精品| 亚洲私人影院在线观看| 亚洲国产天堂久久综合网| 麻豆精品传媒视频| 亚洲二区免费| 欧美激情在线有限公司| 蜜桃av一区二区三区| 亚洲国产精品黑人久久久| 免费成人你懂的| 久久亚洲一区| 亚洲黄色三级| 亚洲国产日韩一区| 欧美顶级艳妇交换群宴| 亚洲免费观看高清完整版在线观看| 欧美国产日韩在线观看| 欧美成人午夜视频| 99re6热只有精品免费观看| 亚洲日本在线观看| 欧美日韩国产另类不卡| 亚洲一区激情| 欧美一级精品大片| 好看不卡的中文字幕| 美玉足脚交一区二区三区图片| 亚洲主播在线| 久久国产夜色精品鲁鲁99| 性色av一区二区怡红| 好吊视频一区二区三区四区| 欧美激情一区二区| 欧美日韩另类在线| 欧美与欧洲交xxxx免费观看| 久久激情综合网| 亚洲黄色免费网站| 中国成人黄色视屏| 国内精品久久久久久久影视麻豆| 欧美a级片网站| 欧美日韩中文另类| 欧美怡红院视频| 蜜桃av一区| 欧美淫片网站| 欧美精品大片| 久久久久久网| 欧美日韩国产综合网 | 亚洲国产高清一区二区三区| 最新日韩在线| 国产欧美91| 亚洲国产你懂的| 国产乱子伦一区二区三区国色天香| 久久全球大尺度高清视频| 欧美精品91| 久久久午夜精品| 欧美激情一区二区三区在线| 欧美一区网站| 欧美激情精品久久久久久免费印度 | 欧美日韩在线视频观看| 久久免费高清视频| 欧美日韩国产成人在线免费| 久久婷婷国产综合国色天香| 欧美视频一区二区三区| 欧美va天堂va视频va在线| 国产精品青草久久| 亚洲精品资源美女情侣酒店| 黄色成人av在线| 亚洲欧美综合一区| 亚洲免费视频在线观看| 欧美黄色网络| 亚洲高清资源| 在线看国产日韩| 久久成人一区| 久久精品亚洲精品| 国产精品一区亚洲| 在线视频一区二区| 一区二区日韩| 欧美激情精品久久久六区热门| 麻豆精品精华液| 国产亚洲欧美日韩在线一区| 亚洲色图制服丝袜| 中文在线不卡| 欧美视频成人| 国产精品99久久99久久久二8 | 亚洲国产二区| 亚洲国产精品女人久久久| 久久激情视频久久| 久久精品国产99精品国产亚洲性色| 欧美香蕉视频| avtt综合网| 亚洲影院色在线观看免费| 国产精品国产三级国产a| 一级成人国产| 欧美一区二区视频在线观看2020 | 亚洲精品久久久久| 国产精品一区二区久久精品| 亚洲字幕一区二区| 中文av一区二区| 欧美三级免费| 亚洲网址在线| 久久成人人人人精品欧| 国产日本亚洲高清| 久久成人资源| 欧美aaa级| 一本色道久久加勒比精品| 国产精品vip| 午夜在线播放视频欧美| 久久资源在线| 亚洲久久一区二区| 欧美日韩性生活视频| 在线视频亚洲| 久久婷婷久久| 一区二区欧美亚洲| 国产欧美亚洲一区| 久久综合久久美利坚合众国| 亚洲区免费影片| 欧美中在线观看| 91久久极品少妇xxxxⅹ软件| 欧美日韩日本网| 欧美亚洲在线播放| 欧美多人爱爱视频网站| 日韩午夜电影av| 国产日韩精品综合网站| 久久综合伊人77777麻豆| 日韩视频―中文字幕| 久久国产手机看片| 夜夜夜久久久| 国产一区二区三区无遮挡| 欧美不卡福利| 午夜精品视频一区| 亚洲人被黑人高潮完整版| 欧美在线你懂的| 99av国产精品欲麻豆| 激情久久五月天| 国产精品久久久久一区二区| 欧美成人免费小视频| 欧美一级在线视频| 亚洲另类在线一区| 蜜桃伊人久久| 欧美一区高清| 在线中文字幕一区| 在线日本成人| 日韩亚洲欧美一区| 免费看的黄色欧美网站| 亚洲男人的天堂在线| 亚洲免费激情| 亚洲高清免费在线| 久久综合伊人| 久久久人人人| 欧美在线日韩精品| 午夜精品成人在线视频| 宅男精品视频| 日韩一级免费观看|