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

string

string
posts - 27, comments - 177, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

用戶(hù)級(jí)線程切換

Posted on 2012-01-15 07:01 djx_zh 閱讀(5570) 評(píng)論(0)  編輯 收藏 引用
實(shí)現(xiàn)線程庫(kù)的一個(gè)核心問(wèn)題是實(shí)現(xiàn)線程的切換。線程切換主要做了兩件事:一是舊線程執(zhí)行環(huán)境的保存,二是新線程執(zhí)行環(huán)境的恢復(fù)。執(zhí)行環(huán)境主要指寄存器,棧的切換也是通過(guò)寄存器的切換來(lái)完成的。
非搶占式用戶(hù)級(jí)線程可以使用兩類(lèi)接口來(lái)實(shí)現(xiàn): longjmp和setjmp; swapcontext,makecontext,setcontext. 在此不再贅述。
搶占式用戶(hù)級(jí)線程切換
線程切換的時(shí)機(jī)。 切換分兩種,一種是主動(dòng)切換,一種是被動(dòng)切換。主動(dòng)切換是非搶占式的;被動(dòng)切換發(fā)生在時(shí)間片用完之后,一個(gè)線程的時(shí)間片用完后就要強(qiáng)行切換到另外的線程。那么被動(dòng)切換很自然的要發(fā)生在時(shí)鐘中斷里。在linux里面我們使用alarm信號(hào)。既然如此,趕快動(dòng)手吧。
void timeHandler (int signo)
{  
    thread_list 
*  old;    if(signo != SIGALRM) return ;   
    signal(SIGALRM,timeHandler);   
    //! 如果有結(jié)束了的線程,釋放該線程。
    ...   

    old  
=  sys.current;
    
if(old == 0){
        
if(sys.threads){
            sys.current  
=  sys.threads;
            longjmp(sys.current 
-> thread.buf,  1 );
        }
    }
else{
        sys.current  
=  GetNext(sys.current)
        
if(sys.current){
            
if  (!setjmp(old -> thread.buf,1)){
                longjmp(sys.current 
-> thread.buf,  1 );
            }
        }
    }
}
我們會(huì)很悲觀的發(fā)現(xiàn),alarm信號(hào)只發(fā)生了一此。問(wèn)題出在哪兒呢?原來(lái)linux的信號(hào)是不可重入的。進(jìn)入信號(hào)處理函數(shù)之前,該信號(hào)被屏蔽,退出該信號(hào)處理函數(shù)之后該信號(hào)重新開(kāi)放。而在信號(hào)處理函數(shù)中發(fā)生longjmp后,程序就跳轉(zhuǎn)到其他線程,該信號(hào)處理函數(shù)不能退出。為了能再次進(jìn)入信號(hào)處理函數(shù),我們?cè)谇袚Q之前就要重新開(kāi)放該信號(hào)。我們可以使用siglongjmp/sigsetjmp代替longjmp/setjmp.
雖然該方法能夠?qū)崿F(xiàn)搶占功能,但總讓人覺(jué)得不舒服。沒(méi)有退出的信號(hào)處理函數(shù)讓人如骨鯁在喉。有沒(méi)有更優(yōu)美的方法呢?
先來(lái)看一下信號(hào)處理的流程:以alarm信號(hào)為例。
1。 alarm信號(hào)到達(dá),執(zhí)行權(quán)由用戶(hù)空間進(jìn)入內(nèi)核空間,棧自動(dòng)切換到內(nèi)核棧(內(nèi)核棧指針存放在TSS結(jié)構(gòu)的ESP0中)。同時(shí)用戶(hù)空間的執(zhí)行環(huán)境存放到內(nèi)核棧中。
2。 內(nèi)核進(jìn)行一些信號(hào)相關(guān)工作。 最后發(fā)現(xiàn)我們注冊(cè)了alarm信號(hào)的處理函數(shù),然后建立執(zhí)行信號(hào)handler的棧環(huán)境(通常在用戶(hù)棧棧頂),將已經(jīng)保存在內(nèi)核棧中的用戶(hù)執(zhí)行環(huán)境復(fù)制到信號(hào)處理函數(shù)棧。 然后通過(guò)reti從內(nèi)核返回到用戶(hù)空間,恢復(fù)用戶(hù)空間執(zhí)行環(huán)境,執(zhí)行信號(hào)處理函數(shù)。
3。 執(zhí)行完信號(hào)處理函數(shù)后,再次進(jìn)入內(nèi)核,注意此次進(jìn)入內(nèi)核后,內(nèi)核棧會(huì)再次自動(dòng)保存用戶(hù)空間執(zhí)行環(huán)境,但這不是我們需要的。所以?xún)?nèi)核會(huì)將信號(hào)處理函數(shù)棧中的用戶(hù)執(zhí)行環(huán)境復(fù)制回內(nèi)核棧。
4。  再次從內(nèi)核空間切換到用戶(hù)空間,用戶(hù)執(zhí)行環(huán)境自動(dòng)恢復(fù)到alarm信號(hào)到達(dá)時(shí)的執(zhí)行狀態(tài)。
分析后我們會(huì)發(fā)現(xiàn),當(dāng)我們執(zhí)行信號(hào)處理函數(shù)時(shí),棧頂是保存了用戶(hù)執(zhí)行環(huán)境的,通過(guò)更換這個(gè)執(zhí)行環(huán)境,就可以達(dá)到用戶(hù)態(tài)線程切換的目的。
#include <sys/ucontext.h>
# if __WORDSIZE == 64
#define OFFSET_TO_SIGCONTEXT 7 
# else
#define OFFSET_TO_SIGCONTEXT 3 
# endif
void
 timeHandler (int signo)
{
    unsigned 
int i, j;
    sigcontext
* psig_context;        
    if(signo != SIGALRM) return ;
    signal(SIGALRM,timeHandler);
    __asm( 
"lea (%%" bp_register ", %1), %0":"=r"(psig_context): "r"(OFFSET_TO_SIGCONTEXT* sizeof(ptr_size*)));
    schedule(psig_context);

}
用戶(hù)執(zhí)行環(huán)境用sigcontext結(jié)構(gòu)體來(lái)描述, 在64位系統(tǒng)中,該結(jié)構(gòu)體位于 RBP + 7*8 位置處; 在32位系統(tǒng)中位于EBP+3*4位置處。 __asm( "lea (%%" bp_register ", %1), %0":"=r"(psig_context): "r"(OFFSET_TO_SIGCONTEXT* sizeof(ptr_size*))); 用于獲得該結(jié)構(gòu)體指針,然后就可以傳到 調(diào)度函數(shù)用戶(hù)線程切換了。

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            国色天香一区二区| 欧美超级免费视 在线| 久久先锋影音| 久久www成人_看片免费不卡| 欧美激情视频在线播放| 久久久精彩视频| 国产精品亚洲一区| 9久re热视频在线精品| 亚洲黄色毛片| 久热爱精品视频线路一| 久久精品91| 国产欧美精品久久| 亚洲视频在线二区| 亚洲网址在线| 欧美久久在线| 亚洲精品看片| 日韩亚洲欧美精品| 欧美精品一区二区视频| 亚洲电影成人| 亚洲精品视频一区| 美女视频网站黄色亚洲| 蜜桃久久av| 亚洲国产精品va在线看黑人| 久久久www成人免费无遮挡大片| 欧美在线不卡| 国产精品视频| 欧美一区二区三区视频在线| 欧美中在线观看| 国产亚洲一区精品| 久久超碰97人人做人人爱| 久久久7777| 在线看片日韩| 欧美日本韩国| 亚洲无毛电影| 久久免费视频观看| 亚洲福利精品| 欧美伦理一区二区| 亚洲性xxxx| 久久久久久亚洲精品杨幂换脸| 国产一区二区精品久久99| 久久岛国电影| 亚洲欧洲日产国产网站| 亚洲无毛电影| 国内精品久久久久影院 日本资源| 欧美在线日韩| 亚洲国产精品尤物yw在线观看 | 国产性色一区二区| 欧美一区亚洲| 亚洲国产精品国自产拍av秋霞| 亚洲免费av电影| 国产精品美女主播| 久久久久久久999精品视频| 欧美激情亚洲| 亚洲欧美精品中文字幕在线| 国产日韩一区| 欧美国产日韩一二三区| 亚洲欧美日韩精品一区二区| 久久性色av| 亚洲午夜精品一区二区| 国产一区二区福利| 欧美另类综合| 欧美一区二区高清| 亚洲美女av网站| 久久久久久9999| 99精品视频免费全部在线| 国产一区二区电影在线观看| 欧美激情精品久久久六区热门| 亚洲综合不卡| 亚洲精品孕妇| 欧美成人免费播放| 午夜精品亚洲| 亚洲开发第一视频在线播放| 国产亚洲一区在线| 欧美午夜理伦三级在线观看| 久久久综合香蕉尹人综合网| 亚洲视频一区二区| 亚洲国产成人在线视频| 久久久久久999| 亚洲欧美日韩一区二区三区在线| 91久久精品一区| 国产综合久久| 国产精品永久| 国产精品国产三级国产普通话三级| 久久久久欧美| 欧美一级夜夜爽| 亚洲宅男天堂在线观看无病毒| 最新国产成人在线观看 | 亚洲欧美中文另类| 亚洲免费福利视频| 亚洲电影在线| 在线精品视频免费观看| 国产亚洲精品aa午夜观看| 欧美色欧美亚洲另类七区| 欧美福利视频在线观看| 免播放器亚洲一区| 久久免费国产| 久久精品国产欧美亚洲人人爽| 亚洲一区久久久| 亚洲一区二区三区在线视频| 亚洲精品中文字幕有码专区| 亚洲国产欧美国产综合一区| 欧美福利视频| 亚洲福利久久| 亚洲精品护士| 亚洲三级免费电影| 亚洲精品裸体| 日韩亚洲国产精品| 一区二区日韩欧美| 亚洲色在线视频| 亚洲网址在线| 午夜精品久久久久久久99热浪潮| 亚洲天堂久久| 亚洲欧美日韩在线观看a三区| 亚洲一区二区三区777| 亚洲一区3d动漫同人无遮挡| 亚洲一区二区三区在线播放| 亚洲图片在线观看| 亚洲欧美视频一区| 久久精品亚洲| 女主播福利一区| 欧美精品一区二区三区四区| 欧美日韩在线一区| 国产精品入口夜色视频大尺度 | 亚洲人午夜精品| 亚洲理论在线| 亚洲在线播放| 久久久亚洲国产天美传媒修理工| 久久亚洲高清| 亚洲三级免费电影| 亚洲一区在线观看视频| 久久精品国产第一区二区三区最新章节 | 中文在线资源观看网站视频免费不卡| 中日韩视频在线观看| 亚洲一区制服诱惑| 久久久综合网| 亚洲国产乱码最新视频| 在线亚洲成人| 久久永久免费| 国产精品大片wwwwww| 国产综合网站| 亚洲另类在线视频| 欧美在线免费观看视频| 欧美aa在线视频| 亚洲一级网站| 久久综合亚洲社区| 国产精品推荐精品| 亚洲激情六月丁香| 欧美一区二区三区的| 亚洲福利专区| 性色av一区二区怡红| 欧美喷水视频| 影音先锋日韩精品| 亚洲在线视频网站| 欧美激情亚洲国产| 欧美一区二区成人| 欧美日韩在线亚洲一区蜜芽| 国内综合精品午夜久久资源| 亚洲视频观看| 亚洲缚视频在线观看| 欧美一区二区视频在线观看2020| 欧美精品一区二区久久婷婷 | 欧美午夜寂寞影院| 在线观看日韩av电影| 午夜精品久久| 亚洲欧洲精品天堂一级| 久久久噜噜噜久噜久久| 国产精品成人va在线观看| 亚洲区第一页| 久久午夜精品一区二区| 亚洲欧美影音先锋| 欧美日韩国产精品一区| 亚洲国产精品久久久久秋霞蜜臀| 欧美在线亚洲在线| 一区二区三区高清在线 | 国产午夜亚洲精品不卡| 亚洲午夜高清视频| 亚洲人成网站在线播| 欧美chengren| 亚洲福利国产| 免费在线看成人av| 欧美在线播放| 国产一区二区三区在线播放免费观看| 亚洲淫性视频| 在线亚洲一区| 欧美日韩免费观看一区=区三区| 91久久极品少妇xxxxⅹ软件| 美国成人毛片| 久久久久国产精品厨房| 红桃视频欧美| 女人色偷偷aa久久天堂| 久久久一区二区三区| 伊人伊人伊人久久| 免费国产一区二区| 久久久在线视频| 亚洲第一精品夜夜躁人人躁| 美脚丝袜一区二区三区在线观看 | 亚洲综合色在线| 国产美女精品| 久久精品水蜜桃av综合天堂| 欧美在线日韩在线|