1. 程式人生 > >Linux進程相關概念

Linux進程相關概念

ipc;進程狀態;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上
一個進程可以產生多個線程,並行運行//多核

4.進程調度
優先級:劃分了固定個數://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密集型


9.IPC
IPC:inter preocess communication:進程間通信
//進程是意識不到其他進程的存在的
同一主機上:
signal //常見通信方式
shm:shared memory
semerphor:
不同主機上:
rpc:remote procecure call //遠程過程調用
socket:基於套接字的通信
//一個進程監聽在一個位置上,可以接受別人發送的消息
//一端只管向socket發數據,內核會自動把數據傳送到另一端,另一單



本文出自 “黑馬騰空” 博客,請務必保留此出處http://hmtk520.blog.51cto.com/12595610/1977631

Linux進程相關概念