導航:首頁 > 編程系統 > linux進程管理實驗原理

linux進程管理實驗原理

發布時間:2023-05-08 08:32:38

linux實驗 創建進程

這是 偽代碼 ,read()需要你擴展
pid_t pid;
pid = fork();
if(pid ==0){
read();
exit(0);
}
else{
wait(NULL);
……
}

❷ 如果想學Linux,應該怎麼學

對於Linux的學習,可以分為四個階段,Linux初級入門階段→Linux中級進階→高級進階→Linux資深方向細化階段
第一階段:初級階段
初級階段需要把linux學習路線搞清楚,任何學習都是循序漸進的,所以學linux也是需要有一定的路線。
1. Linux基礎知識、基本命令;
2. Linux用戶及許可權基礎;
3. Linux系統進程管理進階;
4. linux高效文本、文件處理命令;
5. shell腳本入門
第二階段:中級進階
中級進階需要在充分了解linux原理和基礎知識之後,對上層的應用和服務進行深入學習,其中說到服務肯定涉及到網路的相關知識,是需要花時間學習的。
1. TCP/IP網路基礎;
2. Linux企業常用服務;
3. Linux企業級安全原理和防範技巧;
4. 加密/解密原理及數據安全、系統服務訪問控制及服務安全基礎;
5. iptables安全策略構建;
6. shell腳本進階;
7. MySQL應用原理及管理入門
第三階段:Linux高級進階
1. http服務代理緩存加速;
2. 企業級負載集群;
3. 企業級高可用集群;
4. 運維監控zabbix詳解;
5. 運維自動化學習;
第四階段:Linux資深方向細化
1. 大數據方向;
2. 雲計算方向;
3. 運維開發;
4. 自動化運維;
5. 運維架構師

❸ 學習Linux的步驟是怎樣的

對於Linux的學習,可以分為四個階段,Linux初級入門階段→Linux中級進階→Linux高級進階→Linux資深方向細化階段
第一階段:初級階段
初級階段需要把linux學習路線搞清楚,任何學習都是循序漸進的,所以學linux也是需要有一定的路線。
1. Linux基礎知識、基本命令;
2. Linux用戶及許可權基礎;
3. Linux系統進程管理進階;
4. linux高效文本、文件處理命令;
5. shell腳本入門
第二階段:中級進階
中級進階需要在充分了解linux原理和基礎知識之後,對上層的應用和服務進行深入學習,其中說到服務肯定涉及到網路的相關知識,是需要花時間學習的。
1. TCP/IP網路基礎;
2. Linux企業常用服務;
3. Linux企業級安全原理和防範技巧;
4. 加密/解密原理及數據安全、系統服務訪問控制及服務安全基礎;
5. iptables安全策略構建;
6. shell腳本進階;
7. MySQL應用原理及管理入門
第三階段:Linux高級進階
1. http服務代理緩存加速;
2. 企業級負載集群;
3. 企業級高可用集群;
4. 運維監控zabbix詳解;
5. 運維自動化學習;
第四階段:Linux資深方向細化
1. 大數據方向;
2. 雲計算方向;
3. 運維開發;
4. 自動化運維;
5. 運維架構師
以上是Linux的一個學習方向和路線,對於Linux學習是一個需要堅持的過程,也許通過自學或者培訓,3至6個月都可以把基本知識學會,但是重在實踐,深入的思考和不斷的摸索,你會發現Linux更多的美!

❹ 麻煩解釋一下linux下進程和線程有什麼區別和聯系,linux下多線程和多進程通信的實現方法,請通俗解釋

兄弟看到你這么高的分我就找了些資料:也算是對昨天學的知識總結一下吧
一、先說概念不管是windows還是linux下的進程和線程概念都是一樣的,只是管理進程和線程的方式不一樣,這個是前提,到時候你可別問我windows下進程和線程啊。這個涉及到操作系統原理。下面給你解答。
說道進程不得不提作業這個名詞 ,我想兄弟你電腦里不會有一個程序吧對不?當你的系統啟動完畢後你看看你的任務管理器里是不是有很多進程呢?那麼多程序是怎麼調如內存呢?能理解嗎?這里要明白程序和進程的關系,程序是你磁碟上的一個文件,當你需要它時進入內存後才成為進程,好比QQ在磁碟上就是一個文件而已,只有進入了內存才成為進程,進程是活動的。QQ要掃描你文件啊,記錄你聊天記錄啊,偷偷上傳個啥東西什麼的你也不知道對不,他是活動的。這個能明白嗎?
再看作業,這個作業可不是你寫作業的那個作業啊。系統一看好傢伙你個QQ那麼大的傢伙你想一下子進入內存啊?沒門!慢慢來嘛,系統就把QQ程序分為好幾塊,這幾塊不能亂分的,要符合自然結構就是循環啦選擇啦這樣的結構,你把人家循環結構咔嚓截斷了,怎麼讓人家QQ運行啊?這就是作業要一塊一塊的進入內存,同時要為作業產生JCB(JOB CONTROL BLOCK)作業控制塊,你進入內存不能亂跑啊,要聽系統的話,你要是進入系統自己的內存。框一下,內存不能讀寫 對話框就出來了,嚴重點直接藍臉給你!你懂得。這是window下的,linux下直接給你報錯!沒事了就!所一系統通過jcb控制進程。JCB包含了進程號優先順序好多內容,你打開你的windows任務管理器看看進程是不是有好多屬性啊?那就是PCB(PRCESS,CONTROL BLOCK)同理作業也包含那些內容只是多少而已。下面寫出進程特點:
1、進程是分配計算機資源最小的單位。你想啊人是要用程序幹活的吧?你把程序調入內存成了就成了進程,所以說進程是分配資源的最小單位。你在linux下打開終端輸入top命令看是不是有好多進程?
2、進程有操作系統為作業產生。有「父進程」產生「子進程」之間是父子關系,並可以繼續向下產生「子進程」。還拿QQ來說,你雙擊QQ.exe。QQ啟動了輸入賬號密碼打開主界面了。這時候你要聊天,QQ進程趕緊產生個「兒子」說 「兒子你去陪主人聊天去吧。這樣子進程產生了。突然你想看美女要傳照片這時候那個」兒子「有」生「了一個」兒子「說」兒子「你去傳照片。那個「兒子領到任務去傳照片了。這時你想關了QQ,QQ提示你說」你還有個「兒子」和「孫子」還在幹活呢你真要結束嗎?你蒽了確定。QQ對他「兒子」(你聊天窗口)說:」兒子啊對不起了,主人要關閉我你也不能活啊「咔嚓一下」兒子「死了,兒子死之前對他兒子說:「兒子啊你爺爺不讓我活了,你也別活了咔嚓孫子也死了。最後世界安靜了。這就是進程的父子關系。能明白嗎?記住:進程之活動在內存中。不能使用CPU,只管分配資源。
再說線程:線程也產生在內存中並且在內存中存在相當長的時間,但它的活動區域主要在CPU中,並且運行和滅亡都存在於CPU中,可以這么說,線程是程序中能被系統調度進入CPU中最小程序單位,它能直接使用進程分配的CPU的資源。
還拿QQ來說當你要傳文件時QQ總要判斷一下文件的擴展名吧,ok這時那個」兒子「趕緊對它爸爸說我需要一個線程判斷擴展名QQ趕緊對一個管這個的線程說:」快點去CPU里計算下那個擴展名是什麼然後向主人報告計算完了就「死了」消亡了,但是它的線程還在內存中!還等著你下一次傳文件然後計算然後消亡!
線程之間是相互獨立的。一個在CPU,一個在內存里還能有關系嗎對不?CPU在每一個瞬間只能進入一個線程,當線程進入CPU時立即產生一個新的線程,新線程仍停留在內存中,就好比上面那個傳文件還會等著你再傳文件再計算擴展名。
線程相對線程是獨立的,但它在內存中並不是獨立的,這就好比你不開QQ能用QQ傳輸文件嗎?它只存在與進程分配的資源中,也就是說計算擴展名這個線程只能停留在QQ這個進程中,不能跑到別的進程里!!相當於程序產生了新的進程和線程,進程向CPU申請資源,再有線程來使用,他們都是為程序服務的只是分工不同!
因為你沒提問linux下是怎麼管理進程和線程的所以我就不回答了,這個問題我建議你還是看看《笨兔兔的故事》裡面講到了linux是怎麼管理進程和線程的。挺幽默的比我說得還好。
你第二個問題說實話我回答不了你!我想你現在連進程和線程還沒理解第二個你更理解不了了你說對不?我猜的其實你用C/C++不管是在windows下編程還是在Linux下編程思想都是一樣的對吧,如果你理解了在windows下線程間通信,在linux更沒問題了!
參考資料:黑客手冊2009合訂本非安全第一二季244頁,245頁,328頁,329頁,398頁,399頁
淺談操作系統原理 (一 二三)
ubuntu中文論壇 笨兔兔的故事
http://forum.ubuntu.org.cn/viewtopic.php?f=120&t=267518
希望我的回答你能理解

