Linux系統(tǒng)基礎(chǔ)知識
Linu__是一套免費使用和自由傳播的類Uni__操作系統(tǒng),嚴(yán)格的來講,Linu__ 不算是一個操作系統(tǒng),只是一個 Linu__ 系統(tǒng)中的內(nèi)核,即計算機(jī)軟件與硬件通訊之間的平臺。下面就讓小編帶你去看看Linu__系統(tǒng)基礎(chǔ)知識,希望能幫助到大家!
整理了Linu__全套自學(xué)教程!
為什么要用Linu__?
Linu__極其強大,可以讓聰明人干任何他們想干的事情。
Linu__ 從誕生之日起,它的工作方式就比 Windows 的先進(jìn)。
Linu__ 屬于能勇敢面對符號的人。只有符號才能完全操縱計算機(jī)。
歐美發(fā)達(dá)國家的傳統(tǒng)科研單位、黑客們從幾十年前就從事這些行當(dāng)了,使用Linu__/Uni__的習(xí)慣延續(xù)至今。
鼠標(biāo)雖然是很好的工具,但是它的表達(dá)能力是有限的。
你不可能光用鼠標(biāo)就讓電腦完全明白你的意思,它畢竟只有3個按鈕。所以我們雖然很喜歡鼠標(biāo),但是卻不能完全依賴它。
熟練的Linu__黑客可以很快敲出一行命令,組合系統(tǒng)里面的各種工具來完成一個任務(wù)。很多工具本身就是一個黑客工具,壓根就沒考慮windows用戶們,在圖形界面下用起來反而非常麻煩。圖形界面的優(yōu)勢是數(shù)據(jù)展示方式多樣,劣勢是從使用者的角度看,它混淆了數(shù)據(jù)展示和數(shù)據(jù)本身。
在Linu__大量工作抽象地看是這樣的:
把一堆數(shù)據(jù)扔進(jìn)一個程序,得到另一堆數(shù)據(jù),再扔進(jìn)另一個程序……
不用關(guān)心數(shù)據(jù)展示,它要的是數(shù)據(jù)本身。
什么是 Windows 能干而 Linu__ 干不了的事情?
“Windows 能干而 Linu__ 干不了的事情,那就是不需要干的事情?!?/p>
幾乎所有科學(xué)計算程序,EDA 程序,高性能圖像處理程序都不是基于 Windows 的。
消除學(xué)計算機(jī)很難的幻覺,勇敢的拿起像 bash, FVWM, Te__, VIM, Emacs, Mutt ……這樣強大的程序,勇敢的面對符號。不要再埋怨“Linu__ 為什么不能像 Windows 那樣”,不要再浪費時間試用這樣那樣的程序,不要再忙著升級。你需要理解 UNI__ 的工作方式,因為那是大多數(shù)科學(xué)家的工作方式。
Linu__運維學(xué)習(xí)路線,實用Linu__教程,推薦學(xué)習(xí)收藏
Linu__操作系統(tǒng)在短短的幾年之內(nèi)得到了非常迅猛的發(fā)展,這與linu__具有的良好特性是分不開的。Linu__包含了UNI__的全部功能和特性。簡單來說,linu__具有以下主要特性:遵循GNU GPL,開放性,多任務(wù),多用戶,設(shè)備獨立性,提供了豐富的網(wǎng)絡(luò)功能,可靠的系統(tǒng)安全,良好的可移植性。下面給大家說說Linu__運維學(xué)習(xí)路線,實用LINU__教程推薦大家學(xué)習(xí)收藏。
關(guān)于Linu__運維學(xué)習(xí)很多人都有自己不同的理由,我們不妨來分析一下:
Linu__是免費的不用花一分錢,能夠節(jié)約大筆的成本;
Linu__是開源的,你可以根據(jù)自已的需要修改源代碼;
Linu__是開放的,有廣泛的社區(qū),關(guān)于Linu__的討論要遠(yuǎn)遠(yuǎn)高于windows操作系統(tǒng);
學(xué)習(xí)Linu__可以更好的掌握計算機(jī)技術(shù);
Linu__是未來發(fā)展的趨勢,服務(wù)器,手機(jī),掌上電腦,平板機(jī)很多都采用Linu__操作系統(tǒng);
Linu__有非常多的發(fā)行版本,你可以根據(jù)需要做出不同的選擇;
Linu__讓你多了一個選擇,而且Linu__下的病毒相比Window可以忽略不計;
Linu__是一種自由哲學(xué),一種開源的信仰;
最后Linu__很好玩,可以裝逼,哈哈……
我覺得我有必要把我學(xué)習(xí)linu__的基礎(chǔ)的經(jīng)驗分享一下:
1、掌握Linu__基礎(chǔ)
俗話說“思則有備,有備無患”,學(xué)習(xí)之前你先要搭建好學(xué)習(xí)環(huán)境(紅帽RHEL7)然后在虛擬機(jī)安裝它,開始使用它。學(xué)習(xí)Linu__,命令使用是學(xué)習(xí)的前提,就像你和外國人說話就得說英語不然別人怎么知道你說的是什么。例如:
命令名,選項,各個參數(shù)都作為命令的輸入項,都是獨立的項,他們之間必須用空格隔開。Linu__中命令格式如下:
命令名 【選項】 【參數(shù)1】 【參數(shù)2】……
學(xué)習(xí)Linu__,要熟練掌握命令的使用,雖然命令多,但是熟能生巧,在以后的學(xué)習(xí)運用中能大大節(jié)約你的時間。還有學(xué)習(xí)linu__切不可粗心大意,往往一個小小的空格也會報錯,當(dāng)然在linu__中,大小寫是很敏感的,切記!
2、從基礎(chǔ)入手,切勿眼高手低
linu__如果一旦學(xué)習(xí)一段時間之后你會發(fā)現(xiàn)其實也沒想象中那么難,甚至比windows更簡單已操作,通常認(rèn)為GLI沒有GUL那么方面用戶操作。因為命令行界面的軟件通常需要用戶記憶操作來完成命令,但是,由于其本身的特點,命令行界面要較圖形用戶界面節(jié)約計算機(jī)系統(tǒng)的資源。所以,熟記命令的前提下,使用命令行界面往往要較使用圖形用戶界面的操作速度要快,這也是你以后玩轉(zhuǎn)Linu__的基本條件之一。
3、多總結(jié),勤思考,多記筆記
如果想學(xué)好Linu__系統(tǒng)知識,不是一天兩天就能學(xué)會的,也是經(jīng)過一朝一夕,慢慢積累的,這個過程中要學(xué)會去總結(jié),多思考,多動手去練,去實踐,在理解的基礎(chǔ)上去記憶,把原理搞懂,把重要的知識點積累下來,以便在以后的工作中方便查找,當(dāng)做查詢手冊,同時也能鍛煉我們編寫文檔的能力,對以后都是有很大幫助的。
4、及時充電,提高自學(xué)能力
要具備良好的自學(xué)能力,除了老師講的,你還要去考慮老師的知識點還可以怎樣去擴(kuò)充,這時候一本好的資料書就非常必要了,把這些基礎(chǔ)的都學(xué)會了,建議你再去深入學(xué)習(xí)Linu__進(jìn)階技術(shù),不斷的去提高自己。
以上也只是我個人學(xué)習(xí)經(jīng)驗所談,希望我的學(xué)習(xí)經(jīng)驗可以幫助到像我原來這樣的新手。學(xué)好linu__基礎(chǔ)要扎實,切不可好高騖遠(yuǎn),踏踏實實的去練習(xí)思考。指尖和思維的跳動才能跳出linu__的華爾茲!
Linu__系統(tǒng)零基礎(chǔ)編程入門,想當(dāng)大神?這些你都要學(xué)
? 文件和文件系統(tǒng)
文件是Linu__系統(tǒng)中最重要的抽象,大多數(shù)情況下你可以把linu__系統(tǒng)中的任何東西都理解為文件,很多的交互操作其實都是通過文件的讀寫來實現(xiàn)的。
? 文件描述符
在Linu__內(nèi)核中,文件是用一個整數(shù)來表示的,稱為 文件描述符,通俗的來說,你可以理解它是文件的id(唯一標(biāo)識符)
? 普通文件
? 普通文件就是字節(jié)流組織的數(shù)據(jù)。
? 文件并不是通過和文件名關(guān)聯(lián)來實現(xiàn)的,而是通過關(guān)聯(lián)索引節(jié)點來實現(xiàn)的,文件節(jié)點擁有文件系統(tǒng)為普通文件分配的唯一整數(shù)值(ino),并且存放著一些文件的相關(guān)元數(shù)據(jù)。
? 目錄與鏈接
? 正常情況下文件是通過文件名來打開的。
? 目錄是可讀名稱到索引編號之間的映射,名稱和索引節(jié)點之間的配對稱為鏈接。
? 可以把目錄看做普通文件,只是它包含著文件名稱到索引節(jié)點的映射(鏈接)
? 進(jìn)程
進(jìn)程是僅次于文件的抽象概念,簡單的理解,進(jìn)程就是正在執(zhí)行的目標(biāo)代碼,活動的,正在運行的程序。不過在復(fù)雜情況下,進(jìn)程還會包含著各種各樣的數(shù)據(jù),資源,狀態(tài)甚至虛擬計算機(jī)。
你可以這么理解進(jìn)程:它是競爭計算機(jī)資源的基本單位。
? 進(jìn)程、程序與線程
? 程序
程序,簡單的來說就是存在磁盤上的二進(jìn)制文件,是可以內(nèi)核所執(zhí)行的代碼
? 進(jìn)程
當(dāng)一個用戶啟動一個程序,將會在內(nèi)存中開啟一塊空間,這就創(chuàng)造了一個進(jìn)程,一個進(jìn)程包含一個獨一無二的PID,和執(zhí)行者的權(quán)限屬性參數(shù),以及程序所需代碼與相關(guān)的資料。
進(jìn)程是系統(tǒng)分配資源的基本單位。
一個進(jìn)程可以衍生出其他的子進(jìn)程,子進(jìn)程的相關(guān)權(quán)限將會沿用父進(jìn)程的相關(guān)權(quán)限。
? 線程
每個進(jìn)程包含一個或多個線程,線程是進(jìn)程內(nèi)的活動單元,是負(fù)責(zé)執(zhí)行代碼和管理進(jìn)程運行狀態(tài)的抽象。
線程是獨立運行和調(diào)度的基本單位。
? 進(jìn)程的層次結(jié)構(gòu)(父進(jìn)程與子進(jìn)程)
在進(jìn)程執(zhí)行的過程中可能會衍生出其他的進(jìn)程,稱之為子進(jìn)程,子進(jìn)程擁有一個指明其父進(jìn)程PID的PPID。子進(jìn)程可以繼承父進(jìn)程的環(huán)境變量和權(quán)限參數(shù)。
于是,linu__系統(tǒng)中就誕生了進(jìn)程的層次結(jié)構(gòu)——進(jìn)程樹。
進(jìn)程樹的根是第一個進(jìn)程(init進(jìn)程)。
? 過程調(diào)用的流程:fork & e__ec
一個進(jìn)程生成子進(jìn)程的過程是,系統(tǒng)首先復(fù)制(fork)一份父進(jìn)程,生成一個暫存進(jìn)程,這個暫存進(jìn)程和父進(jìn)程的區(qū)別是pid不一樣,而且擁有一個ppid,這時候系統(tǒng)再去執(zhí)行(e__ec)這個暫存進(jìn)程,讓他加載實際要運行的程序,最終成為一個子進(jìn)程的存在。
? 進(jìn)程的結(jié)束
當(dāng)一個進(jìn)程終止時,并不會立即從系統(tǒng)中刪除,內(nèi)核將在內(nèi)存中保存該進(jìn)程的部分內(nèi)容,允許父進(jìn)程查詢其狀態(tài)(這個被稱為等待終止進(jìn)程)。
當(dāng)父進(jìn)程確定子進(jìn)程已經(jīng)終止,該子進(jìn)程將會被徹底刪除。
但是如果一個子進(jìn)程已經(jīng)終止,但父進(jìn)程卻不知道它的狀態(tài),這個進(jìn)程將會成為 僵尸進(jìn)程
? 服務(wù)與進(jìn)程
簡單的說服務(wù)(daemon)就是常駐內(nèi)存的進(jìn)程,通常服務(wù)會在開機(jī)時通過init.d中的一段腳本被啟動。
? 進(jìn)程通信
進(jìn)程通信的幾種基本方式:管道,信號量,消息隊列,共享內(nèi)存,快速用戶控件互斥。
? 程序,進(jìn)程和線程
現(xiàn)在我們再次詳細(xì)的討論這三個概念
? 程序(program)
程序是指編譯過的、可執(zhí)行的二進(jìn)制代碼,保存在儲存介質(zhì)上,不運行。
? 進(jìn)程(process)
進(jìn)程是指正在運行的程序。
進(jìn)程包括了很多資源,擁有自己獨立的內(nèi)存空間。
? 線程
線程是進(jìn)程內(nèi)的活動單元。
包括自己的虛擬儲存器,如棧、進(jìn)程狀態(tài)如寄存器,以及指令指針。
在單線程的進(jìn)程中,線程即進(jìn)程。而在多線程的進(jìn)程中,多個線程將會共享同一個內(nèi)存地址空間
? 運行一個進(jìn)程
創(chuàng)建一個進(jìn)程,在uni__系統(tǒng)中被分為了兩個流程。
● 把程序載入內(nèi)存并執(zhí)行程序映像的操作:e__ec
● 創(chuàng)建一個新進(jìn)程:fork
? e__ec
? 最簡單的e__ec系統(tǒng)調(diào)用函數(shù):e__ecl()
● 函數(shù)原型:
int e__ecl(const char __ path,const chr __ arg,...)
e__ecl()調(diào)用將會把path所指的路徑的映像載入內(nèi)存,替換當(dāng)前進(jìn)程的映像。
參數(shù)arg是以第一個參數(shù),參數(shù)內(nèi)容是可變的,但最后必須以NULL結(jié)尾。
● 舉例:
int ret;ret = e__ecl("/bin/vi","vi",NULL);if (ret == -1) { perror("e__ecl");}
上面的代碼將會通過/bin/vi替換當(dāng)前運行的程序
注意這里的第一個參數(shù)vi,是uni__系統(tǒng)的默認(rèn)慣例,當(dāng)創(chuàng)建、執(zhí)行進(jìn)程時,shell會把路徑中的最后部分放入新進(jìn)程的第一個參數(shù),這樣可以使得進(jìn)程解析出二進(jìn)制映像文件的名字。
int ret;ret = e__ecl("/bin/vi","vi","/home/mark/a.t__t",NULL);if (ret == -1) { perror("e__ecl");}
上面的代碼是一個非常有代表性的操作,這相當(dāng)于你在終端執(zhí)行以下命令:
vi /home/mark/a.t__t
● 返回值:
正常情況下其實e__ecl()不會返回,調(diào)用成功后會跳轉(zhuǎn)到新的程序入口點。
成功的e__ecl()調(diào)用,將改變地址空間和進(jìn)程映像,還改變了很多進(jìn)程的其他屬性。
不過進(jìn)程的PID,PPID,優(yōu)先級等參數(shù)將會被保留下來,甚至?xí)A粝滤蜷_的文件描述符(這就意味著它可以訪問所有這些原本進(jìn)程打開的文件)。
失敗后將會返回-1,并更新errno。
● 其他e__ec系函數(shù)
略,使用時查找
? fork
通過fork()系統(tǒng)調(diào)用,可以創(chuàng)建一個和當(dāng)前進(jìn)程映像一模一樣的子進(jìn)程。
● 函數(shù)原型
pid_t fork(void)
調(diào)用成功后,會創(chuàng)建一個新的進(jìn)程(子進(jìn)程),這兩個進(jìn)程都會繼續(xù)運行。
● 返回值
如果調(diào)用成功,
父進(jìn)程中,fork()會返回子進(jìn)程的pid,在子進(jìn)程中返回0;
如果失敗,返回-1,并更新errno,不會創(chuàng)建子進(jìn)程。
● 舉例
我們看下面這段代碼
#include #include int main (){ pid_t fpid; //fpid表示fork函數(shù)返回的值 int count=0; printf("this is a process\n"); fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d\n",getpid()); printf("我是爹的兒子\n"); count++; } else { printf("i am the parent process, my process id is %d\n",getpid()); printf("我是孩子他爹\n"); count++; } printf("統(tǒng)計結(jié)果是: %d\n",count); return 0;}
這段代碼的運行結(jié)果比較神奇,是這樣的:
this is a processi am the parent process, my process id is 21448我是孩子他爹統(tǒng)計結(jié)果是: 1i am the child process, my process id is 21449我是爹的兒子統(tǒng)計結(jié)果是: 1
在執(zhí)行了fork()之后,這個程序就擁有了兩個進(jìn)程,父進(jìn)程和子進(jìn)程分別往下繼續(xù)執(zhí)行代碼,進(jìn)入了不同的if分支。
如何理解pid在父子進(jìn)程中不同?
其實就相當(dāng)于鏈表,進(jìn)程形成了鏈表,父進(jìn)程的pid指向了子進(jìn)程的pid,因為子進(jìn)程沒有子進(jìn)程,所以pid為0。
● 寫時復(fù)制
傳統(tǒng)的fork機(jī)制是,調(diào)用fork時,內(nèi)核會復(fù)制所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu),復(fù)制進(jìn)程的頁表項,然后把父進(jìn)程的地址空間按頁復(fù)制給子進(jìn)程(非常耗時)。
現(xiàn)代的fork機(jī)制采用了一種惰性算法的優(yōu)化策略。
為了避免復(fù)制時系統(tǒng)開銷,就盡可能的減少“復(fù)制”操作,當(dāng)多個進(jìn)程需要讀取他們自己那部分資源的副本時,并不復(fù)制多個副本出來,而是為每個進(jìn)程設(shè)定一個文件指針,讓它們讀取同一個實際文件。
顯然這樣的方式會在寫入時產(chǎn)生沖突(類似并發(fā)),于是當(dāng)某個進(jìn)程想要修改自己的那個副本時,再去復(fù)制該資源,(只有寫入時才復(fù)制,所以叫寫時復(fù)制)這樣就減少了復(fù)制的頻率。
? 聯(lián)合實例
在程序中創(chuàng)建一個子進(jìn)程,打開另一個應(yīng)用。
pid_t pid;pid = fork();if (pid == -1) perror("fork");//子進(jìn)程if (!pid) { const char __ args[] = {"windlass",NULL}; int ret; // 參數(shù)以數(shù)組方式傳入 ret = e__ecv("/bin/windlass",args); if (ret == -1) { perror("e__ecv"); e__it(E__IT_FAILURE); }}
上面的程序創(chuàng)建了一個子進(jìn)程,并且使子進(jìn)程運行了/bin/windlas程序。
? 終止進(jìn)程
? e__it()
● 函數(shù)原型
void e__it (int status)
該函數(shù)用于終止當(dāng)前的進(jìn)程,參數(shù)status只用于標(biāo)識進(jìn)程的退出狀態(tài),這個值將會被傳送給當(dāng)前進(jìn)程的父進(jìn)程用于判斷。
還有一些其他的終止調(diào)用函數(shù),在此不贅述。
如果你也很想學(xué)編程,可以來我的C語言/C++編程學(xué)習(xí)基地【Q群:1083154082】!
還有(源碼,零基礎(chǔ)教程,項目實戰(zhàn)教學(xué)視頻)!帶你入個門還是簡簡單單啦~
涉及:游戲開發(fā)、課程設(shè)計、常用軟件開發(fā)、編程基礎(chǔ)知識、黑客等等...
Linu__系統(tǒng)基礎(chǔ)知識相關(guān)文章:
★ 認(rèn)識網(wǎng)絡(luò)的基礎(chǔ)知識教程
Linux系統(tǒng)基礎(chǔ)知識
上一篇:沒有了