小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

線程概述

 程零兒 2006-12-13

4.9 線程(Thread)

引入線程的目的是簡化線程間的通信,以小的開銷來提高進(jìn)程的并發(fā)程度。


4.9.1 線程的概念

  
線程 有時(shí)稱輕量級(jí)進(jìn)程。 進(jìn)程中的一個(gè)運(yùn)行實(shí)體,是一個(gè)CPU調(diào)度單位, 資源的擁有者還是進(jìn)程或稱任務(wù)

   事實(shí)上,引入線程主要是為了提高系統(tǒng)的執(zhí)行效率,減少處理機(jī)的空轉(zhuǎn)時(shí)間和調(diào)度切換(保護(hù)現(xiàn)場信息)的時(shí)間,以及便于系統(tǒng)管理。
  

             
      進(jìn)程與線程之間關(guān)系

   進(jìn)程和線程的比較
 進(jìn)程是資源分配的基本單位。所有與該進(jìn)程有關(guān)的資源,都被記錄在進(jìn)程控制塊PCB中。以表示該進(jìn)程擁有這些資源或正在使用它們。
另外,進(jìn)程也是搶占處理機(jī)的調(diào)度單位,它擁有一個(gè)完整的虛擬地址空間。
與進(jìn)程相對(duì)應(yīng),線程與資源分配無關(guān),它屬于某一個(gè)進(jìn)程,并與進(jìn)程內(nèi)的其他線程一起共享進(jìn)程的資源。

   當(dāng)進(jìn)程發(fā)生調(diào)度時(shí),不同的進(jìn)程擁有不同的虛擬地址空間,而同一進(jìn)程內(nèi)的不同線程共享同一地址空間。

   線程只由相關(guān)堆棧(系統(tǒng)?;蛴脩魲#┘拇嫫骱途€程控制表TCB組成。寄存器可被用來存儲(chǔ)線程內(nèi)的局部變量,但不能存儲(chǔ)其他線程的相關(guān)變量。

   發(fā)生進(jìn)程切換與發(fā)生線程切換時(shí)相比較,進(jìn)程切換時(shí)涉及到有關(guān)資源指針的保存以及地址空間的變化等問題;線程切換時(shí),由于同不進(jìn)程內(nèi)的線程共享資源和地址 空間,將不涉及資源信息的保存和地址變化問題,從而減少了操作系統(tǒng)的開銷時(shí)間。而且,進(jìn)程的調(diào)度與切換都是由操作系統(tǒng)內(nèi)核完成,而線程則既可由操作系統(tǒng)內(nèi) 核完成,也可由用戶程序進(jìn)行。

               
                    圖   多線程與進(jìn)程之間的關(guān)系

 4.9.2 線程的適用范圍

    典型的應(yīng)用

     1.服務(wù)器中的文件管理或通信控制

     2.前后臺(tái)處理

     3.異步處理

                       

4.9.3 線程的執(zhí)行特性

 
線程有3個(gè)基本狀態(tài):執(zhí)行、就緒、阻塞

  線程有5種基本操作:

 派生:線程在進(jìn)程內(nèi)派生出來,它即可由進(jìn)程派生,也可由線程派生。
 阻塞(Block):如果一個(gè)線程在執(zhí)行過程中需要等待某個(gè)事件發(fā)生,則被阻塞。
 激活(unblock):如果阻塞線程的事件發(fā)生,則該線程被激活并進(jìn)入就緒隊(duì)列。
 調(diào)度(schedule):選擇一個(gè)就緒線程進(jìn)入執(zhí)行狀態(tài)。
 結(jié)束(Finish):如果一個(gè)線程執(zhí)行結(jié)束,它的寄存器上下文以及堆棧內(nèi)容等將被釋放。
            
     圖  線程的狀態(tài)與操作
線程的另一個(gè)執(zhí)行特性是同步。線程中所使用的同步控制機(jī)制與進(jìn)程中所使用的同步控制機(jī)制相同。

4.9.4 線程的分類

  
線程有兩個(gè)基本類型:

     用戶級(jí)線程:管理過程全部由用戶程序完成,操作系統(tǒng)內(nèi)核心只對(duì)進(jìn)程進(jìn)行管理。

     系統(tǒng)級(jí)線程(核心級(jí)線程):由操作系統(tǒng)內(nèi)核進(jìn)行管理。操作系統(tǒng)內(nèi)核給應(yīng)用程序提供相應(yīng)的系統(tǒng)調(diào)用和應(yīng)用程序接口API,以使用戶程序可以創(chuàng)建、執(zhí)行、撤消線程。

線程舉例

1. SUN Solaris 2.3

  
²        Solaris支持內(nèi)核線程、輕權(quán)進(jìn)程和用戶線程。一個(gè)進(jìn)程可有大量用戶線程;大量用戶線程復(fù)用少量的輕權(quán)進(jìn)程,輕權(quán)進(jìn)程與內(nèi)核線程一一對(duì)應(yīng)。
 ¨
        
用戶級(jí)線程在調(diào)用核心服務(wù)時(shí)(如文件讀寫),需要“捆綁(bound)”在一個(gè)LWP上。永久捆綁(一個(gè)LWP固定被一個(gè)用戶級(jí)線程占用,該LWP移到LWP池之外)和臨時(shí)捆綁(從LWP池中臨時(shí)分配一個(gè)未被占用的LWP)。
 
²        在調(diào)用系統(tǒng)服務(wù)時(shí),如果所有LWP已被其他用戶級(jí)線程所占用(捆綁),則該線程阻塞直到有可用的LWP
 
²        如果LWP執(zhí)行系統(tǒng)線程時(shí)阻塞(如read()調(diào)用),則當(dāng)前捆綁在LWP上的用戶級(jí)線程也阻塞。
                                  
                               圖  用戶線程、輕權(quán)進(jìn)程和核心線程的關(guān)系

 ¨
       
有關(guān)的C庫函數(shù)
        /* 創(chuàng)建用戶級(jí)線程             */
    int
thr_create(void *stack_base, size_t stack_size,
    void *(*start_routine)(void *), void *arg, long flags,
    thread_t *new_thread_id); 

  其中flags包括:THR_BOUND(永久捆綁), THR_NEW_LWP(創(chuàng)建新LWP放入LWP池),若兩者同時(shí)指定則創(chuàng)建兩個(gè)新LWP,一個(gè)永久捆綁而另一個(gè)放入LWP池。
 ²        有關(guān)的系統(tǒng)調(diào)用
   /*
在當(dāng)前進(jìn)程中創(chuàng)建LWP     */
  int _lwp_create(ucontext_t *contextp, unsigned long flags,

  lwpid_t *new_lwp_id);
  /*
構(gòu)造LWP上下文          */
  void _lwp_makecontext(ucontext_t *ucp,
   void (*start_routine)( void *), void *arg,
  void *private, caddr_t stack_base, size_t stack_size);
  /*
注意:沒有進(jìn)行“捆綁”操作的系統(tǒng)調(diào)用 */

    2. Windows NT

  
²        NT線程的上下文包括:寄存器、核心、線程環(huán)境塊和用戶
 ²        NT線程狀態(tài)
   (1)         就緒狀態(tài):進(jìn)程已獲得除處理機(jī)外的所需資源,等待執(zhí)行。
   (2)
        
備用狀態(tài):特定處理器的執(zhí)行對(duì)象,系統(tǒng)中每個(gè)處理器上只能有一個(gè)處于備用狀態(tài)的線程。
 
(3)         運(yùn)行狀態(tài):完成描述表切換,線程進(jìn)入運(yùn)行狀態(tài),直到內(nèi)核搶先、時(shí)間片用完、線程終止或進(jìn)行等待狀態(tài)。
 
(4)         等待狀態(tài):線程等待對(duì)象句柄,以同步它的執(zhí)行。等待結(jié)束時(shí),根據(jù)優(yōu)先級(jí)進(jìn)入運(yùn)行、就緒狀態(tài)。
 
(5)         轉(zhuǎn)換狀態(tài):線程在準(zhǔn)備執(zhí)行而其內(nèi)核堆棧處于外存時(shí),線程進(jìn)入轉(zhuǎn)換狀態(tài);當(dāng)其內(nèi)核堆棧調(diào)回內(nèi)存,線程進(jìn)入就緒狀態(tài)。
 
(6)         終止?fàn)顟B(tài):線程執(zhí)行完就進(jìn)入終止?fàn)顟B(tài);如執(zhí)行體有一指向線程對(duì)象的指針,可將線程對(duì)象重新初始化,并再次使用。

  

                          圖  Windows NT的線程狀態(tài)
  ²        NT線程的有關(guān)API
   
  
*         CreateThread()函數(shù)在調(diào)用進(jìn)程的地址空間上創(chuàng)建一個(gè)線程,以執(zhí)行指定的函數(shù);返回值為所創(chuàng)建線程的句柄。
 *         ExitThread()函數(shù)用于結(jié)束本線程。
 *         SuspendThread()函數(shù)用于掛起指定的線程。
 *         ResumeThread()函數(shù)遞減指定線程的掛起計(jì)數(shù),掛起計(jì)數(shù)為0時(shí),線程恢復(fù)執(zhí)行。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多