❺ 操作系統課程設計 (包括進程管理、進程的同步和互斥、存儲管理)

- 課程設計的計算機操作系統程序
課程概述

計算機操作系統是中央廣播電視大學計算機科學與技術專業(本科),系統設置必修課程。教學總時數72.4學分,開設一學期。前課程,計算機組成原理,面向對象編程和數據結構。

計算機操作系統課程是臘鎮啟計算機專業的課程,通過學習,使學生掌握電腦作業系統的設計和組成的基本原則之一;計算機操作系統的基本概念和新的概念,術語和術語;了解計算機的發展,操作系統的功能和設計技巧和方法,基本操作使用最常用的計算機操作系統(DOS,Windows,UNIX或Linux)的。

?課程內容

主要內容包括:概述電腦的操作系統,作業管理,文件管理,存儲管理,輸入輸出設備管理,工藝和管理處理器,操作系統結構和編程。

二,系統的教學內容和教學要求

章概述操作系統的中

教學內容:

操作系統的定義和發展形成的操作系統和五個主要類型,操作系統五大功能特性的操作系統的性能,配置的操作系統,「生成」的概念

教學要求:

主:什麼是操作系統;知道五類和五功能的操作系統;

至少掌握:掌握操作系統的安裝,使用和維護的實際懷抱;

理解:如何理解一個初步的了解,熟悉和解剖學的人機交互界面的操作系統

任務的作業管理

教學內容如下:

的特點,人機界面的發展;操作系統的shell語言的第一,第二和第三代介面的發展特點,基本鍵盤命令和系統調用任務調度演算法; 教學要求:

主的人機界面設計

大師:掌握基本的作業系統人機界面的設計思路;

理解:傳統的介面界面

章文件管理的

教學內容:

文件管理任務和功能的操作系統文件的結構和分類的物理結構和邏輯結構的文件,文件目錄結構,文件訪問控制和安全機制,文件系統模型結構;

教學要求:

水平:基本的文件訪問控制和系統管理;
>掌握的文件系統目錄分類管理功能;

理解:文件系統的程序設計

的章內部存儲管理

教學內容:

內存分區,分頁,子段的管理理念;物理地址和邏輯地址內存「擴展」技術;存儲管理,支柱存儲管理的內存分配演算法的

教學的要求:

掌握基本配置:內存管理和調度方法;

主:主不同的分區存儲管理,分頁和分段方法;

有關:有效利用的內存空間

第五章輸入和輸出設備管理器的教學內容:

的輸入和輸出設備的功能分類;獨占的,共享的,虛擬裝置的管理功能;輸入和輸出設備的處理程序;管理策略的輸入和輸出設備;

教學要求:

法師:法師的輸入和輸出設備的管理特性;

法師:法師分類設計方法的輸入和輸出設備;

明白了:

編程元素的輸入和輸出設備處理程序第

教學內容的低級別的處理器管理:

操作系統的核心功能,「過程」的概念,過程的並發和並行的基本狀態的轉換的過程;進程調度演算法進程同步和互斥過程PV操作,「鎖」的概念;

教學要求:

大師:在操作系統內核運行的基本概念「過程「;

掌握的基本轉換過程中的狀態和特徵;

理解:操作系統

教學內容,進程調度演算法的編程方案的結構

BR />第七章:

操作分層的模塊化的系統結構設計和操作系統的測試;的

教學的要求:

本章教學基本要求:了解基本的設計思路和方法現代計算機操作系統

三,教學媒體

本課程使用的教學媒體:文字材料,視頻材料,網路教學和輔導。

1。文字材料

計算機操作系統(2)武企業萬元清華大旅喚學出版社

註:本課程實驗的主要教材。

文字教材過程中的主要傳播媒介。准備的文字材料,同時保持先進性,科學的學科體系,這兩種作業系統的理論,技術,實現了一體化的三個強調的能力。

2。視頻教材

該課程16節和視頻,每講50分鍾,講授的課程集中困難,科目匯總。為了幫助學生理解操作系統的整體概念和思想,伍啟元教授揚聲器。

當然,視頻與相應的文字材料,注重藝術表達播放視頻教材,教學形象化。

3。

在線教學網上教學和指導,咨詢與上述有機介質方面的作用:(1)釋放的教學和指導性文件,課程公告,咨詢,參考材料;(2)根據工程進度教學,心理咨詢聊天室發表的一篇文章「自我測試題(3)實時Q&A,一天到一天的課程論壇Q;(4)開展網上教師培訓與教學研討會。

文字材料的基礎上,對學生的學習,視頻教科書的補充文字材料,在線咨詢是一個方便的教學和學習方式的互動。總之,分工和各種媒體,讓學生有更大的自主學習空間,以方便學生自由選擇,自主學習,提高學生的自我學習能力。

教學安排建議

當然主要教科書和課程實驗教學安排建議

教學點,請根據中央電大統一安排課程,面對面輔導的要求,如表1所示。

表1的主要教科輪如書和課程實驗教學安排建議

每周教學內容小時的實驗內容推薦小時

操作系統的教學安排概述

2操作系統定義了五種類型, 5 4

