天天看點

Linux程序相關概念

1.程序調用 

2.CPU配置設定

3.程序建立 

4.程序排程

5.記憶體配置設定與回收

6.程序類型 

7.程序狀态 

8.IO過程

9.IPC

一、Linux程序及作業管理

1.程序調用:

    call:調用别人實作編寫好的功能子產品

    可以基于{system call/lib調用}或者混合調用

    系統調用:通常在核心發生

    庫調用:有的可能是一個獨立的子產品,有的可能是對系統調用的二次封裝

程序調用意味着什麼?

    CPU指令:普通指令:ring3 //任何應用程式都可以執行

        特權指令:ring0//不允許程式随意調用,由核心調用,來實作硬體平台的管理

    任何程式需要運作特權指令,OS把其封裝成調用,必須要向核心發起調用,由核心執行

        system call在ring3,發起在ring0運作,然後調用完成後傳回ring3

    該程序需要運作ring0的指令的時候:發起軟中斷,目的在于發起system call

        //核心把該代碼載入cpu,把執行結果傳回給調用者,調用後繼續運作後續代碼

        //程式需要暫停運作:system call之後繼續運作,這叫軟中斷

    CPU指令分為:

        特權指令:ring 0 //root環,記憶體尋址,記憶體控制,設定記憶體的通路權限為w/r

                //普通使用者的特權指令是不允許運作特權指令的

                //核心級别和OS級别代碼,才會去運作特權指令

        ring1,ring2,//曆史原因,沒有使用

        使用者指令:ring3

    運作使用者代碼的時候:使用者模式/使用者空間

    程序發起system call,需要軟中斷:核心模式/核心空間

    例如mkdir /tmp/a :這就需要一次中斷,因為要對硬體進行操作

    核心的作用:程序管理,fs,network functions

    cpu會在使用者指令和核心指令之間來回切換:模式切換

    一般:70%代碼在使用者程序,其他的核心程序最好

2.CPU如何進行資源配置設定//假如cpu隻有一個

    時間片切割:time split

    程序有優先級的概念:輪流使用CPU

    1.假如一個程序霸占cpu不放

        需要一個仲裁機制:核心(程序管理:負責程序排程)

    2.儲存程序狀态 

        在cpu上的寄存器上,cpu上有寄存器:儲存的是目前程序的狀态

        一旦切換到下一個指令後,這些值都會發生改變

    程序保護與恢複:

        現場資訊:由核心負責儲存,在記憶體中存放

            程序資訊:程序号,占用的記憶體号,狀态,cpu時間配置設定等

        切換由核心完成,

        linux核心存儲的程序資訊的固定格式:task struct //task結構體

        //結構體資訊,使用連結清單存儲,友善查找

        //多個任務的task struct組成的連結清單:task list

    process:運作中的程式的一個副本

        存在生命周期

        //程式是一個靜态的檔案

    3.當中斷發生的時候,必須由核心接管一切

3.程序建立

    每一個程序的組織結構都是一樣的

    核心建立了第一個程序:init

    init:上帝的使者

        //init建立後,意味着使用者空間也被建立出來了

    相當于總代理:

        他可以建立子程序,子程序建立子程序

        父子關系

        程序:都由其父程序建立 //需要向核心申請

            fork(),clone() //建立子程序[可以為同一段記憶體空間],隻有在子程序需要寫資料的時候,才分家CoW(寫時複制)配置設定另外一段空間

                            //程序=指令+資料,需要寫資料的時候,CoW複制一份,進行分家

    程序終止的話:釋放空間,父程序負責

        父程序建立子程序:為了讓子程序運作某一特定任務,子程序完成後,需要進行銷毀

    系統調用:

        read(),write(),open()

    并行執行,以線程運作:很普遍//一個父程式,建立其子程序,其線程可以同時運作在其他cpu上

    一個程序可以産生多個線程,并行運作//多核

    優先級:劃分了固定個數://kernel 2.6之後

    0-99:實時優先級 //數字越大優先級越高

    100-139:靜态優先級//使用者可指定,數字越小,優先級越高

    nice值:-20-+19 //100-139 ,-20:100  +19:100 //調整優先級

    Linux核心為了快速實作程序的排程:把系統上代運作的程序分了140個隊列

        相同優先級的拍一隊 //隻需掃描隊列的首部即可

        Big O:算法複雜度

            O(1),O(logn),O(n),O(n^2),O(2^n)

        每一對運作隊列都有兩隊://當運作隊列完成後,和過期隊列對換身份

            運作隊列:真正掃描的

            過期隊列:已經被排程過的隊列

    task struck中存放的資料:

        state,thread_info,flags,mm,tty,....

        線程,記憶體資訊,tty,fs,files,信号等

