Ⅰ linux下的PID,PIDD是什麼他們之間的關系以及應用是什麼
在 Linux 底下執行一個指令時,系統會給予這個動作一個 ID, 我們稱為 PID,而根據啟用這個指令的使用者與相關的指令功能,而給予這個特定 PID 一組許可權, 該指令可以進行的行為則與這個 PID 的許可權有關。
linux進程簡介
Linux是一個多任務的操作系統,也就是說,在同一個時間內,可以有多個進程同時執行。如果讀者對計算機硬體體系有一定了解的話,會知道我們大家常用的單CPU計算機實際上在一個時間片斷內只能執行一條指令,那麼Linux是如何實現多進程同時執行的呢?原來Linux使用了一種稱為"進程調度(process scheling)"的手段,首先,為每個進程指派一定的運行時間,這個時間通常很短,短到以毫秒為單位,然後依照某種規則,從眾多進程中挑選一個投入運行,其他的進程暫時等待,當正在運行的那個進程時間耗盡,或執行完畢退出,或因某種原因暫停,Linux就會重新進行調度,挑選下一個進程投入運行。因為每個進程佔用的時間片都很短,在我們使用者的角度來看,就好像多個進程同時運行一樣了。
在Linux中,每個進程在創建時都會被分配一個數據結構,稱為進程式控制制塊(Process Control Block,簡稱PCB)。PCB中包含了很多重要的信息,供系統調度和進程本身執行使用,其中最重要的莫過於進程ID(process ID)了,進程ID也被稱作進程標識符,是一個非負的整數,在Linux操作系統中唯一地標志一個進程,在我們最常使用的I386架構(即PC使用的架構)上,一個非負的整數的變化范圍是0-32767,這也是我們所有可能取到的進程ID。其實從進程ID的名字就可以看出,它就是進程的身份證號碼,每個人的身份證號碼都不會相同,每個進程的進程ID也不會相同。
一個或多個進程可以合起來構成一個進程組(process group),一個或多個進程組可以合起來構成一個會話(session)。這樣我們就有了對進程進行批量操作的能力,比如通過向某個進程組發送信號來實現向該組中的每個進程發送信號。
最後,讓我們通過ps命令親眼看一看自己的系統中目前有多少進程在運行:
$ps -aux(以下是在我的計算機上的運行結果,你的結果很可能與這不同。)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.4 1412 520 ? S May15 0:04 init [3]
root 2 0.0 0.0 0 0 ? SW May15 0:00 [keventd]
root 3 0.0 0.0 0 0 ? SW May15 0:00 [kapm-idled]
root 4 0.0 0.0 0 0 ? SWN May15 0:00 [ksoftirqd_CPU0]
root 5 0.0 0.0 0 0 ? SW May15 0:00 [kswapd]
root 6 0.0 0.0 0 0 ? SW May15 0:00 [kreclaimd]
root 7 0.0 0.0 0 0 ? SW May15 0:00 [bdflush]
root 8 0.0 0.0 0 0 ? SW May15 0:00 [kupdated]
root 9 0.0 0.0 0 0 ? SW< May15 0:00 [mdrecoveryd]
root 13 0.0 0.0 0 0 ? SW May15 0:00 [kjournald]
root 132 0.0 0.0 0 0 ? SW May15 0:00 [kjournald]
root 673 0.0 0.4 1472 592 ? S May15 0:00 syslogd -m 0
root 678 0.0 0.8 2084 1116 ? S May15 0:00 klogd -2
rpc 698 0.0 0.4 1552 588 ? S May15 0:00 portmap
rpcuser 726 0.0 0.6 1596 764 ? S May15 0:00 rpc.statd
root 839 0.0 0.4 1396 524 ? S May15 0:00 /usr/sbin/apmd -p
root 908 0.0 0.7 2264 1000 ? S May15 0:00 xinetd -stayalive
root 948 0.0 1.5 5296 1984 ? S May15 0:00 sendmail: accepti
root 967 0.0 0.3 1440 484 ? S May15 0:00 gpm -t ps/2 -m /d
wnn 987 0.0 2.7 4732 3440 ? S May15 0:00 /usr/bin/cserver
root 1005 0.0 0.5 1584 660 ? S May15 0:00 crond
wnn 1025 0.0 1.9 3720 2488 ? S May15 0:00 /usr/bin/tserver
xfs 1079 0.0 2.5 4592 3216 ? S May15 0:00 xfs -droppriv -da
daemon 1115 0.0 0.4 1444 568 ? S May15 0:00 /usr/sbin/atd
root 1130 0.0 0.3 1384 448 tty1 S May15 0:00 /sbin/mingetty tt
root 1131 0.0 0.3 1384 448 tty2 S May15 0:00 /sbin/mingetty tt
root 1132 0.0 0.3 1384 448 tty3 S May15 0:00 /sbin/mingetty tt
root 1133 0.0 0.3 1384 448 tty4 S May15 0:00 /sbin/mingetty tt
root 1134 0.0 0.3 1384 448 tty5 S May15 0:00 /sbin/mingetty tt
root 1135 0.0 0.3 1384 448 tty6 S May15 0:00 /sbin/mingetty tt
root 8769 0.0 0.6 1744 812 ? S 00:08 0:00 in.telnetd: 192.1
root 8770 0.0 0.9 2336 1184 pts/0 S 00:08 0:00 login -- lei
lei 8771 0.1 0.9 2432 1264 pts/0 S 00:08 0:00 -bash
lei 8809 0.0 0.6 2764 808 pts/0 R 00:09 0:00 ps -aux
以上除標題外,每一行都代表一個進程。在各列中,PID一列代表了各進程的進程ID,COMMAND一列代表了進程的名稱或在Shell中調用的命令行,對其他列的具體含義,我就不再作解釋,有興趣的讀者可以去參考相關書籍。
getpid
在2.4.4版內核中,getpid是第20號系統調用,其在Linux函數庫中的原型是:
#include<sys/types.h> /* 提供類型pid_t的定義 */
#include<unistd.h> /* 提供函數的定義 */
pid_t getpid(void);
getpid的作用很簡單,就是返回當前進程的進程ID,請大家看以下的例子:
/* getpid_test.c */
#include<unistd.h>
main()
{
printf("The current process ID is %d
",getpid());
}
細心的讀者可能注意到了,這個程序的定義里並沒有包含頭文件sys/types.h,這是因為我們在程序中沒有用到pid_t類型,pid_t類型即為進程ID的類型。事實上,在i386架構上(就是我們一般PC計算機的架構),pid_t類型是和int類型完全兼容的,我們可以用處理整形數的方法去處理pid_t類型的數據,比如,用"%d"把它列印出來。
編譯並運行程序getpid_test.c:
$gcc getpid_test.c -o getpid_test
$./getpid_test
The current process ID is 1980
(你自己的運行結果很可能與這個數字不一樣,這是很正常的。)
再運行一遍:
$./getpid_test
The current process ID is 1981
正如我們所見,盡管是同一個應用程序,每一次運行的時候,所分配的進程標識符都不相同。
fork
在2.4.4版內核中,fork是第2號系統調用,其在Linux函數庫中的原型是:
#include<sys/types.h> /* 提供類型pid_t的定義 */
#include<unistd.h> /* 提供函數的定義 */
pid_t fork(void);
只看fork的名字,可能難得有幾個人可以猜到它是做什麼用的。fork系統調用的作用是復制一個進程。當一個進程調用它,完成後就出現兩個幾乎一模一樣的進程,我們也由此得到了一個新進程。據說fork的名字就是來源於這個與叉子的形狀頗有幾分相似的工作流程。
在Linux中,創造新進程的方法只有一個,就是我們正在介紹的fork。其他一些庫函數,如system(),看起來似乎它們也能創建新的進程,如果能看一下它們的源碼就會明白,它們實際上也在內部調用了fork。包括我們在命令行下運行應用程序,新的進程也是由shell調用fork製造出來的。fork有一些很有意思的特徵,下面就讓我們通過一個小程序來對它有更多的了解。
/* fork_test.c */
#include<sys/types.h>
#inlcude<unistd.h>
main()
{
pid_t pid;
/*此時僅有一個進程*/
pid=fork();
/*此時已經有兩個進程在同時運行*/
if(pid<0)
printf("error in fork!");
else if(pid==0)
printf("I am the child process, my process ID is %d
",getpid());
else
printf("I am the parent process, my process ID is %d
",getpid());
}
編譯並運行:
$gcc fork_test.c -o fork_test
$./fork_test
I am the parent process, my process ID is 1991
I am the child process, my process ID is 1992
看這個程序的時候,頭腦中必須首先了解一個概念:在語句pid=fork()之前,只有一個進程在執行這段代碼,但在這條語句之後,就變成兩個進程在執行了,這兩個進程的代碼部分完全相同,將要執行的下一條語句都是if(pid==0)......。
兩個進程中,原先就存在的那個被稱作"父進程",新出現的那個被稱作"子進程"。父子進程的區別除了進程標志符(process ID)不同外,變數pid的值也不相同,pid存放的是fork的返回值。fork調用的一個奇妙之處就是它僅僅被調用一次,卻能夠返回兩次,它可能有三種不同的返回值:
在父進程中,fork返回新創建子進程的進程ID;
在子進程中,fork返回0;
如果出現錯誤,fork返回一個負值;
fork出錯可能有兩種原因:
(1)當前的進程數已經達到了系統規定的上限,這時errno的值被設置為EAGAIN。(2)系統內存不足,這時errno的值被設置為ENOMEM。(關於errno的意義,請參考本系列的第一篇文章。)
fork系統調用出錯的可能性很小,而且如果出錯,一般都為第一種錯誤。如果出現第二種錯誤,說明系統已經沒有可分配的內存,正處於崩潰的邊緣,這種情況對Linux來說是很罕見的。
說到這里,聰明的讀者可能已經完全看懂剩下的代碼了,如果pid小於0,說明出現了錯誤;pid==0,就說明fork返回了0,也就說明當前進程是子進程,就去執行printf("I am the child!"),否則(else),當前進程就是父進程,執行printf("I am the parent!")。完美主義者會覺得這很冗餘,因為兩個進程里都各有一條它們永遠執行不到的語句。不必過於為此耿耿於懷,畢竟很多年以前,UNIX的鼻祖們在當時內存小得無法想像的計算機上就是這樣寫程序的,以我們如今的"海量"內存,完全可以把這幾個位元組的顧慮拋到九霄雲外。
說到這里,可能有些讀者還有疑問:如果fork後子進程和父進程幾乎完全一樣,而系統中產生新進程唯一的方法就是fork,那豈不是系統中所有的進程都要一模一樣嗎?那我們要執行新的應用程序時候怎麼辦呢?從對Linux系統的經驗中,我們知道這種問題並不存在。至於採用了什麼方法,我們把這個問題留到後面具體討論。
exit
在2.4.4版內核中,exit是第1號調用,其在Linux函數庫中的原型是:
#include<stdlib.h>
void exit(int status);
不像fork那麼難理解,從exit的名字就能看出,這個系統調用是用來終止一個進程的。無論在程序中的什麼位置,只要執行到exit系統調用,進程就會停止剩下的所有操作,清除包括PCB在內的各種數據結構,並終止本進程的運行。請看下面的程序:
/* exit_test1.c */
#include<stdlib.h>
main()
{
printf("this process will exit!
");
exit(0);
printf("never be displayed!
");
}
編譯後運行:
$gcc exit_test1.c -o exit_test1
$./exit_test1
this process will exit!
我們可以看到,程序並沒有列印後面的"never be displayed! ",因為在此之前,在執行到exit(0)時,進程就已經終止了。
exit系統調用帶有一個整數類型的參數status,我們可以利用這個參數傳遞進程結束時的狀態,比如說,該進程是正常結束的,還是出現某種意外而結束的,一般來說,0表示沒有意外的正常結束;其他的數值表示出現了錯誤,進程非正常結束。我們在實際編程時,可以用wait系統調用接收子進程的返回值,從而針對不同的情況進行不同的處理。關於wait的詳細情況,我們將在以後的篇幅中進行介紹。
exit和_exit
作為系統調用而言,_exit和exit是一對孿生兄弟,它們究竟相似到什麼程度,我們可以從Linux的源碼中找到答案:
#define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h第334行 */
"__NR_"是在Linux的源碼中為每個系統調用加上的前綴,請注意第一個exit前有2條下劃線,第二個exit前只有1條下劃線。
這時隨便一個懂得C語言並且頭腦清醒的人都會說,_exit和exit沒有任何區別,但我們還要講一下這兩者之間的區別,這種區別主要體現在它們在函數庫中的定義。_exit在Linux函數庫中的原型是:
#include<unistd.h>
void _exit(int status);
和exit比較一下,exit()函數定義在stdlib.h中,而_exit()定義在unistd.h中,從名字上看,stdlib.h似乎比unistd.h高級一點,那麼,它們之間到底有什麼區別呢?讓我們先來看流程圖,通過下圖,我們會對這兩個系統調用的執行過程產生一個較為直觀的認識。
從圖中可以看出,_exit()函數的作用最為簡單:直接使進程停止運行,清除其使用的內存空間,並銷毀其在內核中的各種數據結構;exit()函數則在這些基礎上作了一些包裝,在執行退出之前加了若幹道工序,也是因為這個原因,有些人認為exit已經不能算是純粹的系統調用。
exit()函數與_exit()函數最大的區別就在於exit()函數在調用exit系統調用之前要檢查文件的打開情況,把文件緩沖區中的內容寫迴文件,就是圖中的"清理I/O緩沖"一項。
在Linux的標准函數庫中,有一套稱作"高級I/O"的函數,我們熟知的printf()、fopen()、fread()、fwrite()都在此列,它們也被稱作"緩沖I/O(buffered I/O)",其特徵是對應每一個打開的文件,在內存中都有一片緩沖區,每次讀文件時,會多讀出若干條記錄,這樣下次讀文件時就可以直接從內存的緩沖區中讀取,每次寫文件的時候,也僅僅是寫入內存中的緩沖區,等滿足了一定的條件(達到一定數量,或遇到特定字元,如換行符和文件結束符EOF),再將緩沖區中的內容一次性寫入文件,這樣就大大增加了文件讀寫的速度,但也為我們編程帶來了一點點麻煩。如果有一些數據,我們認為已經寫入了文件,實際上因為沒有滿足特定的條件,它們還只是保存在緩沖區內,這時我們用_exit()函數直接將進程關閉,緩沖區中的數據就會丟失,反之,如果想保證數據的完整性,就一定要使用exit()函數。
請看以下常式:
/* exit2.c */
#include<stdlib.h>
main()
{
printf("output begin
");
printf("content in buffer");
exit(0);
}
編譯並運行:
$gcc exit2.c -o exit2
$./exit2
output begin
content in buffer
/* _exit1.c */
#include<unistd.h>
main()
{
printf("output begin
");
printf("content in buffer");
_exit(0);
}
編譯並運行:
$gcc _exit1.c -o _exit1
$./_exit1
output begin
在Linux中,標准輸入和標准輸出都是作為文件處理的,雖然是一類特殊的文件,但從程序員的角度來看,它們和硬碟上存儲數據的普通文件並沒有任何區別。與所有其他文件一樣,它們在打開後也有自己的緩沖區。
請讀者結合前面的敘述,思考一下為什麼這兩個程序會得出不同的結果。相信如果您理解了我前面所講的內容,會很容易的得出結論。
在這篇文章中,我們對Linux的進程管理作了初步的了解,並在此基礎上學習了getpid、fork、exit和_exit四個系統調用。在下一篇文章中,我們將學習與Linux進程管理相關的其他系統調用,並將作一些更深入的探討。
前面的文章中,我們已經了解了父進程和子進程的概念,並已經掌握了系統調用exit的用法,但可能很少有人意識到,在一個進程調用了exit之後,該進程並非馬上就消失掉,而是留下一個稱為僵屍進程(Zombie)的數據結構。在Linux進程的5種狀態中,僵屍進程是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其他進程收集,除此之外,僵屍進程不再佔有任何內存空間。從這點來看,僵屍進程雖然有一個很酷的名字,但它的影響力遠遠抵不上那些真正的僵屍兄弟,真正的僵屍總能令人感到恐怖,而僵屍進程卻除了留下一些供人憑吊的信息,對系統毫無作用。
也許讀者們還對這個新概念比較好奇,那就讓我們來看一眼Linux里的僵屍進程究竟長什麼樣子。
當一個進程已退出,但其父進程還沒有調用系統調用wait(稍後介紹)對其進行收集之前的這段時間里,它會一直保持僵屍狀態,利用這個特點,我們來寫一個簡單的小程序:
/* zombie.c */
#include
#include
main()
{
pid_t pid;
pid=fork();
if(pid<0) /* 如果出錯 */
printf("error occurred!n");
else if(pid==0) /* 如果是子進程 */
exit(0);
else /* 如果是父進程 */
sleep(60); /* 休眠60秒,這段時間里,父進程什麼也幹不了 */
wait(NULL); /* 收集僵屍進程 */
}
sleep的作用是讓進程休眠指定的秒數,在這60秒內,子進程已經退出,而父進程正忙著睡覺,不可能對它進行收集,這樣,我們就能保持子進程60秒的僵屍狀態。
編譯這個程序:
$ cc zombie.c -o zombie
後台運行程序,以使我們能夠執行下一條命令:
$ ./zombie &
[1] 1577
列一下系統內的進程:
$ ps -ax
... ...
1177 pts/0 S 0:00 -bash
1577 pts/0 S 0:00 ./zombie
1578 pts/0 Z 0:00 [zombie ]
1579 pts/0 R 0:00 ps -ax
看到中間的"Z"了嗎?那就是僵屍進程的標志,它表示1578號進程現在就是一個僵屍進程。
我們已經學習了系統調用exit,它的作用是使進程退出,但也僅僅限於將一個正常的進程變成一個僵屍進程,並不能將其完全銷毀。僵屍進程雖然對其他進程幾乎沒有什麼影響,不佔用CPU時間,消耗的內存也幾乎可以忽略不計,但有它在那裡呆著,還是讓人覺得心裡很不舒服。而且Linux系統中進程數目是有限制的,在一些特殊的情況下,如果存在太多的僵屍進程,也會影響到新進程的產生。那麼,我們該如何來消滅這些僵屍進程呢?
先來了解一下僵屍進程的來由,我們知道,Linux和UNIX總有著剪不斷理還亂的親緣關系,僵屍進程的概念也是從UNIX上繼承來的,而UNIX的先驅們設計這個東西並非是因為閑來無聊想煩煩其他的程序員。僵屍進程中保存著很多對程序員和系統管理員非常重要的信息,首先,這個進程是怎麼死亡的?是正常退出呢,還是出現了錯誤,還是被其它進程強迫退出的?其次,這個進程佔用的總系統CPU時間和總用戶CPU時間分別是多少?發生頁錯誤的數目和收到信號的數目。這些信息都被存儲在僵屍進程中,試想如果沒有僵屍進程,進程一退出,所有與之相關的信息都立刻歸於無形,而此時程序員或系統管理員需要用到,就只好乾瞪眼了。
那麼,我們如何收集這些信息,並終結這些僵屍進程呢?就要靠我們下面要講到的waitpid調用和wait調用。這兩者的作用都是收集僵屍進程留下的信息,同時使這個進程徹底消失。下面就對這兩個調用分別作詳細介紹。
Ⅱ linux下的root,bin, cdrom,etc,initrd,lib分別主要放哪些文件的啊
總體的,不好歸類的
/media 用來掛載usb存儲設備,DVD, CD-ROM等
/mnt 用來臨時掛載文件系統,可插拔的設備應該掛載到/media上去
/home 除root之外的用戶目錄的默認所在地
/root root用戶目錄
/bin 最常用的命令
/sbin 系統管理員使用的命令(sbin=system bin)
/usr/local 使用源碼安裝的話,一般把prefix目錄指定到這里,如/usr/local/ruby
/usr/share/applications desktop文件是桌面的菜單項
~/.gnome*,~/.gconf* gnome面板的個人配置信息,當gnome面板亂了,可以嘗試刪除這些文件來恢復默認面板
/boot目錄,kernel相關部分
/boot/symvers-%{KRELEASE}.gz 保存著內核中所有符號的crc值
/boot/System.map-%{KRELEASE} 給kernel使用的符號表(symbol table)
/boot/vmlinuz-%{KRELEASE} 可引導的、壓縮的內核
/boot/initrd-%{KRELEASE}.img 包含了支持 Linux 系統兩階段引導過程所需要的必要可執行程序和系統文件
/boot/config-%{KRELEASE} 包括kernel的make config
/boot/message cpio格式的打包文件,存放Grub的配置信息,裡麵包括了圖片,文字說明等內容
/boot目錄,grub配置
/boot/grub/menu.lst 一個鏈接文件,真實文件是grub.conf
/boot/grub/grub.conf grub的配置文件
/boot/grub/device.map 設備的映射文件
/boot/grub/splash.xpm.gz grub開機畫面的gzip壓縮包
/boot/grub/stageN 一般有stage1和stage2,是grub的核心,受限於mbr512位元組的大小限制,所以切開成幾個,stage1是用來載入stage2的
/boot/grub/XXX_stage1_5 stage2文件較大,一般存放於文件系統中,需要XXX_stage1_5來識別各種各樣的文件系統
/etc目錄,系統用戶/用戶組
/etc/passwd 存放所有系統用戶及相關信息
/etc/shadow 存放所有系統用戶的密碼信息
/etc/group 存放所有系統用戶組及相關信息
/etc/gshadow 存放所有系統用戶組的密碼信息
/etc目錄,系統啟動流程相關
/etc/issue 發行版信息
/etc/redhat-release redhat版本信息
/etc/inittab 系統初始化配置
/etc/init.d 存放服務腳本的地方
/etc/rc[0-6S].d 每個運行級別對應的服務,里邊的腳本都是鏈接到/etc/init.d目錄
/etc/rc rc啟動腳本
/etc/rc.local 在所有init腳本結束後調用
/etc/rc.sysinit 在系統啟動時運行一次
/etc/profile 環境變數配置
/etc/profile.d 保存一些腳本,可在/etc/profile中調用
~/.bash_profile 針對某個用戶的配置,會調用.bash_rc
~/.bashrc 針對某個用戶的配置,會調用/etc/bashrc
/etc/bashrc 使用bash時,可設置全局環境配置
~/.bash_history 命令的歷史記錄
~/.bash_logout 用戶退出時執行
/etc/xinetd.conf xinetd的配置文件
/etc/xinetd.d 存放xinetd服務的地方
/etc目錄,基本應用配置相關
/etc/skel 存放用戶文件的「骨架」,當一個用戶創建的時候,里邊的文件就會拷貝到相應的home目錄
/etc/X11 存放X Window的系統配置文件,例如xorg.conf
/etc/DIR_COLORS ls的時候,文件/文件夾顯示的顏色
/etc/mtab 記錄目前掛載的文件系統信息
/etc/fastboot 由shutdown -f 所產生的 ,在重啟之後, 系統會去檢查這個文件是否存在以決定是否要執行fsck
/etc/nologin 系統關閉的時候自動產生,里邊放著shutdown message。在這個時候如果有用戶企圖登錄,就會列印出這個文件存放的message,然後阻止你登錄
/etc/fstab 默認的文件系統掛載情況
/etc/virc vi的配置
/etc/vimrc vim的配置
/etc/wgetrc wget的配置
/etc/yum.conf yum的配置
/etc/yum.repos.d yum源的存放位置
/etc/kmp.conf kmp內核的配置文件
/etc/my.cnf mysql的配置文件
/etc/ssh ssh的配置文件目錄,重要的有sshd_config
/etc/syslog.conf syslog的配置文件
/etc/updatedb.conf updatedb的配置文件
/etc/mtools.conf mtools配置,用於在*UNIX系統中直接訪問dos/win文件系統
/etc/sysctl.conf sysctl預載入的配置文件
/etc/moprobe.conf modprobe的配置文件
/etc/ld.so.conf 載入動態鏈接庫的配置文件,默認會載入ld.so.conf.d里邊的配置
/etc/ld.so.conf.d 存放動態鏈接庫的配置文件
/etc/ld.so.cache 動態鏈接庫的緩存,二進制文件,可以通過ldconfig --print-cache查看
/etc/services 網路服務列表(服務名,埠,協議等)
/etc目錄,域名解析,主機訪問控制
/etc/host.conf 定義DNS客戶端主機發出域名解析的處理順序,默認是先查看/etc/hosts文件,再發送遠程請求
/etc/hosts 自定義ip-域名解析
/etc/resolv.conf DNS伺服器地址
/etc/hosts.allow 和hosts.deny一起用來作為tcpd伺服器的配置文件,tcpd伺服器可以控制外部IP對本機服務的訪問。hosts.allow控制可以訪問本機的IP地址
/etc/hosts.deny 控制禁止訪問本機的IP。如果和hosts.allow的配置有沖突,以hosts.deny為准
/etc目錄,定時任務控制
/etc/crontab cron任務的配置文件,一般在里邊配置有cron.hourly,cron.daily,cron.weekly和cron.monthly
/etc/cron.d 如果你要在特殊的時間使用crontab,可以把配置放到文件夾里邊,配置的格式和/etc/crontab一樣
/etc /cron.daily 每天定時任務
/etc/cron.hourly 每小時定時任務
/etc/cron.monthly 每月定時任務
/etc/cron.weekly 每星期定時任務
/etc/cron.allow 指定那些用戶可以使用crontab
/etc/cron.deny 指定哪些用戶禁止使用crontab,如果文件存在且為空,所有人都可以使用,如果文件不存在,那麼只有root可以使用
/etc/at.allow 指定那些用戶可以使用at
/etc/at.deny 指定哪些用戶禁止使用at,如果文件存在且為空,所有人都可以使用,如果文件不存在,那麼只有root可以使用
/dev目錄 硬體設備信息
/dev/hd[a-z] 第幾個IDE硬碟
/dev/tty[0-9] 第幾個虛擬控制台
/dev/sd[a-z] 第幾個SCSI或SATA硬碟
/dev/zero 一個無窮盡地提 供0(NULL)的設備,可以用來初始化文件
/dev/null 一個空設備,可以向它輸出任何數據,而任何寫入它的輸出都會被拋棄。如果不想讓消息以標准輸出顯示或寫入文件,那麼可以將消息重定向到位桶
/dev/stderr 鏈接文件,指向/proc/self/fd/2(標准錯誤)
/dev/stdin 鏈接文件,指向/proc/self/fd/0(標准輸入)
/dev/stdout 鏈接文件,指向/proc/self/fd/1(標准輸出)
/dev/console 系統控制台,也就是直接和系統連接的監視器。如果你用cat查看該設備,並敲入一些內容,可以看到在屏幕上回顯
/dev/fd[0-9] 第幾個軟碟機設備
/dev/st SCSI磁帶驅動器
/dev/pty 提供遠程登陸偽終端支持。在進行Telnet登錄時就要用到該設備
/dev/ttys 計算機串列介面,對於DOS來說就是com1口
/dev/cua 計算機串列介面,與數據機一起使用的設備
/proc目錄 虛擬文件系統
/proc/apm Advanced Power Management(APM)系統信息,與apm命令相關
/proc/buddyinfo 每個內存區中的每個order有多少塊可用,和內存碎片問題有關
/proc/cmdline 啟動時傳遞給kernel的參數信息
/proc/cpuinfo cpu的信息
/proc/crypto 內核使用的所有已安裝的加密密碼及細節
/proc/devices 已經載入的設備並分類
/proc/dma 已注冊使用的ISA DMA頻道列表
/proc/execdomains Linux內核當前支持的execution domains
/proc/fb 幀緩沖設備列表,包括數量和控制它的驅動
/proc/filesystems 內核當前支持的文件系統類型
/proc/interrupts x86架構中的每個IRQ中斷數
/proc/iomem 每個物理設備當前在系統內存中的映射
/proc/ioports 一個設備的輸入輸出所使用的注冊埠范圍
/proc/kcore 代表系統的物理內存,存儲為核心文件格式,里邊顯示的是位元組數,等於RAM大小加上4kb
/proc/kmsg 記錄內核生成的信息,可以通過/sbin/klogd或/bin/dmesg來處理
/proc/loadavg 根據過去一段時間內CPU和IO的狀態得出的負載狀態,與uptime命令有關
/proc/locks 內核鎖住的文件列表
/proc/mdstat 多硬碟,RAID配置信息(md=multiple disks)
/proc/meminfo RAM使用的相關信息
/proc/misc 其他的主要設備(設備號為10)上注冊的驅動
/proc/moles 所有載入到內核的模塊列表
/proc/mounts 系統中使用的所有掛載
/proc/mtrr 系統使用的Memory Type Range Registers (MTRRs)
/proc/partitions 分區中的塊分配信息
/proc/pci 系統中的PCI設備列表
/proc/slabinfo 系統中所有活動的 slab 緩存信息
/proc/stat 所有的CPU活動信息
/proc/sysrq-trigger 使用echo命令來寫這個文件的時候,遠程root用戶可以執行大多數的系統請求關鍵命令,就好像在本地終端執行一樣。要寫入這個文件,需要把/proc/sys/kernel/sysrq不能設置為0。這個文件對root也是不可讀的
/proc/uptime 系統已經運行了多久
/proc/swaps 交換空間的使用情況
/proc/version Linux內核版本和gcc版本
/proc/bus 系統匯流排(Bus)信息,例如pci/usb等
/proc/driver 驅動信息
/proc/fs 文件系統信息
/proc/ide ide設備信息
/proc/irq 中斷請求設備信息
/proc/net 網卡設備信息
/proc/scsi scsi設備信息
/proc/tty tty設備信息
/proc/net/dev 顯示網路適配器及統計信息
/proc/vmstat 虛擬內存統計信息
/proc/vmcore 內核panic時的內存映像
/proc/diskstats 取得磁碟信息
/proc/schedstat kernel調度器的統計信息
/proc/zoneinfo 顯示內存空間的統計信息,對分析虛擬內存行為很有用
/proc目錄, 進程N的信息
/proc/N pid為N的進程信息
/proc/N/cmdline 進程啟動命令
/proc/N/cwd 鏈接到進程當前工作目錄
/proc/N/environ 進程環境變數列表
/proc/N/exe 鏈接到進程的執行命令文件
/proc/N/fd 包含進程相關的所有的文件描述符
/proc/N/maps 與進程相關的內存映射信息
/proc/N/mem 指代進程持有的內存,不可讀
/proc/N/root 鏈接到進程的根目錄
/proc/N/stat 進程的狀態
/proc/N/statm 進程使用的內存的狀態
/proc/N/status 進程狀態信息,比stat/statm更具可讀性
/proc/self 鏈接到當前正在運行的進程
/var目錄 存放經常變化數據的地方
/var/lib/rpm 存放大多數rpm相關的文件
/var/cache/yum yum升級時下載的rpm文件的臨時存放地,還包括系統中rpm包的頭信息
/var/spool/cron/$username 每個用戶自定義的cron任務,可以使用crontab或vi來操作
/var/lock 一般用來存放文件鎖
/var/log 一般用來存放日誌文件
/var/run 一般用來存放pid文件
/var/crash 一般是存放系統崩潰時產生的信息
/var/cache 一般用來存放緩存信息,例如yum package的緩存
/etc/sysconfig目錄 系統基本配置
/etc/sysconfig/amd 為amd提供操作參數,用來自動mount/unmount文件系統
/etc/sysconfig/apmd 由apmd使用來配置電源設置
/etc/sysconfig/arpwatch 在啟動的時候傳遞給arpwatch守護進程的參數
/etc/sysconfig/authconfig 設置主機使用的驗證方式
/etc/sysconfig/autofs 自動掛載設備的自定義選項
/etc/sysconfig/clock 系統硬體時鍾的設置
/etc/sysconfig/desktop 設置新用戶的桌面和進入運行級別5所使用的顯示管理器
/etc/sysconfig/dhcpd 在啟動的時候傳遞給dhcpd守護進程的參數
/etc/sysconfig/gpm 在啟動的時候傳遞給gpm守護進程的參數
/etc/sysconfig/hwconf 列出kudzu檢測到的所有硬體
/etc/sysconfig/i18n 默認系統語言,系統支持的所有語言,默認系統字體
/etc/sysconfig/init 系統啟動時的顯示方式
/etc/sysconfig/ip6tables-config 在系統啟動或者ip6tables服務啟動時,內核用來設置IPv6包過濾
/etc/sysconfig/iptables-config 在系統啟動或者iptables服務啟動時,內核用來設置包過濾
/etc/sysconfig/keyboard 控制鍵盤的行為
/etc/sysconfig/kudzu 在啟動的時候通過kudzu觸發一次安全的系統硬體探查
/etc/sysconfig/named 在啟動的時候傳遞給named守護進程的參數
/etc/sysconfig/netmp netmp服務的配置文件
/etc/sysconfig/network 網路的配置信息
/etc/sysconfig/ntpd 在啟動的時候傳遞給ntpd守護進程的參數
/etc/sysconfig/radvd 在啟動的時候傳遞給radvd守護進程的參數
/etc/sysconfig/samba 在啟動的時候傳遞給smbd/nmbd守護進程的參數
/etc/sysconfig/selinux selinux的基本控制選項
/etc/sysconfig/spamassassin 在啟動的時候傳遞給spamd守護進程的參數
/etc/sysconfig/squid 在啟動的時候傳遞給squid守護進程的參數
/etc/sysconfig/vncservers 配置vnc服務啟動的方式
/etc/sysconfig/xinetd 在啟動的時候傳遞給xinetd守護進程的參數
/proc/sys目錄 系統重要配置參數,涉及眾多內核參數
/proc/sys/fs/file-max 可以分配的文件句柄的最大數目
/proc/sys/fs/file-nr 已分配文件句柄的數目、已使用文件句柄的數目、文件句柄的最大數目
/proc/sys/fs/inode-* 任何以名稱「inode」開頭的文件所執行的操作與上面那些以名稱「file」開頭的文件所執行的操作一樣,但所執行的操作與索引節點有關,而與文件句柄無關
/proc/sys/fs/overflowuid 和 /proc/sys/fs/overflowgid 這兩個文件分別保存那些支持 16 位用戶標識和組標識的任何文件系統的用戶標識(UID)和組標識(GID)
/proc/sys/fs/super-max 該文件指定超級塊處理程序的最大數目。掛裝的任何文件系統需要使用超級塊,所以如果掛裝了大量文件系統,則可能會用盡超級塊處理程序
/proc/sys/fs/super-nr 顯示當前已分配超級塊的數目
/proc/sys/kernel/acct 該文件有三個可配置值,根據包含日誌的文件系統上可用空間的數量(以百分比表示),這些值控制何時開始進行進程記帳:如果可用空間低於這個百分比值,則停止進程記帳/如果可用空間高於這個百分比值,則開始進程記帳/檢查上面兩個值的頻率(以秒為單位)
/proc/sys/kernel/ctrl-alt-del 該值控制系統在接收到 ctrl+alt+delete 按鍵組合時如何反應
/proc/sys/kernel/domainname 配置網路域名
/proc/sys/kernel/hostname 主機名
/proc/sys/kernel/msgmax 指定了從一個進程發送到另一個進程的消息的最大長度
/proc/sys/kernel/msgmnb 指定在一個消息隊列中最大的位元組數
/proc/sys/kernel/msgmni 指定消息隊列標識的最大數目
/proc/sys/kernel/panic 如果發生「內核嚴重錯誤(kernel panic)」,內核在重新引導之前等待的時間
/proc/sys/kernel/printk 該文件有四個數字值,它們根據日誌記錄消息的重要性,定義將其發送到何處
/proc/sys/kernel/shmall 在任何給定時刻系統上可以使用的共享內存的總量(以位元組為單位)
/proc/sys/kernel/shmax 內核所允許的最大共享內存段的大小(以位元組為單位)
/proc/sys/kernel/shmmni 用於整個系統共享內存段的最大數目
/proc/sys/kernel/sysrq 如果該文件指定的值為非零,則激活 System Request Key
/proc/sys/kernel/threads-max 內核所能使用的線程的最大數目
/proc/sys/net/core/message_burst 寫新的警告消息所需的時間(以 1/10 秒為單位);在這個時間內所接收到的其它警告消息會被丟棄。這用於防止某些企圖用消息「淹沒」您系統的人所使用的拒絕服務攻擊
/proc/sys/net/core/message_cost 存有與每個警告消息相關的成本值。該值越大,越有可能忽略警告消息
/proc/sys/net/core/netdev_max_backlog 在介面接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目
/proc/sys/net/core/optmem_max 每個套接字所允許的最大緩沖區的大小
/proc/sys/net/core/rmem_default 接收套接字緩沖區大小的預設值(以位元組為單位)
/proc/sys/net/core/rmem_max 接收套接字緩沖區大小的最大值(以位元組為單位)。
/proc/sys/net/core/wmem_default 發送套接字緩沖區大小的預設值(以位元組為單位)。
/proc/sys/net/core/wmem_max 發送套接字緩沖區大小的最大值(以位元組為單位)
/proc/sys/net/ipv4/ip_forward ip轉發是否生效
/proc/sys/net/ipv4/tcp_retrans_collapse 控制TCP雙方窗口協商出現錯誤的時候的一些重傳的行為。但是在老的2.6的核 (<2.6.18)里頭,這個重傳會導致kernel oops,kernel panic,所以如果出現有 tcp_retrans_*樣子的kernel panic,可以把這個參數給設置成0
/proc/sys/vm/buffermem 控制用於緩沖區內存的整個系統內存的數量(以百分比表示)。它有三個值,通過把用空格相隔的一串數字寫入該文件來設置這三個值。用於緩沖區的內存的最低百分比/如果發生所剩系統內存不多,而且系統內存正在減少這種情況,系統將試圖維護緩沖區內存的數量/用於緩沖區的內存的最高百分比
/proc/sys/vm/freepages 控制系統如何應對各種級別的可用內存。它有三個值,通過把用空格相隔的一串數字寫入該文件來設置這三個值。如果系統中可用頁面的數目達到了最低限制,則只允許內核分配一些內存/如果系統中可用頁面的數目低於這一限制,則內核將以較積極的方式啟動交換,以釋放內存,從而維持系統性能/內核將試圖保持這個數量的系統內存可用。低於這個值將啟動內核交換
/proc/sys/vm/kswapd 控制允許內核如何交換內存。它有三個值,通過把用空格相隔的一串數字寫入該文件來設置這三個值:內核試圖一次釋放的最大頁面數目。如果想增加內存交換過程中的帶寬,則需要增加該值/內核在每次交換中試圖釋放頁面的最少次數/內核在一次交換中所寫頁面的數目。這對系統性能影響最大。這個值越大,交換的數據越多,花在磁碟尋道上的時間越少。然而,這個值太大會因「淹沒」請求隊列而反過來影響系統性能
/proc/sys/vm/pagecache 該文件與/proc/sys/vm/buffermem 的工作內容一樣,但它是針對文件的內存映射和一般高速緩存
/proc/sys/vm/dirty_background_ratio 記錄當所有被更改頁面總大小占工作內存超過某個限制時,pdflush 會開始寫回工作,默認是10%
/proc/sys/vm/dirty_ratio 控制文件系統的文件系統寫緩沖區的大小,單位是百分比,表示系統內存的百分比,表示當寫緩沖使用到系統內存多少的時候,開始向磁碟寫出數據。默認是40%
/proc/sys/vm/dirty_writeback_centisecs 記錄pdflush進程把page cache里邊的內容寫入磁碟的時間周期,默認是5秒
/proc/sys/vm/dirty_expire_centisecs 控制一個更改過的頁面經過多長時間後被認為是過期的、必須被寫回的頁面,默認是30秒
/proc/sys/vm/laptop_mode 是否使用筆記本模式,在kernel2.6之後支持
Ⅲ linux操作系統有什麼技術特色
一、 Linux的誕生
Linux的興起可以說是Internet創造的一個奇跡。 1991年初,當年輕的芬蘭大學生Linus Torvalds在開始其Linux 操作系統的設計時,他的目的只不過是想看一看Intel 386存儲 管理硬體是怎樣工作的,而絕對沒有想到這一舉動會在計算機界 產生如此重大的影響。他的設計進展得很順利,只花了幾個月時 間就在一台Intel 386微機上完成了一個類似於Unix 的操作系統, 這就是最早的Linux版本。1991年底,Linus Torvalds首次在Internet 上發布了基於Intel 386體系結構的Linux源代碼,從此以後,奇跡開始 發生了。由於Linux具有結構清晰、功能簡捷等特點,許多大專院校的學 生和科研機構的研究人員紛紛把它作為學 習和研究的對象。他們在更正原 有Linux版本中錯誤的同時,也不斷地為Linux增加新的功能。在眾多熱心者的 努力下,Linux逐漸成為一個穩定可靠、功能完善的操作系統。一些軟體公司, 如Red Hat、InfoMagic等也不失時機地推出了自己的以Linux為核心的操作系統 版本,這大大推動了Linux的商品化。在一些大的計算機公司的支持下,Linux還 被移植到以Alpha APX、PowerPC、Mips及Sparc等為處理機的系統上。Linux的使 用日益廣泛,其影響力直逼Unix。
Linux的成功得益於如下因素:
(1) 具有良好的開放性。Linux及其生成工具的源代碼均可通過Internet免費獲取,linux愛 好者能非常 容易地建立一個Linux開發平台。
(2) Internet的普及使熱心於Linux的開發者們能進行高效、快捷的交流,從而為Linux 創造了一個優良的分布式開發環境。
(3) Linux具有很強的適應性,能適應各種不同的硬體平台。
Linux的版本更新很快。在短短的七年時間里,其版本已升至2.1.x。這里之所以用"x"表示,是因為 x的值變化太快,很難准確地定位它的值。這也從側面反映了從事Linux的研究者之多。不過,Linux用得最 多的版本還是2.0.30,許多商品化的操作系統都以它為核心。
二、 Linux的主要特點
作為一個操作系統,Linux幾乎滿足當今Unix操作系統的所有要求,因此,它具有Unix操作系統的基本 特徵。
1.符合POSIX 1003.1標准
POSIX 1003.1標準定義了一個最小的Unix操作系統介面,任何操作系統只有符合這一標准,才有可能運 行Unix程序。考慮到Unix具有豐富的應用程序,當今絕大多數操作系統都把滿足POSIX 1003.1標准作為實現 目標,Linux也不例外,它完全支持POSIX 1003.1標准。另外,為了使Unix System V和BSD上的程序能直接在 Linux上運行, Linux還增加了部分System V和BSD的系統介面,使Linux成為一個完善的Unix程序開發系統。
2.支持多用戶訪問和多任務編程
Linux是一個多用戶操作系統,它允許多個用戶同時訪問系統而不會造成用戶之間的相互干擾。另外, Linux還支持真正的多用戶編程,一個用戶可以創建多個進程,並使各個進程協同工作來完成用戶的需求.
3.採用頁式存儲管理
頁式存儲管理使Linux能更有效地利用物理存儲空間,頁面的換入換出為用戶提供了更大的存儲空間。
4.支持動態鏈接
用戶程序的執行往往離不開標准庫的支持,一般的系統往往採用靜態鏈接方式,即在裝配階段就已將 用戶程序和標准庫鏈接好,這樣,當多個進程運行時,可能會出現庫代碼在內存中有多個副本而浪費存儲 空間的情況。Linux 支持動態鏈接方式,當運行時才進行庫鏈接,如果所需要的庫已被其它進程裝入內存, 則不必再裝入,否則才從硬碟中將庫調入。這樣能保證內存中的庫程序代碼是唯一的。
5.支持多種文件系統
Linux能支持多種文件系統。目前支持的文件系統有:EXT2、EXT、XIAFS、ISOFS、HPFS、MSDOS、UMSDOS、 PROC、NFS、SYSV、MINIX、SMB、UFS、NCP、VFAT、AFFS。Linux最常用的文件系統是EXT2,它的文件名長度可 達255字元,並且還有許多特有的功能,使它比常規的Unix文件系統更加安全。
6.支持TCP/IP、SLIP和PPP
在Linux中,用戶可以使用所有的網路服務,如網路文件系統、遠程登錄等。SLIP和PPP能支持串列線上的 TCP/IP協議的使用,這意味著用戶可用一個高速Modem通過電話線連入Internet網中。
除了上述基本特徵外,Linux還具有其獨有的特色:
支持硬碟的動態Cache 這一功能與MSDOS中的Smartdrive相似。所不同的是,Linux能動態調整所用的 Cache存儲器的大小,以適合當前存儲器的使用情況,當某一時刻沒有更多的存儲空間可用時,Cache將被減少, 以增加空閑的存儲空間,一旦存儲空間不再緊張,Cache的大小又將增加。
支持不同格式的可執行文件 Linux具有多種模擬器,這使它能運行不同格式的目標文件。其中,DOS和 MSWindows正在開發之中,iBCS2模擬器能運行SCO Unix的目標程序。(iBCS2 模擬器不是Linux標准核心的 一部分,但可從ftp.informatik.huberlin.de:/pub/os/linux下載)
三、 Linux的主要構成
Linux主要由存儲管理、進程管理、文件系統、進程間通信等幾部分組成,在許多演算法及實現策略上, Linux借鑒了Unix的成功經驗,但也不乏自己的特色。
1.存儲管理
Linux採用頁式存儲管理機制,每個頁面的大小隨處理機晶元而異。例如,Intel 386處理機頁面大小 可為4KB和2MB兩種,而Alpha處理機頁面大小可為8KB、16KB、32KB和64KB。頁面大小的選擇對地址變換算 法和頁表結構會有一定的影響,如Alpha的虛地址和物理地址的有效長度隨頁面尺寸的變化而變化,這種變 化必將在地址變換和頁表項中有所反映。
在Linux中,每一個進程都有一個比實際物理空間大得多的進程虛擬空間,為了建立虛擬空間和物理空 間之間的映射,每個進程還保留一張頁表,用於將本進程空間中的虛地址變換成物理地址。頁表還對物理頁 的訪問許可權作出了規定,定義了哪些頁可讀寫,哪些頁是只讀頁,在進行虛實變換時,Linux將根據頁表中規 定的訪問許可權來判定進程對物理地址的訪問是否合法,從而達到存儲保護的目的。
Linux存儲空間分配遵循的是不到有實際需要的時候決不分配物理空間的原則。當一個程序載入執行時, Linux只為它分配了虛空間,只有訪問某一虛地址而發生了缺頁中斷時,才為它分配物理空間,這樣就可能 出現某些程序運行完成後,其中的一些頁從來就沒有裝進過內存。這種存儲分配策略帶來的好處是顯而易見的,因為它最大限度地利用了物理存儲器。
盡管Linux對物理存儲器資源的使用十分謹慎,但還是經常出現物理存儲器資源短缺的情況。Linux有一 個名為kswapd的進程專門負責頁面的換出,當系統中的空閑頁面小於一定的數目時,kswapd將按照一定的淘 汰演算法選出某些頁面,或者直接丟棄(頁面未作修改),或者將其寫回硬碟(頁面已被修改)。這種換出方式不 同於較舊版本Unix的換出方式,它是將一個進程的所有頁全部寫回硬碟。相比之下,Linux的效率更高。
2.進程管理
在Linux中,進程是資源分配的基本單位,所有資源都是以進程為對象來進行分配的。 在一個進程的生 命期內,它會用到許多系統資源,會用CPU運行其指令,用存儲器存儲其指令和數據,它也會打開和使用文件 系統中的文件,直接或間接用到系統中的物理設備,因此,Linux設計了一系列的數據結構,它們能准確地描 述進程的狀態和其資源使用情況,以便能公平有效地使用系統資源。Linux的調度演算法能確保不出現某些進程 過度佔用系統資源而導致另一些進程無休止地等待的情況。
進程的創建是一個十分復雜的過程,通常的做法需為子進程重新分配物理空間,並把父進程空間的內容全 盤復制到子進程空間中,其開銷非常大。為了降低進程創建的開銷,Linux採用了Copyonwrite技術,即不 拷貝父進程的空間,而是拷貝父進程的頁表,使父進程和子進程共享物理空間,並將這個共享空間的訪問許可權 置為只讀。當父進程和子進程的某一方進行寫操作時,Linux檢測到一個非法操作,這時才將要寫的頁進行復制 。這一做法免除了只讀頁的復制,從而降低了開銷。
Linux目前尚未提供用戶級線程,但提供了核心級線程,核心線程的創建是在進程創建的基礎上稍做修改, 使創建的子進程與父進程共享虛存空間。從這一意義上講,核心線程更像一個共享進程組。
3.文件系統
Linux最重要的特徵之一就是支持多個不同的文件系統,前面我們已經看到,Linux目前支持的文件系統 多達十餘種,隨著時間的推移,這一數目還在不斷增加。在Linux中,一個分離的文件系統不是通過設備標識 (如驅動器號或驅動器名)來訪問,而是 把它合到一個單一的目錄樹結構中,通過目錄來訪問,這一點與Unix十分相似。Linux用 安裝命令將一個新的文件系統安裝到系統單一目錄樹的某一目錄下,一旦安裝成功,該目錄下的所有內容將 被新安裝的文件系統所覆蓋,當文件系統被卸下後,安裝目錄下的文件將會被重新恢復。
Linux最初的文件系統是Minix。該文件系統對文件限制過多,並且性能低下,如文件名長度不能超過14 個字元、文件大小不能超過64MB。為了解決這些問題,Linux的開發者們設計了一個Linux專用的文件系統EXT。 EXT對文件的要求放鬆了許多,但在性能上並沒有大的改觀,於是就有了後面的EXT2文件系統。EXT2文件系統 是一個非常成功的文件系統,它無論是對文件的限制還是在性能方面都大大優於EXT文件系統,所以,EXT2自 從推出就一直是Linux最常用的文件系統。
為了支持多種文件系統,Linux用一個被稱為虛擬文件系統(VFS)的介面層將真正的文件系統同操作系統及 系統服務分離開。VFS掩蓋了不同文件系統之間的差異,使所有文件系統在操作系統和用戶程序看來都是等同的。VFS允許用戶同時透明地安裝多個不同的文件系統。
4.進程間通信
Linux提供了多種進程間的通信機制,其中,信號和管道是最基本的兩種。除此以外,Linux也提供 System V的進程間通信機制,包括消息隊列、信號燈及共享內存。為了支持不同機器之間的進程通信, Linux還引入了BSD的Socket機制。
四、 Linux的不足及發展趨勢
Linux從出現到現今只經歷了短短七年的時間,但其發展速度是驚人的,這與它的開放性和優良的性能 是密不可分的。不過我們應該看到,作為一個由學生開發的系統,Linux還有許多先天不足,它的設計思想 過多地受到傳統操作系統的約束,沒有體現出當今操作系統的發展潮流,具體表現在以下幾個方面:
不是一個微內核操作系統;
是一個分布式操作系統;
不是一個安全的操作系統;
沒有用戶線程;
不支持實時處理;
代碼是用C而不是C++這樣的現代程序設計語言編寫的。
盡管Linux有這樣和那樣的不足,但其發展潛力不容低估,其發展的動力就是遍布全球、為數眾多的 Linux熱心者。今後Linux將會朝著完善功能、提高效率的方向發展,包括允許用戶創建線程、增加實時處 理功能、開發適合多處理機體系結構的版本。我們相信,Linux、Unix及NT三足鼎立的時代將為期不遠。
Ⅳ Android系統內存管理
部分內容出至林學森的Android內核設計思想。
Android官網內存管理
部分出至 https://www.jianshu.com/p/94d1cd553c44
Android本質是Linux所以先從Linux說起。
Linux的內存管理為系統中所有的task提供可靠的內存分配、釋放和保護機制。
核心:
虛擬內存
內存分配與釋放
內存保護
將外存儲器的部分空間作為內存的擴展,如從硬碟劃出4GB大小。
當內存資源不足時,系統按照一定演算法自動條形優先順序低的數據塊,並把他們存儲到硬碟中。
後續如果需要用到硬碟中的這些數據塊,系統將產生「缺頁」指令,然後把他們交換回內存中。
這些都是由操作系統內核自動完成的,對上層應用」完全透明「。
每個進程的邏輯地址和物理地址都不是直接對應的,任何進程都沒辦法訪問到它管轄范圍外的內存空間——即刻意產生的內存越界與非法訪問,操作系統也會馬上阻止並強行關閉程序,從而有力的保障應用程序和操作系統的安全和穩定。
一旦發現系統的可用內存達到臨界值,機會按照優先順序順序,匆匆低到高逐步殺掉進程,回收內存。
存儲位置:/proc/<PID>/oom_score
優先順序策略:
進程消耗的內存
進程佔用的CPU時間
oom_adj(OOM權重)
Android平台運行的前提是可用內存是浪費的內存。它試圖在任何時候使用所有可用的內存。例如,系統會在APP關閉後將其保存在內存中,以便用戶可以快速切換回它們。出於這個原因,Android設備通常運行時只有很少的空閑內存。在重要系統進程和許多用戶應用程序之間正確分配內存內對存管理是至關重要。
Android有兩種主要的機制來處理低內存的情況:內核交換守護進程(kernel swap daemon)和低內存殺手(low-memory killer)。
當用戶在APP之間切換時,Android會在最近使用的(LRU)緩存中保留不在前台的APP,即用戶看不到的APP,或運行類似音樂播放的前台服務。如果用戶稍後返回APP,系統將重用該進程,從而使APP切換更快。
如果你的APP有一個緩存進程,並且它保留了當前不需要的內存,那麼即使用戶不使用它,你的APP也會影響系統的整體性能。由於系統內存不足,它會從最近使用最少的進程開始殺死LRU緩存中的進程。該系統還負責處理佔用最多內存的進程,並可以終止這些進程以釋放RAM。
當系統開始終止LRU緩存中的進程時,它主要是自底向上工作的。系統還考慮哪些進程消耗更多的內存,從而在終止時為系統提供更多的內存增益。你在LRU列表中消耗的內存越少,你就越有可能留在列表中並能夠快速恢復。
為了滿足RAM的所有需求,Android嘗試共享RAM來跨進程通信。它可以做到以下方式:
Android設備包含三種不同類型的內存:RAM、zRAM和storage。
注意:CPU和GPU都訪問同一個RAM。
內存被拆分成頁。通常每頁有4KB的內存。
頁面被認為是空閑的或已使用的。
空閑頁是未使用的RAM。
已使用頁是系統正在積極使用的RAM,分為以下類別:
干凈的頁面(Clean pages)包含一個文件(或文件的一部分)的一份精確副本存在存儲器上。當一個干凈的頁面不再包含一個精確的文件副本(例如,來自應用程序操作的結果)時,它就變成了臟頁。可以刪除干凈的頁,因為它們始終可以使用存儲中的數據重新生成;不能刪除臟頁(Dirty pages),否則數據將丟失。
內核跟蹤系統中的所有內存頁。
當確定一個應用程序正在使用多少內存時,系統必須考慮shared pages。APP訪問相同的服務或庫將可能共享內存頁。例如,Google Play Services 和一個游戲APP可能共享一個位置服務。這使得很難確定有多少內存屬於這個服務相對於每個APP。
當操作系統想要知道所有進程使用了多少內存時,PSS非常有用,因為頁面不會被多次計數。PSS需要很長時間來計算,因為系統需要確定哪些頁面是共享的,以及被有多少進程。RSS不區分共享頁面和非共享頁面(使計算速度更快),更適合於跟蹤內存分配的更改。
內核交換守護進程(kswapd)是Linux內核的一部分,它將使用過的內存轉換為空閑內存。當設備上的空閑內存不足時,守護進程將變為活動狀態。Linux內核保持低和高的可用內存閾值。當空閑內存低於低閾值時,kswapd開始回收內存。當空閑內存達到高閾值,kswapd將停止回收內存。
kswapd可以通過刪除干凈的頁面來回收干凈的頁面,因為它們有存儲器支持並且沒有被修改。如果進程試圖定址已刪除的干凈頁,則系統會將該頁從存儲器復制到RAM。此操作稱為請求分頁。
kswapd將緩存的私有臟頁(private dirty pages)和匿名臟頁(anonymous dirty pages)移動到zRAM進行壓縮。這樣做可以釋放RAM中的可用內存(空閑頁)。如果進程試圖觸摸zRAM中臟頁,則該頁將被解壓縮並移回RAM。如果與壓縮頁關聯的進程被終止,則該頁將從zRAM中刪除。
如果可用內存量低於某個閾值,系統將開始終止進程。
lmkd實現源碼要在system/core/lmkd/lmkd.c。
lmkd會創建名為lmkd的socket,節點位於/dev/socket/lmkd,該socket用於跟上層framework交互。
小結:
LMK_TARGET: AMS.updateConfiguration() 的過程中調用 updateOomLevels() 方法, 分別向/sys/mole/lowmemorykiller/parameters目錄下的minfree和adj節點寫入相應信息;
LMK_PROCPRIO: AMS.applyOomAdjLocked() 的過程中調用 setOomAdj() 向/proc/<pid>/oom_score_adj寫入oom_score_adj後直接返回;
LMK_PROCREMOVE: AMS.handleAppDiedLocked 或者 AMS.() 的過程,調用remove(),目前不做任何事,直接返回;
為了進一步幫助平衡系統內存並避免終止APP進程,可以Activity類中實現ComponentCallbacks2介面。提供的onTrimMemory()回調方法允許APP在前台或後台偵聽與內存相關的事件,然後釋放對象以響應應用程序生命周期或表明系統需要回收內存的系統事件。
onTrimMemory()回調是在Android 4.0(API級別14)中添加的。
對於早期版本,可以使用onLowMemory(),它大致相當於TRIM_MEMORY_COMPLETE事件。
一個專門的驅動。(Linux Kernel 4.12 已移除交給kswapd處理)。
很多時候,kswapd無法為系統釋放足夠的內存。在這種情況下,系統使用onTrimMemory()通知APP內存不足,應該減少其分配。如果這還不夠,內核將開始終止進程以釋放內存,它使用低內存殺手(LMK)來完成這個任務。
為了決定要終止哪個進程,LMK使用一個名為oom_adj_score的「out of memory」分數來確定運行進程的優先順序,高分的進程首先被終止。
後台應用程序首先被終止,系統進程最後被終止。
下表列出了從高到低的LMK評分類別。第一排得分最高的項目將首先被殺死:
Android Runtime(ART)和Dalvik虛擬機使用分頁(Paging)和內存映射(mmapping)來管理內存。應用程序通過分配新對象或觸摸已映射頁面來修改內存都將保留在RAM中,並且不能被調出。應用程序釋放內存的唯一方式是垃圾收集器。
Ⅳ 怎樣分析linux的性能指標
一、處理器參數
這是一個很簡單的參數,它直觀的描述了每個CPU的利用率。在xSeries架構中,如果CPU的利用率長時間的超過80%,就可能是出現了處理器的瓶頸。
Runable processes
這個值描述了正在准備被執行的進程,在一個持續時間里這個值不應該超過物理CPU數量的10倍,否則CPU方面就可能存在瓶頸。
Blocked
描述了那些因為等待I/O操作結束而不能被執行的進程,Blocked可能指出你正面臨I/O瓶頸。
User time
描述了處理用戶進程的百分比,包括nice time。如果User time的值很高,說明系統性能用在處理實際的工作。
System time
描述了CPU花費在處理內核操作包括IRQ和軟體中斷上面的百分比。如果system time很高說明系統可能存在網路或者驅動堆棧方面的瓶頸。一個系統通常只花費很少的時間去處理內核的操作。
Idle time
描述了CPU空閑的百分比。
Nice time
描述了CPU花費在處理re-nicing進程的百分比。
Context switch
系統中線程之間進行交換的數量。
Waiting
CPU花費在等待I/O操作上的總時間,與blocked相似,一個系統不應該花費太多的時間在等待I/O操作上,否則你應該進一步檢測I/O子系統是否存在瓶頸。
Interrupts
Interrupts值包括硬Interrupts和軟Interrupts,硬Interrupts會對系統性能帶
來更多的不利影響。高的Interrupts值指出系統可能存在一個軟體的瓶頸,可能是內核或者驅動程序。注意Interrupts值中包括CPU時鍾導
致的中斷(現代的xServer系統每秒1000個Interrupts值)。
二、內存參數
Free memory
相比其他操作系統,Linux空閑內存的值不應該做為一個性能參考的重要指標,因為就像我們之前提到過的,Linux內核會分配大量沒有被使用的內存作為文件系統的緩存,所以這個值通常都比較小。
Swap usage
這個值描述了已經被使用的swap空間。Swap
usage只表示了Linux管理內存的有效性。對識別內存瓶頸來說,Swap In/Out才是一個比較又意義的依據,如果Swap
In/Out的值長期保持在每秒200到300個頁面通常就表示系統可能存在內存的瓶頸。
Buffer and cache
這個值描述了為文件系統和塊設備分配的緩存。注意在Red Hat Enterprise Linux
3和更早一些的版本中,大部分空閑內存會被分配作為緩存使用。在Red Hat Enterprise Linux
4以後的版本中,你可以通過修改/proc/sys/vm中的page_cache_tuning來調整空閑內存中作為緩存的數量。
Slabs
描述了內核使用的內存空間,注意內核的頁面是不能被交換到磁碟上的。
Active versus inactive memory
提供了關於系統內存的active內存信息,Inactive內存是被kswapd守護進程交換到磁碟上的空間。
三、網路參數
Packets received and sent
這個參數表示了一個指定網卡接收和發送的數據包的數量。
Bytes received and sent
這個參數表示了一個指定網卡接收和發送的數據包的位元組數。
Collisions per second
這個值提供了發生在指定網卡上的網路沖突的數量。持續的出現這個值代表在網路架構上出現了瓶頸,而不是在伺服器端出現的問題。在正常配置的網路中沖突是非常少見的,除非用戶的網路環境都是由hub組成。
Packets dropped
這個值表示了被內核丟掉的數據包數量,可能是因為防火牆或者是網路緩存的缺乏。
Overruns
Overruns表達了超出網路介面緩存的次數,這個參數應該和packets dropped值聯繫到一起來判斷是否存在在網路緩存或者網路隊列過長方面的瓶頸。
Errors
這個值記錄了標志為失敗的幀的數量。這個可能由錯誤的網路配置或者部分網線損壞導致,在銅口千兆乙太網環境中部分網線的損害是影響性能的一個重要因素。
四、塊設備參數
Iowait
CPU等待I/O操作所花費的時間。這個值持續很高通常可能是I/O瓶頸所導致的。
Average queue length
I/O請求的數量,通常一個磁碟隊列值為2到3為最佳情況,更高的值說明系統可能存在I/O瓶頸。
Average wait
響應一個I/O操作的平均時間。Average wait包括實際I/O操作的時間和在I/O隊列里等待的時間。
Transfers per second
描述每秒執行多少次I/O操作(包括讀和寫)。Transfers per second的值與kBytes per second結合起來可以幫助你估計系統的平均傳輸塊大小,這個傳輸塊大小通常和磁碟子系統的條帶化大小相符合可以獲得最好的性能。
Blocks read/write per second
這個值表達了每秒讀寫的blocks數量,在2.6內核中blocks是1024bytes,在早些的內核版本中blocks可以是不同的大小,從512bytes到4kb。
Kilobytes per second read/write
按照kb為單位表示讀寫塊設備的實際數據的數量。
Ⅵ 關於linux的問題
我暈……這個東西不好說……網上好多資料的啊!!!
1.linux系統有什麼特點???
————Linux的發行版就是將Linux核心與應用軟體做一個打包。較知名的有:SlackWare、RedHat、Den、Mandrake、SuSE、Xlinux、TurboLinux、BluePoint、RedFlag、Xterm等。
RedHat Linux是最成熟的一種Linux發行版,其無論在銷售還是裝機量上都是市場上的老大。在中國老一輩Linux愛好者中幾乎都是RedHat的使用者。市場上有大量的文章是針對RedHat來說的。
RedHat Linux朴實、簡潔、穩定,是作為商業應用、鑽研Linux的好平台。
TurboLinux是一家美國公司建立的發行版,早期其致力於Linux的國際化工作,它的中文版,是最早的成熟中文Linux發行版。TurboLinux注重面向具體應用,開發出針對不同應用的發行版,在國際影響力方面越來越大,是RedHat的一個主要競爭對手。
BludePoint Linux是由Devin、Samuel、hahalee三個中國內核黑客通過互聯網聯手合作的傑作,在互聯網上深受中國Linux愛好者的好評。它最主要的特點是:內核級的漢化,有許多自己的東西。
Xterm是由北京沖浪公司製作的Linux發行版,可以算得上中國最早的Linux發行版。它的最大特點是:用戶界面好,進入門檻低,適合初學Linux人試用。
RedFlag是由中科院、北大方正、康柏公司聯合開發,是基於RedHat Linux改進的中文版。它的特點是:開發力量強大,比較權威,可以一試。
相對來說,SlackWare、RedHat、Den這三種發行版比較適合一些有一定基礎,或很強調性能、穩定性的人。筆者強烈推薦使用RedHat。
TurboLinux、BluePoint、RedFlag、Mandrake則在用戶界面比前三種更友好,穩定性適中,其中Turbo、BulePoint、RedFlag還內置了中文支持,應該是剛從Windows轉到Linux中的人的最好選擇。
而象Xterm、聯想Happy等這些的用戶界面更加優秀,內置的中文支持,捆綁了更多游戲、辦公軟體,比較適合Linux的嘗試者或初學者使用。
2.學習起來容易嗎???學習了linux以後出去工作有用嗎???linux以後在中國發展空間大嗎???發展趨勢如何???
一、 Linux的誕生
Linux的興起可以說是Internet創造的一個奇跡。 1991年初,當年輕的芬蘭大學生Linus Torvalds在開始其Linux 操作系統的設計時,他的目的只不過是想看一看Intel 386存儲 管理硬體是怎樣工作的,而絕對沒有想到這一舉動會在計算機界 產生如此重大的影響。他的設計進展得很順利,只花了幾個月時 間就在一台Intel 386微機上完成了一個類似於Unix 的操作系統, 這就是最早的Linux版本。1991年底,Linus Torvalds首次在Internet 上發布了基於Intel 386體系結構的Linux源代碼,從此以後,奇跡開始 發生了。由於Linux具有結構清晰、功能簡捷等特點,許多大專院校的學 生和科研機構的研究人員紛紛把它作為學 習和研究的對象。他們在更正原 有Linux版本中錯誤的同時,也不斷地為Linux增加新的功能。在眾多熱心者的 努力下,Linux逐漸成為一個穩定可靠、功能完善的操作系統。一些軟體公司, 如Red Hat、InfoMagic等也不失時機地推出了自己的以Linux為核心的操作系統 版本,這大大推動了Linux的商品化。在一些大的計算機公司的支持下,Linux還 被移植到以Alpha APX、PowerPC、Mips及Sparc等為處理機的系統上。Linux的使 用日益廣泛,其影響力直逼Unix。
Linux的成功得益於如下因素:
(1) 具有良好的開放性。Linux及其生成工具的源代碼均可通過Internet免費獲取,linux愛 好者能非常 容易地建立一個Linux開發平台。
(2) Internet的普及使熱心於Linux的開發者們能進行高效、快捷的交流,從而為Linux 創造了一個優良的分布式開發環境。
(3) Linux具有很強的適應性,能適應各種不同的硬體平台。
Linux的版本更新很快。在短短的七年時間里,其版本已升至2.1.x。這里之所以用"x"表示,是因為 x的值變化太快,很難准確地定位它的值。這也從側面反映了從事Linux的研究者之多。不過,Linux用得最 多的版本還是2.0.30,許多商品化的操作系統都以它為核心。
二、 Linux的主要特點
作為一個操作系統,Linux幾乎滿足當今Unix操作系統的所有要求,因此,它具有Unix操作系統的基本 特徵。
1.符合POSIX 1003.1標准
POSIX 1003.1標準定義了一個最小的Unix操作系統介面,任何操作系統只有符合這一標准,才有可能運 行Unix程序。考慮到Unix具有豐富的應用程序,當今絕大多數操作系統都把滿足POSIX 1003.1標准作為實現 目標,Linux也不例外,它完全支持POSIX 1003.1標准。另外,為了使Unix System V和BSD上的程序能直接在 Linux上運行, Linux還增加了部分System V和BSD的系統介面,使Linux成為一個完善的Unix程序開發系統。
2.支持多用戶訪問和多任務編程
Linux是一個多用戶操作系統,它允許多個用戶同時訪問系統而不會造成用戶之間的相互干擾。另外, Linux還支持真正的多用戶編程,一個用戶可以創建多個進程,並使各個進程協同工作來完成用戶的需求.
3.採用頁式存儲管理
頁式存儲管理使Linux能更有效地利用物理存儲空間,頁面的換入換出為用戶提供了更大的存儲空間。
4.支持動態鏈接
用戶程序的執行往往離不開標准庫的支持,一般的系統往往採用靜態鏈接方式,即在裝配階段就已將 用戶程序和標准庫鏈接好,這樣,當多個進程運行時,可能會出現庫代碼在內存中有多個副本而浪費存儲 空間的情況。Linux 支持動態鏈接方式,當運行時才進行庫鏈接,如果所需要的庫已被其它進程裝入內存, 則不必再裝入,否則才從硬碟中將庫調入。這樣能保證內存中的庫程序代碼是唯一的。
5.支持多種文件系統
Linux能支持多種文件系統。目前支持的文件系統有:EXT2、EXT、XIAFS、ISOFS、HPFS、MSDOS、UMSDOS、 PROC、NFS、SYSV、MINIX、SMB、UFS、NCP、VFAT、AFFS。Linux最常用的文件系統是EXT2,它的文件名長度可 達255字元,並且還有許多特有的功能,使它比常規的Unix文件系統更加安全。
6.支持TCP/IP、SLIP和PPP
在Linux中,用戶可以使用所有的網路服務,如網路文件系統、遠程登錄等。SLIP和PPP能支持串列線上的 TCP/IP協議的使用,這意味著用戶可用一個高速Modem通過電話線連入Internet網中。
除了上述基本特徵外,Linux還具有其獨有的特色:
支持硬碟的動態Cache 這一功能與MS�DOS中的Smartdrive相似。所不同的是,Linux能動態調整所用的 Cache存儲器的大小,以適合當前存儲器的使用情況,當某一時刻沒有更多的存儲空間可用時,Cache將被減少, 以增加空閑的存儲空間,一旦存儲空間不再緊張,Cache的大小又將增加。
支持不同格式的可執行文件 Linux具有多種模擬器,這使它能運行不同格式的目標文件。其中,DOS和 MS�Windows正在開發之中,iBCS2模擬器能運行SCO Unix的目標程序。(iBCS2 模擬器不是Linux標准核心的 一部分,但可從ftp.informatik.hu�berlin.de:/pub/os/linux下載)
三、 Linux的主要構成
Linux主要由存儲管理、進程管理、文件系統、進程間通信等幾部分組成,在許多演算法及實現策略上, Linux借鑒了Unix的成功經驗,但也不乏自己的特色。
1.存儲管理
Linux採用頁式存儲管理機制,每個頁面的大小隨處理機晶元而異。例如,Intel 386處理機頁面大小 可為4KB和2MB兩種,而Alpha處理機頁面大小可為8KB、16KB、32KB和64KB。頁面大小的選擇對地址變換算 法和頁表結構會有一定的影響,如Alpha的虛地址和物理地址的有效長度隨頁面尺寸的變化而變化,這種變 化必將在地址變換和頁表項中有所反映。
在Linux中,每一個進程都有一個比實際物理空間大得多的進程虛擬空間,為了建立虛擬空間和物理空 間之間的映射,每個進程還保留一張頁表,用於將本進程空間中的虛地址變換成物理地址。頁表還對物理頁 的訪問許可權作出了規定,定義了哪些頁可讀寫,哪些頁是只讀頁,在進行虛實變換時,Linux將根據頁表中規 定的訪問許可權來判定進程對物理地址的訪問是否合法,從而達到存儲保護的目的。
Linux存儲空間分配遵循的是不到有實際需要的時候決不分配物理空間的原則。當一個程序載入執行時, Linux只為它分配了虛空間,只有訪問某一虛地址而發生了缺頁中斷時,才為它分配物理空間,這樣就可能 出現某些程序運行完成後,其中的一些頁從來就沒有裝進過內存。這種存儲分配策略帶來的好處是顯而易見的,因為它最大限度地利用了物理存儲器。
盡管Linux對物理存儲器資源的使用十分謹慎,但還是經常出現物理存儲器資源短缺的情況。Linux有一 個名為kswapd的進程專門負責頁面的換出,當系統中的空閑頁面小於一定的數目時,kswapd將按照一定的淘 汰演算法選出某些頁面,或者直接丟棄(頁面未作修改),或者將其寫回硬碟(頁面已被修改)。這種換出方式不 同於較舊版本Unix的換出方式,它是將一個進程的所有頁全部寫回硬碟。相比之下,Linux的效率更高。
2.進程管理
在Linux中,進程是資源分配的基本單位,所有資源都是以進程為對象來進行分配的。 在一個進程的生 命期內,它會用到許多系統資源,會用CPU運行其指令,用存儲器存儲其指令和數據,它也會打開和使用文件 系統中的文件,直接或間接用到系統中的物理設備,因此,Linux設計了一系列的數據結構,它們能准確地描 述進程的狀態和其資源使用情況,以便能公平有效地使用系統資源。Linux的調度演算法能確保不出現某些進程 過度佔用系統資源而導致另一些進程無休止地等待的情況。
進程的創建是一個十分復雜的過程,通常的做法需為子進程重新分配物理空間,並把父進程空間的內容全 盤復制到子進程空間中,其開銷非常大。為了降低進程創建的開銷,Linux採用了Copy�on�write技術,即不 拷貝父進程的空間,而是拷貝父進程的頁表,使父進程和子進程共享物理空間,並將這個共享空間的訪問許可權 置為只讀。當父進程和子進程的某一方進行寫操作時,Linux檢測到一個非法操作,這時才將要寫的頁進行復制 。這一做法免除了只讀頁的復制,從而降低了開銷。
Linux目前尚未提供用戶級線程,但提供了核心級線程,核心線程的創建是在進程創建的基礎上稍做修改, 使創建的子進程與父進程共享虛存空間。從這一意義上講,核心線程更像一個共享進程組。
3.文件系統
Linux最重要的特徵之一就是支持多個不同的文件系統,前面我們已經看到,Linux目前支持的文件系統 多達十餘種,隨著時間的推移,這一數目還在不斷增加。在Linux中,一個分離的文件系統不是通過設備標識 (如驅動器號或驅動器名)來訪問,而是 把它合到一個單一的目錄樹結構中,通過目錄來訪問,這一點與Unix十分相似。Linux用 安裝命令將一個新的文件系統安裝到系統單一目錄樹的某一目錄下,一旦安裝成功,該目錄下的所有內容將 被新安裝的文件系統所覆蓋,當文件系統被卸下後,安裝目錄下的文件將會被重新恢復。
Linux最初的文件系統是Minix。該文件系統對文件限制過多,並且性能低下,如文件名長度不能超過14 個字元、文件大小不能超過64MB。為了解決這些問題,Linux的開發者們設計了一個Linux專用的文件系統EXT。 EXT對文件的要求放鬆了許多,但在性能上並沒有大的改觀,於是就有了後面的EXT2文件系統。EXT2文件系統 是一個非常成功的文件系統,它無論是對文件的限制還是在性能方面都大大優於EXT文件系統,所以,EXT2自 從推出就一直是Linux最常用的文件系統。
為了支持多種文件系統,Linux用一個被稱為虛擬文件系統(VFS)的介面層將真正的文件系統同操作系統及 系統服務分離開。VFS掩蓋了不同文件系統之間的差異,使所有文件系統在操作系統和用戶程序看來都是等同的。VFS允許用戶同時透明地安裝多個不同的文件系統。
4.進程間通信
Linux提供了多種進程間的通信機制,其中,信號和管道是最基本的兩種。除此以外,Linux也提供 System V的進程間通信機制,包括消息隊列、信號燈及共享內存。為了支持不同機器之間的進程通信, Linux還引入了BSD的Socket機制。
四、 Linux的不足及發展趨勢
Linux從出現到現今只經歷了短短七年的時間,但其發展速度是驚人的,這與它的開放性和優良的性能 是密不可分的。不過我們應該看到,作為一個由學生開發的系統,Linux還有許多先天不足,它的設計思想 過多地受到傳統操作系統的約束,沒有體現出當今操作系統的發展潮流,具體表現在以下幾個方面:
不是一個微內核操作系統;
是一個分布式操作系統;
不是一個安全的操作系統;
沒有用戶線程;
不支持實時處理;
代碼是用C而不是C++這樣的現代程序設計語言編寫的。
盡管Linux有這樣和那樣的不足,但其發展潛力不容低估,其發展的動力就是遍布全球、為數眾多的 Linux熱心者。今後Linux將會朝著完善功能、提高效率的方向發展,包括允許用戶創建線程、增加實時處 理功能、開發適合多處理機體系結構的版本。我們相信,Linux、Unix及NT三足鼎立的時代將為期不遠。
————
3.學習了linux以後出去工作有用嗎???
————要看你做哪方面linux工作了,有做管理員的,有做開發的,開發還分很多,比如一般的c/c++,還有嵌入式等等;管理也分,是資料庫管理,還是其它什麼應用。
http://www.ossplus.net
江蘇Linux技術服務