三人人機界面管理Linux的實踐准備1

四個工作管理任務調度4

五個文件管理的任務和功能的Linux操作系統命令的邏輯結構和物理結構4

7個存儲管理任務和功能2命令解釋器4

九編制2

八分分配存儲管理段4

分配的存儲管理作業調度模擬編程的六個文件10設備管理的任務和職能

11種設備,技術和管理存儲分配管理設計4

過程的定義和特徵4 13進程調度和通信進程調度模擬編程 p> 15操作系統級模塊結構僵局的產生和處理14 26 4

(總復習)4

共56條16

課程視頻內容,示於表2。

章教學內容表2視頻教材課程小時的視頻時間分配

操作系統提供了一個概述8小時4

運營管理8小時2

文件管理2

8小時的存儲管理8小時

5個設備管理器

6過程管理8小時10小時4

7操作系統的系統程序結構6小時0

56小時16

2在線咨詢在線咨詢內容

包括教學文件,課程輔導,網路教室。充分利用網路資源,和偶爾的在線課程相關的輔導材料,定期,根據教學在線輔導和考試Q&A活動,適當安排的需要。具體安排如下:



包括課程介紹,教師,教學大綱,教學設計,教學檔案。

?課程輔導

包括課程學習和答案,專題輔導,習題和答案,自我測試,評估說明,網上還提供了教師講課教案教學點的教學使用。

?網路課堂

包括直播課堂和IP課件。

基於網路的教學活動:中央廣播電視大學一般集中在每學期安排的實時在線輔導學生,教師的教學和研究活動。具體的時間表,每學期上發布的TVU的網上家園。

?論壇:每天的日常應答的過程中。

課程的課堂直播第一學期,通過教育電視台播出,安排四次直播課堂,每次50分鍾。的第一堂課3個教學點,難點的教學和演講後代表咨詢審查的輔導和考試說明的過程中反映的共性問題。直播課堂掛在網頁上的內容。

工作

課程形成性評估書,當然工作量。工作成績計入課程成績。中央電大的工作,不時抽查,檢查審查和完成作業。

課程考試,請參閱「中央廣播電視大學計算機操作系統課程評估的指示。建議

五,教學方法?教學建議

(1)計算機操作系統是一個實用的課程。其特點是概念多,涉及范圍廣。要求教學輔導深和混亂的概念來進行詳細說明,並詳細描述每章的重點,管理和控制的調度演算法技能。

(2)注重培養學生熟悉的操作系統,以及在維護操作系統的問題進行分析,並在實驗中解決問題的能力。

?建議

(1)從宏觀和微觀把握學習操作系統。在宏觀上,要認識到在計算機系統中的操作系統的地位清除操作系統的整體結構;微觀方面應把握的操作系統是管理計算機資源(過程中,處理器,內存,文件,設備),了解概念,原理和技術。

(2)操作系統是計算機技術和管理技術相結合的聯想日常生活學習重復熟悉的樣品管理實現運營系統的管理方法,以加深對問題的理解。
(3)要注意加強自我學習的能力,有能力實現這一目標的「學習」的文化。

❻ 「圖文結合」Linux 進程、線程、文件描述符的底層原理

開發十年經驗總結,阿里架構師的手寫Spring boot原理實踐文檔

阿里架構師的這份:Redis核心原理與應用實踐,帶你手撕Redis

Tomcat結構原理詳解

說到進程,恐怕面試中最常見的問題就是線程和進程的關系了,那麼先說一下答案: 在 Linux 系統中,進程和線程幾乎沒有區別

Linux 中的進程其實就是一個數據結構,順帶可以理解文件描述符、重定向、管道命令的底層工作原理,最後我們從操作系統的角度看看為什麼說線程和進程基本沒有區別。

首先,抽象地來說,我們的計算機就是這個東西:

這個大的矩形表示計算機的 內存空間 ,其中的小矩形代表 進程 ,左下角的圓形表示 磁碟 ,右下角的圖形表示一些 輸入輸出設備 ,比如滑鼠鍵盤顯示器等等。另外,注意到內存空間被劃分為了兩塊,上半部分表示 用戶空間 ,下半部分表示 內核空間

用戶空間裝著用戶進程需要使用的資源,比如你在程序代碼里開一個數組,這個數組肯定存在用戶空間;內核空間存放內核進程需要載入的系統資源,這一些資源一般是不允許用戶訪問的。但是注意有的用戶進程會共享一些內核空間的資源,比如一些動態鏈接庫等等。

我們用 C 語言寫一個 hello 程序,編譯後得到一個可執行文件,在命令行運行就可以列印出一句 hello world,然後程序退出。在操作系統層面,就是新建了一個進程,這個進程將我們編譯出來的可執行文件讀入內存空間,然後執行,最後退出。

你編譯好的那個可執行程序只是一個文件,不是進程,可執行文件必須要載入內存,包裝成一個進程才能真正跑起來。進程是要依靠操作系統創建的,每個進程都有它的固有屬性,比如進程號(PID)、進程狀態、打開的文件等等,進程創建好之後,讀入你的程序,你的程序才被系統執行。

那麼,操作系統是如何創建進程的呢? 對於操作系統,進程就是一個數據結構 ,我們直接來看 Linux 的源碼:

task_struct 就是 Linux 內核對於一個進程的描述,也可以稱為「進程描述符」。源碼比較復雜,我這里就截取了一小部分比較常見的。

我們主要聊聊 mm 指針和 files 指針。 mm 指向的是進程的虛擬內存,也就是載入資源和可執行文件的地方; files 指針指向一個數組,這個數組里裝著所有該進程打開的文件的指針。

先說 files ,它是一個文件指針數組。一般來說,一個進程會從 files[0] 讀取輸入,將輸出寫入 files[1] ,將錯誤信息寫入 files[2] 。

舉個例子,以我們的角度 C 語言的 printf 函數是向命令行列印字元,但是從進程的角度來看,就是向 files[1] 寫入數據;同理, scanf 函數就是進程試圖從 files[0] 這個文件中讀取數據。

每個進程被創建時, files 的前三位被填入默認值,分別指向標准輸入流、標准輸出流、標准錯誤流。我們常說的「文件描述符」就是指這個文件指針數組的索引 ,所以程序的文件描述符默認情況下 0 是輸入,1 是輸出,2 是錯誤。

我們可以重新畫一幅圖:

對於一般的計算機,輸入流是鍵盤,輸出流是顯示器,錯誤流也是顯示器,所以現在這個進程和內核連了三根線。因為硬體都是由內核管理的,我們的進程需要通過「系統調用」讓內核進程訪問硬體資源。

PS:不要忘了,Linux 中一切都被抽象成文件,設備也是文件,可以進行讀和寫。

如果我們寫的程序需要其他資源,比如打開一個文件進行讀寫,這也很簡單,進行系統調用,讓內核把文件打開,這個文件就會被放到 files 的第 4 個位置,對應文件描述符 3:

明白了這個原理, 輸入重定向 就很好理解了,程序想讀取數據的時候就會去 files[0] 讀取,所以我們只要把 files[0] 指向一個文件,那麼程序就會從這個文件中讀取數據,而不是從鍵盤:

同理, 輸出重定向 就是把 files[1] 指向一個文件,那麼程序的輸出就不會寫入到顯示器,而是寫入到這個文件中:

錯誤重定向也是一樣的,就不再贅述。

管道符其實也是異曲同工,把一個進程的輸出流和另一個進程的輸入流接起一條「管道」,數據就在其中傳遞,不得不說這種設計思想真的很巧妙:

到這里,你可能也看出「Linux 中一切皆文件」設計思路的高明了,不管是設備、另一個進程、socket 套接字還是真正的文件,全部都可以讀寫,統一裝進一個簡單的 files 數組,進程通過簡單的文件描述符訪問相應資源,具體細節交於操作系統,有效解耦,優美高效。

首先要明確的是,多進程和多線程都是並發,都可以提高處理器的利用效率,所以現在的關鍵是,多線程和多進程有啥區別。

為什麼說 Linux 中線程和進程基本沒有區別呢,因為從 Linux 內核的角度來看,並沒有把線程和進程區別對待。

我們知道系統調用 fork() 可以新建一個子進程,函數 pthread() 可以新建一個線程。 但無論線程還是進程,都是用 task_struct 結構表示的,唯一的區別就是共享的數據區域不同 。

換句話說,線程看起來跟進程沒有區別,只是線程的某些數據區域和其父進程是共享的,而子進程是拷貝副本,而不是共享。就比如說, mm 結構和 files 結構在線程中都是共享的,我畫兩張圖你就明白了:

所以說,我們的多線程程序要利用鎖機制,避免多個線程同時往同一區域寫入數據,否則可能造成數據錯亂。

那麼你可能問, 既然進程和線程差不多,而且多進程數據不共享,即不存在數據錯亂的問題,為什麼多線程的使用比多進程普遍得多呢 ?

因為現實中數據共享的並發更普遍呀,比如十個人同時從一個賬戶取十元,我們希望的是這個共享賬戶的余額正確減少一百元,而不是希望每人獲得一個賬戶的拷貝,每個拷貝賬戶減少十元。

當然,必須要說明的是, 只有 Linux 系統將線程看做共享數據的進程 ,不對其做特殊看待 ,其他的很多操作系統是對線程和進程區別對待的,線程有其特有的數據結構,我個人認為不如 Linux 的這種設計簡潔,增加了系統的復雜度。

在 Linux 中新建線程和進程的效率都是很高的,對於新建進程時內存區域拷貝的問題,Linux 採用了 -on-write 的策略優化,也就是並不真正復制父進程的內存空間,而是等到需要寫操作時才去復制。 所以 Linux 中新建進程和新建線程都是很迅速的

❼ linux 管道原理

Linux原理的學習,我打算由淺入深,從上之下,也就是先了解個大概再逐個深入。先了解一下Linux的進程先。

一、Linux進程上下文

Linux進程上下文,我理解就是進程組成元素的集合。包括進程描述符tast_struct,正文段,數據段,棧,寄存器內容,頁表等。

1)tast_struct

它是一種數據結構,存儲著進程的描述信息,例如pid,uid,狀態,信號項,打開文件表等。是進程管理和調度的重要依據。

2)用戶棧和核心棧

顧名思義,用戶棧是進程運行在用戶態使用的棧,含有用戶態執行時候函數調用的參數,局部變數等;核心棧是該進程運行在核心態下用的棧,保存調用系統函數所用的參數和調用序列。這兩個棧的指針都保存在tast_struct結構中。

3)寄存器

保存程序計數器,狀態字,通用寄存器,棧指針。

4)頁表

線性地址到物理地址的映射

5)正文段,數據段。

二、Linux進程的狀態

Linux中進程共有5個狀態:就緒,可中斷睡眠,不可中斷睡眠,暫停,僵死。也就是說,linux不區分就緒和運行,它們統一叫做就緒態。進程所處的狀態記錄在tast_struct中。

三、進程的控制

1)進程樹的形成

計算機啟動後,BIOS從磁碟引導扇區載入系統引導程序,它將Linux系統裝入內存,並跳到內核處執行,Linux內核就執行初始化工作:初始化硬體、初始化內部數據結構、建立進程0。進程0創建進程1,進程1是以後所有創建的進程的祖先,它負責初始化所有的用戶進程。進程1創建shell進程,shell進程顯示提示符,等待命令的輸入。

2)進程的創建

任何一個用戶進程的創建都是由現有的一個進程完成的,進程的創建要經過fork和exec兩個過程。Fork是為新進程分配相應的數據結構,並將父進程的相應上下文信息復制過來。Exec是將可執行文件的正文和數據轉入內存覆蓋它原來的(從父進程復制過來的),並開始執行正文段。

3)進程的終止

系統調用exit()就可自我終結,exit釋放除了tast_struct以外的所有上下文,父進程收到子進程終結的消息後,釋放子進程的tast_struct。

4)進程的調度

進程的調度是由schele()完成的,一種情況是,當處理機從核心態向用戶態轉換之前,它會檢查調度標志是否為1,如果是1,則運行schele(),執行進程的調度。另一種情況是進程自動放棄處理機,時候進行進程調度。

進程的調度過程分為兩步,首先利用相關策略選擇要執行的進程,然後進行上下文的切換。

四、進程的通信

進程的通信策略主要有,消息,管道,消息隊列,共享存儲區和信號量。

1)信息

消息機制主要是用來傳遞進程間的軟中斷信號,通知對方發生了非同步事件。發送進程將信號(約定好的符號)發送到目標進程的tast_struct中的信號項,接收進程看到有消息後就調用相應的處理程序,注意,處理程序必須到進程執行時候才能執行,不能立即響應。

2)管道

我理解就是兩個進程使用告訴緩沖區中的一個隊列(每兩個進程一個),發送進程將數據發送到管道入口,接收進程從管道出口讀數據。

3) 消息隊列

消息隊列是操作系統維護的一個個消息鏈表,發送進程根據消息標識符將消息添加到制定隊列中,接收進程從中讀取消息。

4)共享存儲區

在內存中開辟一個區域,是個進程共享的,也就是說進程可以把它附加到自己的地址空間中,對此區域中的數據進行操作。

5)信號量

控制進程的同步。

❽ Linux進程管理及作業控制的啟動進程