5.記憶體的配置設定與回收,建立等

    記憶體分片:4K大小,單個成為page

        page frame:頁框,用來存儲頁面資料

            存儲page//頁框中存儲的資料成為頁資料

    記憶體不能預測程序需要多少空間來使用:假設

        ---------------------------------|

        |--------|-----------------------|//記憶體

        核心占用 | 其他程序使用

    把其他的記憶體:切割成固定大小的片段page,把這些片段配置設定給其他程序

    記憶體占用的大小:不是固定的,後期可能會增長的

    程序啟動後,核心把衆多分散的空閑的空間中找,拼湊起來配置設定給該程序

    記憶體中存在大量的:page frame組成

        而這些page frame:都以不連續或者部分連續的方式組成

    頁對應的是線性位址的東西   而頁框對應的是實體位址   是實際的存儲區域

    告訴程序是連續的:通過一個中間層,僞裝

    每一個系統都認為:世界上隻存在兩個人,自己和核心

    程序的線性位址空間:每一個程序都假設自己有3G(32bit)的記憶體可用

    實體位址空間:真正占用的空間可能隻有很少

        //他們之間是離散對應的,虛拟記憶體機制

    LRU:最近最少使用算法

        線性位址空間映射到記憶體空間

    程序隻能通路:線性位址空間,

        MMU:Memory Management Unit//記憶體管理單元:負責記憶體線性記憶體和實體記憶體之間的映射

    一旦記憶體不夠使用:LRU算法,置換到swap中,輪到該程序的時候,再次換回去 

    //核心為每一個程序都儲存有一個task_struck:記錄了線性位址空間和實體位址空間的對應關系

    有些程式的資料是必須在記憶體中的:常駐記憶體集

    能夠交換出去的:虛拟記憶體集

    Linux核心:搶占式多任務//程序優先級高的搶占程序優先級低的

        可以把别人運作所用的CPU時間片搶過來

        隻有在相應的時間點,才可以搶,不能程序剛上線,就開始搶了

6.程序類型:

        守護程序:daemon,由核心在系統引導時啟動的程序

        前台程序:使用者通過終端啟用的程序//和終端相關

            注意:也可把在前台啟動的程序送往背景,以守護模式運作

7.程序狀态:

        運作态:running

        就緒态:ready

        睡眠态:

            可中斷睡眠:interruptable

                    //CPU時間片到了就可以直接運作

            不可中斷睡眠:uninterruptable //例如一個程序需要等待加載一個大檔案,即使下一個cpu時間片到了,也沒有滿足運作條件

                    //程序等待的這個過程做什麼呢?不可能讓他占領cpu,隻能讓他把cpu讓出來,讓其他程序運作,直到該程序滿足該條件

                    //這就叫做一次IO過程

                    //IO過程:某一程序需要加載的資料,記憶體中沒有,就不得不請求核心從磁盤把資料裝入到記憶體

                    //程序是沒有權限,加載資料到記憶體中的,隻有向核心申請,但是核心通常隻是加載的資料,是加載到核心空間中的記憶體中的

        停止态:暫停于記憶體中,但不會被排程,除非手動啟動之,stopped

        僵死狀态:zombie,一個子程序被建立後,并且任務完成後,等待被父程序清理

            //父程序挂了,但是子程序依然存在    

8.IO過程:

        1.資料首先從磁盤裝入到核心記憶體中去

        2.複制一份到程序記憶體中去

    程序的分類:

        CPU-Bound //CPU密集型

        IO-Bound //IO密集型

IPC:inter preocess communication:程序間通信

    //程序是意識不到其他程序的存在的

同一主機上:

    signal //常見通信方式

    shm:shared memory

    semerphor:

不同主機上:

    rpc:remote procecure call //遠端過程調用

    socket:基于套接字的通信

        //一個程序監聽在一個位置上,可以接受别人發送的消息

        //一端隻管向socket發資料,核心會自動把資料傳送到另一端,另一單

本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1977631,如需轉載請自行聯系原作者

繼續閱讀