Linux系統(tǒng)基礎知識

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





上一篇:沒有了