鍵入需要運行的程序的程序名,執行一個程序,其實也就是啟動了一個進程。在Linux系統中每個進程都具有一個進程號,用於系統識別和調度進程。啟動一個進程有兩個主要途徑:手工啟動和調度啟動,後者是事先進行設置,根據用戶要求自行啟動。 由用戶輸入命令,直接啟動一個進程便是手工啟動進程。但手工啟動進程又可以分為很多種,根據啟動的進程類型不同、性質不同,實際結果也不一樣,下面分別介紹。
1. 前台啟動
這或許是手工啟動一個進程的最常用的方式。一般地,用戶鍵入一個命令「ls –l」,這就已經啟動了一個進程,而且是一個前台的進程。這時候系統其實已經處於一個多進程狀態。或許有些用戶會疑惑:我只啟動了一個進程而已。但實際上有許多運行在後台的、系統啟動時就已經自動啟動的進程正在悄悄運行著。還有的用戶在鍵入「ls –l」命令以後趕緊使用「ps –x」查看,卻沒有看到ls進程,也覺得很奇怪。其實這是因為ls這個進程結束太快,使用ps查看時該進程已經執行結束了。如果啟動一個比較耗時的進程:
find / -name fox.jpg
然後再把該進程掛起,使用ps查看,就會看到一個find進程在裡面。
2. 後台啟動
直接從後台手工啟動一個進程用得比較少一些,除非是該進程甚為耗時,且用戶也不急著需要結果的時候。假設用戶要啟動一個需要長時間運行的格式化文本文件的進程。為了不使整個shell在格式化過程中都處於「癱瘓」狀態,從後台啟動這個進程是明智的選擇。
[例1]
$ troff –me notes > note_form &
[1] 4513
$
由上例可見,從後台啟動進程其實就是在命令結尾加上一個&號。鍵入命令以後,出現一個數字,這個數字就是該進程的編號,也稱為PID,然後就出現了提示符。用戶可以繼續其他工作。
上面介紹了前、後台啟動的兩種情況。實際上這兩種啟動方式有個共同的特點,就是新進程都是由當前shell這個進程產生的。也就是說,是shell創建了新進程,於是就稱這種關系為進程間的父子關系。這里shell是父進程,而新進程是子進程。一個父進程可以有多個子進程,一般地,子進程結束後才能繼續父進程;當然如果是從後台啟動,那就不用等待子進程結束了。
一種比較特殊的情況是在使用管道符的時候。例如:
nroff -man ps.1|grep kill|more
這時候實際上是同時啟動了三個進程。請注意是同時啟動的,所有放在管道兩邊的進程都將被同時啟動,它們都是當前shell的子程序,互相之間可以稱為兄弟進程。
以上介紹的是手工啟動進程的一些內容,作為一名系統管理員,很多時候都需要把事情安排好以後讓其自動運行。因為管理員不是機器,也有離開的時候,所以有些必須要做的工作而恰好管理員不能親自操作,這時候就需要使用調度啟動進程了。 有時候需要對系統進行一些比較費時而且佔用資源的維護工作,這些工作適合在深夜進行,這時候用戶就可以事先進行調度安排,指定任務運行的時間或者場合,到時候系統會自動完成這一切工作。
要使用自動啟動進程的功能,就需要掌握以下幾個啟動命令。
at命令
用戶使用at命令在指定時刻執行指定的命令序列。也就是說,該命令至少需要指定一個命令、一個執行時間才可以正常運行。at命令可以只指定時間,也可以時間和日期一起指定。需要注意的是,指定時間有個系統判別問題。比如說:用戶現在指定了一個執行時間:凌晨3:20,而發出at命令的時間是頭天晚上的20:00,那麼究竟是在哪一天執行該命令呢?如果用戶在3:20以前仍然在工作,那麼該命令將在這個時候完成;如果用戶3:20以前就退出了工作狀態,那麼該命令將在第二天凌晨才得到執行。下面是at命令的語法格式:
at [-V] [-q 隊列] [-f 文件名] [-mldbv] 時間
at -c 作業 [作業...]
at允許使用一套相當復雜的指定時間的方法,實際上是將POSIX.2標准擴展了。它可以接受在當天的hh:mm(小時:分鍾)式的時間指定。如果該時間已經過去,那麼就放在第二天執行。當然也可以使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)等比較模糊的詞語來指定時間。用戶還可以採用12小時計時制,即在時間後面加上AM(上午)或者PM(下午)來說明是上午還是下午。
也可以指定命令執行的具體日期,指定格式為month day(月 日)或者mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。
上面介紹的都是絕對計時法,其實還可以使用相對計時法,這對於安排不久就要執行的命令是很有好處的。指定格式為:now + count time-units ,now就是當前時間,time-units是時間單位,這里可以是 minutes(分鍾)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,究竟是幾天,還是幾小時,等等。
還有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。下面通過一些例子來說明具體用法。
[例2] 指定在今天下午5:30執行某命令。假設現在時間是中午12:30,1999年2月24日,其命令格式如下:
at 5:30pm
at 17:30
at 17:30 today
at now + 5 hours
at now + 300 minutes
at 17:30 24.2.99
at 17:30 2/24/99
at 17:30 Feb 24
以上這些命令表達的意義是完全一樣的,所以在安排時間的時候完全可以根據個人喜好和具體情況自由選擇。一般採用絕對時間的24小時計時法可以避免由於用戶自己的疏忽造成計時錯誤的情況發生,例如上例可以寫成:
at 17:30 2/24/99
這樣非常清楚,而且別人也看得懂。
對於at命令來說,需要定時執行的命令是從標准輸入或者使用-f選項指定的文件中讀取並執行的。如果at命令是從一個使用su命令切換到用戶shell中執行的,那麼當前用戶被認為是執行用戶,所有的錯誤和輸出結果都會送給這個用戶。但是如果有郵件送出的話,收到郵件的將是原來的用戶,也就是登錄時shell的所有者。
[例3]
$ at -f work 4pm + 3 days
在三天後下午4點執行文件work中的作業。
$ at -f work 10am Jul 31
在7月31日上午10點執行文件work中的作業。
在任何情況下,超級用戶都可以使用這個命令。對於其他用戶來說,是否可以使用就取決於兩個文件:/etc/at.allow和/etc/at.deny。如果/etc/at.allow文件存在的話,那麼只有在其中列出的用戶才可以使用at命令;如果該文件不存在,那麼將檢查/etc/at.deny文件是否存在,在這個文件中列出的用戶均不能使用該命令。如果兩個文件都不存在,那麼只有超級用戶可以使用該命令;空的/etc/at.deny文件意味著所有的用戶都可以使用該命令,這也是默認狀態。
下面對命令中的參數進行說明。
-V 將標准版本號列印到標准錯誤中。
-q queue 使用指定的隊列。隊列名稱是由單個字母組成,合法的隊列名可以由a-z或者A-Z。a隊列是at命令的默認隊列。
-m 作業結束後發送郵件給執行at命令的用戶。
-f file 使用該選項將使命令從指定的file讀取,而不是從標准輸入讀取。
-l atq命令的一個別名。該命令用於查看安排的作業序列,它將列出用戶排在隊列中的作業,如果是超級用戶,則列出隊列中的所有工作。
命令的語法格式如下:
atq [-V] [-q 隊列] [-v]
-d atrm 命令的一個別名。該命令用於刪除指定要執行的命令序列,語法格式如下:
atrm [-V] 作業 [作業...]
-c 將命令行上所列的作業送到標准輸出。
[例4] 找出系統中所有以txt為後綴名的文件,並且進行列印。列印結束後給用戶foxy發出郵件通知取件。指定時間為十二月二十五日凌晨兩點。
首先鍵入:
$ at 2:00 12/25/99
然後系統出現at>提示符,等待用戶輸入進一步的信息,也就是需要執行的命令序列:
at> find / -name 「*.txt」|lpr
at> echo 「foxy:All texts have been printed.You can take them over.Good day!River」 |mail -s 」job done」 foxy
輸入完每一行指令然後回車,所有指令序列輸入完畢後,使用組合鍵結束at命令的輸入。這時候屏幕將出現如下信息:
warning:command will be executed using /bin/sh.
job 1 at 1999-12-25 02:00
提醒用戶將使用哪個shell來執行該命令序列。 實際上如果命令序列較長或者經常被執行的時候,一般都採用將該序列寫到一個文件中,然後將文件作為at命令的輸入來處理。這樣不容易出錯。
例5] 上面的例子可以修改如下:
將命令序列寫入到文件/tmp/printjob,語句為:
$ at -f /tmp/printjob 2:00 12/25/99
這樣一來,at命令將使用文件中的命令序列,屏幕顯示如下:
Warning:command will be executed using /bin/sh.
job 2 at 1999-12-25 02:00
當然也可以採用以下命令:
$ at< /tmp/printjob 2:00 12/25/99
來完成同樣的任務。也就是使用輸入重定向的辦法將文件定向為命令輸入。
batch命令
batch 用低優先順序運行作業,該命令幾乎和at命令的功能完全相同,唯一的區別在於,at命令是在指定時間,很精確的時刻執行指定命令;而batch卻是在系統負載較低,資源比較空閑的時候執行命令。該命令適合於執行佔用資源較多的命令。
batch命令的語法格式也和at命令十分相似,即
batch [-V] [-q 隊列] [-f 文件名] [-mv] [時間]
具體的參數解釋請參考at命令。一般地說,不用為batch命令指定時間參數,因為batch本身的特點就是由系統決定執行任務的時間,如果用戶再指定一個時間,就失去了本來的意義。
[例6] 使用例4,鍵入:
$ batch
at> find / -name *.txt|lpr
at> echo 「foxy:All texts have been printed.You can take them over.Good day!River」 |mail -s 」job done」 foxy
現在這個命令就會在合適的時間進行了,進行完後會發回一個信息。
仍然使用組合鍵來結束命令輸入。而且batch和at命令都將自動轉入後台,所以啟動的時候也不需要加上&符號。
cron命令
前面介紹的兩條命令都會在一定時間內完成一定任務,但是要注意它們都只能執行一次。也就是說,當指定了運行命令後,系統在指定時間完成任務,一切就結束了。但是在很多時候需要不斷重復一些命令,比如:某公司每周一自動向員工報告頭一周公司的活動情況,這時候就需要使用cron命令來完成任務了。
實際上,cron命令是不應該手工啟動的。cron命令在系統啟動時就由一個shell腳本自動啟動,進入後台(所以不需要使用&符號)。一般的用戶沒有運行該命令的許可權,雖然超級用戶可以手工啟動cron,不過還是建議將其放到shell腳本中由系統自行啟動。
首先cron命令會搜索/var/spool/cron目錄,尋找以/etc/passwd文件中的用戶名命名的crontab文件,被找到的這種文件將載入內存。例如一個用戶名為foxy的用戶,它所對應的crontab文件就應該是/var/spool/cron/foxy。也就是說,以該用戶命名的crontab文件存放在/var/spool/cron目錄下面。cron命令還將搜索/etc/crontab文件,這個文件是用不同的格式寫成的。
cron啟動以後,它將首先檢查是否有用戶設置了crontab文件,如果沒有就轉入「休眠」狀態,釋放系統資源。所以該後台進程佔用資源極少。它每分鍾「醒」過來一次,查看當前是否有需要運行的命令。命令執行結束後,任何輸出都將作為郵件發送給crontab的所有者,或者是/etc/crontab文件中MAILTO環境變數中指定的用戶。
上面簡單介紹了一些cron的工作原理,但是cron命令的執行不需要用戶干涉;需要用戶修改的是crontab中要執行的命令序列,所以下面介紹crontab命令。
crontab命令
crontab命令用於安裝、刪除或者列出用於驅動cron後台進程的表格。也就是說,用戶把需要執行的命令序列放到crontab文件中以獲得執行。每個用戶都可以有自己的crontab文件。下面就來看看如何創建一個crontab文件。
在/var/spool/cron下的crontab文件不可以直接創建或者直接修改。crontab文件是通過crontab命令得到的。現在假設有個用戶名為foxy,需要創建自己的一個crontab文件。首先可以使用任何文本編輯器建立一個新文件,然後向其中寫入需要運行的命令和要定期執行的時間。
然後存檔退出。假設該文件為/tmp/test.cron。再後就是使用crontab命令來安裝這個文件,使之成為該用戶的crontab文件。鍵入:
crontab test.cron
這樣一個crontab 文件就建立好了。可以轉到/var/spool/cron目錄下面查看,發現多了一個foxy文件。這個文件就是所需的crontab 文件。用more命令查看該文件的內容可以發現文件頭有三行信息:
#DO NOT EDIT THIS FILE -edit the master and reinstall.
#(test.cron installed on Mon Feb 22 14:20:20 1999)
#(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)
大概意思是:
#切勿編輯此文件——如果需要改變請編輯源文件然後重新安裝。
#test.cron文件安裝時間:14:20:20 02/22/1999
如果需要改變其中的命令內容時,還是需要重新編輯原來的文件,然後再使用crontab命令安裝。
可以使用crontab命令的用戶是有限制的。如果/etc/cron.allow文件存在,那麼只有其中列出的用戶才能使用該命令;如果該文件不存在但cron.deny文件存在,那麼只有未列在該文件中的用戶才能使用crontab命令;如果兩個文件都不存在,那就取決於一些參數的設置,可能是只允許超級用戶使用該命令,也可能是所有用戶都可以使用該命令。
crontab命令的語法格式如下:
crontab [-u user] file
crontab [-u user]{-l|-r|-e}
第一種格式用於安裝一個新的crontab 文件,安裝來源就是file所指的文件,如果使用「-」符號作為文件名,那就意味著使用標准輸入作為安裝來源。
-u 如果使用該選項,也就是指定了是哪個具體用戶的crontab 文件將被修改。如果不指定該選項,crontab 將默認是操作者本人的crontab ,也就是執行該crontab 命令的用戶的crontab 文件將被修改。但是請注意,如果使用了su命令再使用crontab 命令很可能就會出現混亂的情況。所以如果是使用了su命令,最好使用-u選項來指定究竟是哪個用戶的crontab文件。
-l 在標准輸出上顯示當前的crontab。
-r 刪除當前的crontab文件。
-e 使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab文件。當結束編輯離開時,編輯後的文件將自動安裝。
[例7]
# crontab -l #列出用戶目前的crontab。
10 6 * * * date
0 */2 * * * date
0 23-7/2,8 * * * date
#
在crontab文件中如何輸入需要執行的命令和時間。該文件中每行都包括六個域,其中前五個域是指定命令被執行的時間,最後一個域是要被執行的命令。每個域之間使用空格或者製表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
第一項是分鍾,第二項是小時,第三項是一個月的第幾天,第四項是一年的第幾個月,第五項是一周的星期幾,第六項是要執行的命令。這些項都不能為空,必須填入。如果用戶不需要指定其中的幾項,那麼可以使用*代替。因為*是統配符,可以代替任何字元,所以就可以認為是任何時間,也就是該項被忽略了。在表4-1中給出了每項的合法范圍。
表4-1指定時間的合法范圍
時間
合法值
minute 00-59
hour 00-23,其中00點就是晚上12點
day-of-month
01-31
month-of-year
01-12
day-of-week
0-6,其中周日是0
這樣用戶就可以往crontab 文件中寫入無限多的行以完成無限多的命令。命令域中可以寫入所有可以在命令行寫入的命令和符號,其他所有時間域都支持列舉,也就是域中可以寫入很多的時間值,只要滿足這些時間值中的任何一個都執行命令,每兩個時間值中間使用逗號分隔。
[例8]
5,15,25,35,45,55 16,17,18 * * * command
這就是表示任意天任意月,其實就是每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。
[例9]
在每周一,三,五的下午3:00系統進入維護狀態,重新啟動系統。那麼在crontab 文件中就應該寫入如下欄位:
00 15 * * 1,3,5 shutdown -r +5
然後將該文件存檔為foxy.cron,再鍵入crontab foxy.cron安裝該文件。
[例10]
每小時的10分,40分執行用戶目錄下的innd/bbslin這個指令:
10,40 * * * * innd/bbslink
[例11]
每小時的1分執行用戶目錄下的bin/account這個指令:
1 * * * * bin/account
[例12]
每天早晨三點二十分執行用戶目錄下如下所示的兩個指令(每個指令以;分隔):
20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire>expire.1st)
[例13]
每年的一月和四月,4號到9號的3點12分和3點55分執行/bin/rm -f expire.1st這個指令,並把結果添加在mm.txt這個文件之後(mm.txt文件位於用戶自己的目錄位置)。
12,55 3 4-9 1,4 * /bin/rm -f expire.1st>> m.txt
[例14]
我們來看一個超級用戶的crontab文件:
#Run the 『atrun』 program every minutes
#This runs anything that』s e to run from 『at』.See man 『at』 or 『atrun』. 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/lib/atrun
40 7 * * * updatedb
8,10,22,30,39,46,54,58 * * * * /bin/sync
進程的掛起及恢復命令bg、fg
作業控制允許將進程掛起並可以在需要時恢復進程的運行,被掛起的作業恢復後將從中止處開始繼續運行。只要在鍵盤上按,即可掛起當前的前台作業。
[例15]
$ cat >
< ctrl+z>
text.file [1] + stopped cat > text.file
$ jobs [1]+ stopped cat >text.file
在鍵盤上按後,將掛起當前執行的命令cat。使用jobs命令可以顯示shell的作業清單,包括具體的作業、作業號以及作業當前所處的狀態。
恢復進程執行時,有兩種選擇:用fg命令將掛起的作業放回到前台執行;用bg命令將掛起的作業放到後台執行。
[例16]
用戶正在使用Emacs,突然需要查看系統進程情況。就首先使用組合鍵將Emacs進程掛起,然後使用bg命令將其在後台啟動,這樣就得到了前台的操作控制權,接著鍵入「ps –x」查看進程情況。查看完畢後,使用fg命令將Emacs帶回前台運行即可。其命令格式為:
< ctrl+z>
$ bg emacs
$ ps –x
$ fg emacs
默認情況下,fg和bg命令對最近停止的作業進行操作。如果希望恢復其他作業的運行,可以在命令中指定要恢復作業的作業號來恢復該作業。例如:
$ fg 1
cat > text.file
靈活使用上述命令,將給自己帶來很大的方便。

