乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      linux進(jìn)程學(xué)習(xí)總結(jié)——基本概念

       木芙蓉的圖書館 2011-04-11

      Linux進(jìn)程學(xué)習(xí)總結(jié)

      基本概念


      來源:blog.csdn.net/tigerjb   作者:tiger-john

      最近一周學(xué)習(xí)了Linux  進(jìn)程編程的知識(shí),現(xiàn)對(duì)其總結(jié)如下。在第一部分中我們先對(duì)進(jìn)程的基本概念以及在Linux 中是如何來現(xiàn)實(shí)進(jìn)程的進(jìn)行介紹Tiger-John說明 :許多人在學(xué)習(xí)中只注重如何編程,卻忘了注重原理,不去深究其基本原理。其實(shí)操作系統(tǒng)的原理就好 比金庸武俠小說的內(nèi)功一樣,而所有的具體實(shí)現(xiàn)如:Linux操作系統(tǒng),uc/os操作系統(tǒng)都只是武功招式而已。如果我們內(nèi)功學(xué)的很好的話,再來學(xué)習(xí)具體的實(shí)現(xiàn)過程是很快的。而且也會(huì)對(duì)其知識(shí)有更加本質(zhì)的了解。

       


      一.進(jìn)程的基本概念: 
      1.為什么計(jì)算機(jī)操作系統(tǒng)要引進(jìn)進(jìn)程: 
      在操作系統(tǒng)中引入進(jìn)程的目的是為了使多個(gè)程序并發(fā)執(zhí)行 ,以改善資源利用率及提高系統(tǒng)吞吐量。
      2.進(jìn)程的概念: 
      進(jìn)程是程序的一次執(zhí)行,進(jìn)程是擁有資源的最小單位和調(diào)度單位(在引入線程的操作系統(tǒng)中,線程是最小的調(diào)度單位) 
      3.進(jìn)程由什么組成 
      進(jìn)程由進(jìn)程控制塊(PCB),數(shù)據(jù),程序3部分組成。其中PCB是進(jìn)程的靈魂。 
      4.進(jìn)程的狀態(tài): 
      進(jìn)程的三種最基本的狀態(tài)是:運(yùn)行態(tài)(running),就緒態(tài)(readying), 阻塞態(tài)(block) 
      5.進(jìn)程和程序的區(qū)別: 
      進(jìn)程和程序的主要區(qū)別是進(jìn)程是動(dòng)態(tài)的,程序是靜態(tài)的。進(jìn)程時(shí)運(yùn)行中的程序,程序是一些保存在硬盤上的可執(zhí)行的代碼。 
      6.進(jìn)程的優(yōu)點(diǎn)和缺點(diǎn)

      (任何事物都是有其兩面性。我們在學(xué)習(xí)的時(shí)候要注意其優(yōu)點(diǎn)和缺點(diǎn)。人們也就再發(fā)現(xiàn)事物缺點(diǎn)的過程中,不斷的去改善它,從而引入了新的事物。在操作系統(tǒng)的學(xué)習(xí)過程中,我們會(huì)發(fā)現(xiàn)很多這樣的例子。人們在不斷追求完美的過程中,不斷的引入新的知識(shí)點(diǎn)--進(jìn)程和線程的出現(xiàn)就足可以說明這一切)
      優(yōu)點(diǎn):使多個(gè)程序并發(fā)執(zhí)行 
      缺點(diǎn):程序并發(fā)執(zhí)行時(shí)付出了巨大的時(shí)空開銷,每個(gè)進(jìn)程在進(jìn)行切換時(shí)身上帶了過多的“累贅”導(dǎo)致系統(tǒng)效率降低。 
      于是人們?yōu)榱私鉀Q這個(gè)缺點(diǎn)想到讓進(jìn)程在并行時(shí)不擁有資源---從而引入了線程的概念:即線程本身不擁有資源或者是很少的資源,進(jìn)程只是擁有資源的基本單位,線程是調(diào)度的基本單位 
      7.線程的引入: 
      在操作系統(tǒng)中引入線程則是為了減少程序并發(fā)執(zhí)行時(shí)所付出的時(shí)空開銷,使操作系統(tǒng)具有更好的并發(fā)性。

      二.Linux中是如何具體實(shí)現(xiàn)進(jìn)程和線程 
      1.在linux中通過task_struct結(jié)構(gòu)體來描述進(jìn)程的PCB,我們可以在include/linux/sched.h中看到對(duì)進(jìn)程task_struct的定義和進(jìn)程狀態(tài)的描述。 
      1>linux中的進(jìn)程狀態(tài) 
      a.運(yùn)行狀態(tài):進(jìn)程正在運(yùn)行或在運(yùn)行隊(duì)列中等待運(yùn)行 。
      b.可中斷等待狀態(tài):進(jìn)程正在等待某個(gè)事件完成(如等待數(shù)據(jù)到達(dá))。等待過程中可以被信號(hào)或定時(shí)器喚醒。 
      c.不可中斷等待狀態(tài):進(jìn)程正在等待某個(gè)事件完成并且等待中不可以被信號(hào)或定時(shí)器喚醒,必須一直等待到事件發(fā)生。
      d.僵死狀態(tài):進(jìn)程已終止,但進(jìn)程描述符依然存在,直到父進(jìn)程調(diào)用wait()函數(shù)后釋放。 
      e.停止?fàn)顟B(tài):進(jìn)程因?yàn)槭盏絊INSTOP,SIGSTP,SIGTIN,SGIOU信號(hào)后停止運(yùn)行或者該進(jìn)程正在被跟蹤。
      Tiger-john說明:

      1在include/linux/sched.h 中我們可以看到Linxu中進(jìn)程狀態(tài)的具體實(shí)現(xiàn): 
      #define TASK_RUNNING                   0
      #define TASK_INTERRUPTIBLE         1
      #define TASK_UNINTERRUPTIBLE    2
      #define TASK_ZOMBIE                     4
      #define TASK_STOPPED                   8
      其中:
      TASK_RUNNING是就緒態(tài),進(jìn)程當(dāng)前只等待CPU資源。
      TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE都是阻塞態(tài),進(jìn)程當(dāng)前正在等待除CPU外的其他系統(tǒng)資源;前者可以被信號(hào)喚醒,后者不可以。
      TASK_ZOMBIE是僵尸態(tài),進(jìn)程已經(jīng)結(jié)束運(yùn)行,但是進(jìn)程控制塊尚未注銷。
      TASK_STOPPED是掛起狀態(tài),主要用于調(diào)試目的。進(jìn)程接收到SIGSTOP信號(hào)后會(huì)進(jìn)入該狀態(tài),在接收到SIGCONT后又會(huì)恢復(fù)運(yùn)行。

      2.我們可以在終端中通過命令ps或pstree查看當(dāng)前系統(tǒng)中的進(jìn)程 
      用ps命令可以查看進(jìn)程的當(dāng)前狀態(tài)。運(yùn)行狀態(tài)為R,可中斷等待狀態(tài)為S,不可中斷等待狀態(tài)為D,僵死狀態(tài)為Z,停止?fàn)顟B(tài)為T。
      實(shí)例:
      think@Ubuntu:~$ ps -eo pid,stat 
        PID         STAT 
          1             Ss 
          2             S 
          3             S 
          37           SN 
         364          Ss 
         371          S<
         442          S<s 
        1060         Sl
        1081         Ssl 
        1085         Ssl 
       1203          Ss+
       3782          Ss
       3803           R+

      Tiger-John說明:


      在運(yùn)行結(jié)果中有一些后綴字符,其意義分別為< (高優(yōu)先級(jí)進(jìn)程),N(低優(yōu)先級(jí)進(jìn)程),L(內(nèi)存鎖頁,即頁不可以被換出內(nèi)存),s(該進(jìn)程為會(huì)話首進(jìn)程),l(多線程進(jìn)程),+(進(jìn)程位于前臺(tái)進(jìn)程組)。
      例如:Ssl說明該進(jìn)程處于可中斷等待狀態(tài),且該進(jìn)程為會(huì)話首進(jìn)程,而且是一個(gè)多線程的進(jìn)程。
      2.linux系統(tǒng)的進(jìn)程間通信有哪幾種方式 
      1>管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用 。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。
      2>有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信 。
      3>信號(hào)量( semophore ) : 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對(duì)共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時(shí),其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。 
      4>消息隊(duì)列( message queue ) : 消息隊(duì)列是消息的鏈表,www.存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
      5> 信號(hào) ( sinal ) : 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。
      6> 共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)兩,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。
      7>套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。 
      3.進(jìn)程控制 
      1>linux進(jìn)程控制包括創(chuàng)建進(jìn)程,執(zhí)行進(jìn)程,退出進(jìn)程以及改變進(jìn)程優(yōu)先級(jí)等。 
      在linux系統(tǒng)中,用于對(duì)進(jìn)程進(jìn)行控制的系統(tǒng)調(diào)用有: 
      a.fork:用于創(chuàng)建一個(gè)新進(jìn)程。 
      b.exit :用于終止進(jìn)程 
      c.exec :用于執(zhí)行一個(gè)應(yīng)用程序 
      d.wait :將父進(jìn)程掛起,等待子進(jìn)程終止 
      e.getpid :獲取當(dāng)前進(jìn)程的進(jìn)程ID 
      f.nice  : 該變進(jìn)程的優(yōu)先級(jí) 
      4.進(jìn)程標(biāo)識(shí) 
      1>Linux操作系統(tǒng)中,每個(gè)進(jìn)程都是通過唯一的進(jìn)程ID標(biāo)識(shí)的。進(jìn)程ID 是一個(gè)非負(fù)數(shù)。每個(gè)進(jìn)程除了進(jìn)程ID外還有一些其它信息,都可以通過相應(yīng)的函數(shù)獲得。

      2>主要的函數(shù)有:

      pid_t getpid(void) :獲得進(jìn)程ID
      pid_t getppid(void):獲得進(jìn)程父進(jìn)程的ID
      pid_t getuid(void)     :獲得進(jìn)程的實(shí)際用戶ID
      pid_t geteuid(void) :獲得進(jìn)程的有效用戶ID
      pid_t getgid(void) : 獲得進(jìn)程的實(shí)際組ID
      pid_t getegid(void) 獲得進(jìn)程的有效組ID 

      Tiger-Johen說明: 
      這些函數(shù)的聲明在 sys/types.h和unistd.h 頭文件中。 
      2>用戶ID和組ID的相關(guān)概念 
      a.實(shí)際用戶ID(uid) :標(biāo)識(shí)運(yùn)行該進(jìn)程的用戶
      b.有效用戶ID( euid): 標(biāo)識(shí)以什么用戶身份來運(yùn)行進(jìn)程。
      例如:一個(gè)普通用戶A,運(yùn)行了一個(gè)程序,而這個(gè)程序是以root 身份來運(yùn)行的,著程序運(yùn)行時(shí)就具有root 權(quán)限。此時(shí),實(shí)際用戶ID時(shí)A用戶的ID,而有效用戶ID是root用戶ID
      3>函數(shù)實(shí)例: 
      表頭文件:#include <unistd.h>

                          #include<sys/types.h>
      函數(shù)定義:pid_t getpid(void)
      函數(shù)說明:getpid()用來取得目前進(jìn)程的進(jìn)程識(shí)別碼,許多程序利用取到的此值來建立臨時(shí)文件,以避免臨時(shí)文件相同帶來的問題
      返回值:目前進(jìn)程的進(jìn)程識(shí)別碼
      函數(shù)實(shí)例:


      #include<stdio.h>


      #include<sys/types.h> 
      #include <unistd.h>
      main()
      {
           printf("pid = %d\n", getpid());
      }
      三.進(jìn)程的內(nèi)存映像 
      1.Linux下程序轉(zhuǎn)化成進(jìn)程 
      a.Linux下C程序的生成分為4個(gè)階段:

      預(yù)編譯

      編譯

      匯編

      鏈接

      Tiger-Johen說明:

      編譯器gcc進(jìn)過預(yù)編譯,編譯,匯編3個(gè)步驟將源程序文件轉(zhuǎn)換為目標(biāo)文件。
      b.當(dāng)程序執(zhí)行時(shí),操作系統(tǒng)將可執(zhí)行程序復(fù)制到內(nèi)存中。程序轉(zhuǎn)化為進(jìn)程通常需要經(jīng)過以下步驟:
      內(nèi)核將程序讀入內(nèi)存,為程序分配內(nèi)存空間
      內(nèi)核為該進(jìn)程分配進(jìn)程標(biāo)識(shí)符(PID)和其他資源
      內(nèi)核為該進(jìn)程保存PID及相應(yīng)的狀態(tài)信息,把進(jìn)程放到運(yùn)行隊(duì)列中等待執(zhí)行。程序轉(zhuǎn)化為進(jìn)程后就可以被操作系統(tǒng)的調(diào)度程序執(zhí)行了。
      2.進(jìn)程的內(nèi)存映像 
      a.進(jìn)程的內(nèi)存映像是指內(nèi)核在內(nèi)存中如何存放可執(zhí)行程序文件 。在將程序轉(zhuǎn)化為進(jìn)程的過程中,操作系統(tǒng)將可執(zhí)行程序由硬盤復(fù)制到內(nèi)存中。
      b.linux下程序映像的一般布局如下:(從低地址到高地址)
      1>代碼段:代碼段是只讀的,可被多個(gè)進(jìn)程共享。
      2>數(shù)據(jù)段: 存儲(chǔ)已被初始化的變量,包括全局變量和已被初始化的靜態(tài)變量。
      3>未初始化數(shù)據(jù)段:存儲(chǔ)未被初始化的靜態(tài)變量,它也被稱為bss段
      4>堆:用于存放程序運(yùn)行中動(dòng)態(tài)分配的變量
      5>棧:用戶函數(shù)調(diào)用,保存函數(shù)的返回地址,函數(shù)的參數(shù),函數(shù)內(nèi)部定義的局部變量。
      Tiger-Johen說明:

      可執(zhí)行程序和內(nèi)存映像的區(qū)別 :
      a.可執(zhí)行程序位于磁盤中而內(nèi)存映像位于內(nèi)存中;
      b.可執(zhí)行程序沒有堆棧,因?yàn)槌绦?被加載到內(nèi)存中才會(huì)分配堆棧;
      c.可執(zhí)行程序雖然也有未初始化數(shù)據(jù)段但它并不被儲(chǔ)存在位于硬盤中的可執(zhí)行文件中;
      d.可執(zhí)行程序時(shí)靜態(tài)的,不變的,而內(nèi)存映像隨著程序的執(zhí)行時(shí)在動(dòng)態(tài)變化的

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

        0條評(píng)論

        發(fā)表

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

        類似文章 更多