❾ LINUX系統的內存管理知識詳解

內存是Linux內核所管理的最重要的資源之一。內存管理系統是操作系統中最為重要的部分,因為系統的物理內存總是少於系統所需要的內存數量。虛擬內存就是為了克服這個矛盾而採用的策略。系統的虛擬內存通過在各個進程之間共享內存而使系統看起來有多於實際內存的內存容量。Linux支持虛擬內存, 就是使用磁碟作為RAM的擴展,使可用內存相應地有效擴大。核心把當前不用的內存塊存到硬碟,騰出內存給其他目的。當原來的內容又要使用時,再讀回內存。以下就是我為大家整理到的詳細LINUX系統內存管理的知識,歡迎大家閱讀!!!

LINUX系統教程:內存管理的知識詳解

一、內存使用情況監測

(1)實時監控內存使用情況

在命令行使用「Free」命令可以監控內存使用情況

代碼如下:

#free

total used free shared buffers cached

Mem: 256024 192284 63740 0 10676 101004

-/+ buffers/cache: 80604 175420

Swap: 522072 0 522072

上面給出了一個256兆的RAM和512兆交換空間的系統情況。第三行輸出(Mem:)顯示物理內存。total列不顯示核心使用的物理內存(通常大約1MB)。used列顯示被使用的內存總額(第二行不計緩沖)。 free列顯示全部沒使用的內存。Shared列顯示多個進程共享的內存總額。Buffers列顯示磁碟緩存的當前大小。第五行(Swap:)對對換空間,顯示的信息類似上面。如果這行為羨芹全0,那麼沒使用對換空間。在預設的狀態下,free命令以千位元組(也就是1024位元組為單位)來顯示內存使用情況。可以使用—h參數以位元組為單位顯示內存使用情況,或者可以兄晌使用—m參數以兆位元組為單位顯示內存使用情況。還可以通過—s參數使用命令來不間斷地監視內存使用情況:

#free –b –s2

這個命令將會在終端窗口中連續不斷地報告內存的使用情況,每2秒鍾更新一次。

(2)組合watch與 free命令用來實時監控內存使用情況:

代碼如下:

#watch -n 2 -d free

Every 2.0s: free Fri Jul 6 06:06:12 2007

total used free shared buffers cached

Mem: 233356 218616 14740 0 5560 64784

-/+ buffers/cache: 148272 85084

Swap: 622584 6656 615928

watch命令會每兩秒執行 free一次,執行前會清除屏幕,在同樣位置顯示數據。因為 watch命令不會卷動屏幕,所以適合出長時間的監測內存使用率。可以使用 -n選項,控制執行的頻率;也可以利用 -d選項,讓命令將每次不同的地方顯示出來。Watch命令會一直執行,直到您按下 [Ctrl]-[C] 為止。

二、虛擬內存的概念

(1)Linux虛擬內存實現機制

Linux虛擬內存的實現需要六種機制的支持:地址映射機制、內存分配回收機制、緩存和刷新機制、請求頁機制、交換機制、內存共享機制。

首先內存管理程序通過映射機制把用戶程序的邏輯地址映射到物理地址,在用戶程序運行時如果發現程序中要用的虛地址沒有對應的物理內存時,就發出了請求頁要求;如果有空閑的內存可供分配,就請求分配內存(於是用到了內存的分配和回收),並把正在使用的物理頁記錄在緩存中(使用了緩存機制)。 如果沒有足夠的內存可供分配,那麼就調用交換機制,騰出一部分內存。另外在地址映射中要通過TLB(翻譯後援存儲器)來尋找物理頁;交換機制中也要羨派鋒用到交換緩存,並且把物理頁內容交換到交換文件中後也要修改頁表來映射文件地址。

(2)虛擬內存容量設定

也許有人告訴你,應該分配2倍於物理內存的虛擬內存,但這是個不固定的規律。如果你的物理保存比較小,可以這樣設定。如果你有1G物理內存或更多的話,可以縮小一下虛擬內存。Linux會把大量的內存用做Cache的,但在資源緊張時回收回.。你只要看到swap為0或者很小就可以放心了,因為內存放著不用才是最大的浪費。

三、使甩vmstat命令監視虛擬內存使用情況

vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監視。它是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。通常使用vmstat 5 5(表示在5秒時間內進行5次采樣)命令測試。將得到一個數據匯總它可以反映真正的系統情況。

代碼如下:

#vmstat 5 5

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

1 0 62792 3460 9116 88092 6 30 189 89 1061 569 17 28 54 2

0 0 62792 3400 9124 88092 0 0 0 14 884 434 4 14 81 0

0 0 62792 3400 9132 88092 0 0 0 14 877 424 4 15 81 0

1 0 62792 3400 9140 88092 0 0 0 14 868 418 6 20 74 0

1 0 62792 3400 9148 88092 0 0 0 15 847 400 9 25 67 0

vmstat命令輸出分成六個部分:

(1)進程procs:

r:在運行隊列中等待的進程數 。

b:在等待io的進程數 。

(2)內存memoy:

swpd:現時可用的交換內存(單位KB)。

free:空閑的內存(單位KB)。

buff: 緩沖去中的內存數(單位:KB)。

cache:被用來做為高速緩存的內存數(單位:KB)。

(3) swap交換頁面

si: 從磁碟交換到內存的交換頁數量,單位:KB/秒。

so: 從內存交換到磁碟的交換頁數量,單位:KB/秒。

(4) io塊設備:

bi: 發送到塊設備的塊數,單位:塊/秒。

bo: 從塊設備接收到的塊數,單位:塊/秒。

(5)system系統:

in: 每秒的中斷數,包括時鍾中斷。

cs: 每秒的環境(上下文)切換次數。

(6)cpu中央處理器:

cs:用戶進程使用的時間 。以百分比表示。

sy:系統進程使用的時間。 以百分比表示。

id:中央處理器的空閑時間 。以百分比表示。

如果 r經常大於 4 ,且id經常小於40,表示中央處理器的負荷很重。 如果bi,bo 長期不等於0,表示物理內存容量太小。

四、Linux 伺服器的內存泄露和回收內存的方法

1、內存泄漏的定義:

一般我們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完後必須顯示釋放的內存。應用程序一般使用malloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。

2、內存泄露的危害

從用戶使用程序的角度來看,內存泄漏本身不會產生什麼危害,作為一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的`是內存泄漏的堆積,這會最終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什麼危害,因為它不會堆積,而隱式內存泄漏危害性則非常大,因為較之於常發性和偶發性內存泄漏它更難被檢測到。存在內存泄漏問題的程序除了會佔用更多的內存外,還會使程序的性能急劇下降。對於伺服器而言,如果出現這種情況,即使系統不崩潰,也會嚴重影響使用。

3、內存泄露的檢測和回收

對於內存溢出之類的麻煩可能大家在編寫指針比較多的復雜的程序的時候就會遇到。在 Linux 或者 unix 下,C、C++語言是最使用工具。但是我們的 C++ 程序缺乏相應的手段來檢測內存信息,而只能使用 top 指令觀察進程的動態內存總額。而且程序退出時,我們無法獲知任何內存泄漏信息。

使用kill命令

使用Linux命令回收內存,我們可以使用Ps、Kill兩個命令檢測內存使用情況和進行回收。在使用超級用戶許可權時使用命令「Ps」,它會列出所有正在運行的程序名稱,和對應的進程號(PID)。Kill命令的工作原理是:向Linux操作系統的內核送出一個系統操作信號和程序的進程號(PID)。

應用例子:

為了高效率回收內存可以使用命令ps 參數v:

代碼如下:

[root@www ~]# ps v

PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND

2542 tty1 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty1

2543 tty2 Ss+ 0:00 0 8 1631 428 0.1 /sbin/mingetty tty2

2547 tty3 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty3

2548 tty4 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty4

2574 tty5 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty5

2587 tty6 Ss+ 0:00 0 8 1627 424 0.1 /sbin/mingetty tty6

2657 tty7 Ss+ 1:18 12 1710 29981 7040 3.0 /usr/bin/Xorg :0 -br -a

2670 pts/2 Ss 0:01 2 682 6213 1496 0.6 -bash

3008 pts/4 Ss 0:00 2 682 6221 1472 0.6 /bin/bash

3029 pts/4 S+ 0:00 2 32 1783 548 0.2 ping 192.168.1.12

3030 pts/2 R+ 0:00 2 73 5134 768 0.3 ps v

然後如果想回收Ping命令的內存的話,使用命令:

代碼如下:

# Kill -9 3029

使用工具軟體

Memprof是一個非常具有吸引力且非常易於使用的軟體,它由Red Hat的Owen Talyor創立。這個工具是用於GNOME前端的Boehm-Demers-Weiser垃圾回收器。這個工具直接就可以執行,並且其工作起來無需對源代碼進行任何修改。在程序執行時,這個工具會以圖形化的方式顯示內存的使用情況。

相關介紹:Linux

嚴格來講,Linux這個詞本身只表示Linux內核,但人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU 工程各種工具和資料庫的操作系統。

Linux擁有以下特性:類似於Unix的基本思想,支持完全免費與自由傳播,完全兼容POSIX1.0標准,支持多用戶、多任務、有著良好的界面、支持多種平台。Linux 能運行主要的UNIX工具軟體、應用程序和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。

Linux有著許多不同的版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。

閱讀全文

與linux進程管理實驗原理相關的資料

熱點內容
雙網卡上不同網路 瀏覽:94
拳皇game怎麼打壓縮文件 瀏覽:748
有哪些兩級配送物流網路 瀏覽:8
sql目錄名加文件名 瀏覽:446
小學編程教材哪個好 瀏覽:179
英語詞典蘋果app 瀏覽:344
黨的文件保管採用什麼辦法 瀏覽:45
老版本的百度雲盤 瀏覽:201
一指彈app怎麼用 瀏覽:249
ps怎麼提取文件名 瀏覽:540
蘋果7plus網路連接超時 瀏覽:959
權重6網站賣多少 瀏覽:151
bzb網站有哪些 瀏覽:687
機械類專業要學什麼編程 瀏覽:89
SQL中打開excel文件 瀏覽:468
藍牙可以傳word文件嗎 瀏覽:65
三星能自己升級系統嗎 瀏覽:265
12款新福克斯手動擋bcm升級 瀏覽:330
js內容尾部增加內容 瀏覽:803
sqlldr控制文件詳解 瀏覽:614

友情鏈接