計算機組成
硬件:主要由5大部件組成,CPU包含運算器和控制器兩大部件
CPU:運算器、控制器、寄存器、緩存
存儲器:內存,RAM(Random Access Memory) , Memory只支持平面編制,最小的存儲單元為Bytes(1Bytes=8bits)
Input:下指令,提供數據等,常見的有:硬盤、鍵盤、鼠標等;
Output:輸出數據加工的結果,常見的有硬盤、顯示器等;
軟件
Kernel+Application
注:CPU位數和計算機支持內存大小的關系: 32位CPU指的是CPU有32根接受輸入的線,每根線都有on和off兩種狀態,on表示1,off表示0,因此CPU一次可接受輸入的數據有2的32次方種可能,而內存的編址是平面化的,因此32位CPU支持的最大尋址為2的32次方,內存的存儲單位是Bytes,故32位CPU支持的最大內存1024*1024*1024*4Bytes=4GB,而64為CPU支持最大內存為16*1024*1024*1024GB。
計算機的工作原理
程序是由指令加數據組成(或者可以說是由算法+數據結構組成),程序運行時會先將指令和數據裝入內存中,CPU先讀取指令,按照指令的指引找到相應的數據,再讀取相應的數據進行運算,然后將運算結果存入內存,最終將運算結果保存到硬盤或通過顯示器顯示,程序由多條指令組成,執行程序時是按預定順序執行各指令,為了加速執行,CPU執行完一條指令后,會將下一條指令所在存儲器中位置存放在指令指針寄存器中,且運算時讀取的第一條數據也需要保存在數據寄存器中,因此寄存器只是加速部件,而非必須部件,CPU的運算速度遠遠高于存儲器的速度,為了加速,引入緩存,常見的有一級緩存、二級緩存、三級緩存等,一級緩存>二級緩存>三級緩存>存儲器,緩存越大命中率越高,計算機運行速度越快,但造價越高。
kernel的作用
1) 驅動底層硬件
2) 將CPU和內存資源抽象化,將CPU的計算能力按時間分片,多個進程按時序輪流使用;將內存虛擬化,邏輯切割成多片,分配給多個進程使用,使每個進程都感覺自己在獨立使用CPU和內存,感知不到其他進程的存在
3)監控多個進程的運行情況,把計算機的計算資源分配給各進程使用,使之各自獨立運行,不相互影響,包括啟動和終止進行進程
OS的組成
廣義上的OS:kernel+application
狹義上的OS:kernel
程序
程序是由指令加數據組成 / 算法+數據接口組成,程序是靜態的,存儲在硬盤中,當需要運行程序時,會將程序裝載到內存中,然后運行,此時叫做進程,因此進程是動態的,進程又叫task任務,程序的分類:
a. 通用程序, 只用于使用某特定硬件的程序,比如使用聲卡的程序,即為驅動程序,后來演變成操作系統
b. 專用程序, 來完成某具體功能的程序,比如播放器
專用程序會調用通用程序來完成具體的功能,而不需要再包含通用程序
程序調用硬件的接口
硬件只支持2進制,其調用接口叫硬件規格;因此調用硬件的程序必須使用二進制編寫,難度和工作量相當大,各CPU廠商為了減輕軟件編寫難度,通常生產的CPU會直接支持稍微接近人類能夠理解的語言,叫匯編語言,但使用硬件的每個程序都需要包含調用硬件這一部分相同的程序,為了簡化程序開發的工作量和難度,操作系統對硬件調用的過程進行封裝,提供簡潔的調用接口,程序開發時只需要調用此接口即可實現調用硬件,調用此接口的過程叫系統調用(System Call,簡稱Syscall);但實現某個專用功能的程序仍需使用多個系統調用才能完成特定功能,為了進一步簡化程序開發難度,我們將完成某特定功能的多個系統調用再次進行封裝,然后提供一個調用接口,此封裝叫做庫(libraries),調用過程叫庫調用(Libraries Call,簡稱Libcall) 。
低級語言和高級語言
高級語言:實現效率高,執行效率低,對硬件的可控性弱,目標代碼大,可維護性好,可移植性好
低級語言:實現效率低,執行效率高,對硬件的可控性強,目標代碼小,可維護性差,可移植性差
越高級的語言,一條語句對應的機器指令條數越多,匯編語言和機器指令一一對應,所有語言編寫的程序執行時都要翻譯成二進制代碼,此翻譯過程由編譯器完成,不管編譯器多么強大,翻譯時都會產生無用代碼,對于匯編語言來說,由于與機器碼一一對應,所以翻譯后基本沒有冗余,但對于高級語言,由于對機器碼進行了抽象和封裝,因此翻譯時會產生較多的無用代碼,據統計C語言編譯后的無用代碼為10%,此外軟件的執行效率除和編程語言有關外還和程序員的編程水平有關,差的程序員即便使用匯編語言也會產生很多無用代碼。
注:
1)Windows和Linux的Libraries Call不同,為了使程序在windows和linux之間具有可移植性,有了posix協定,定義Windows和Linux中庫的調用接口相同,即API (Application Program Interface,程序員面對的編程接口) 相同,但軟件源碼編譯后的二進制未必相同,即ABI (Application Binary Interface,程序應用者面對的運行程序接口) 不相同,由windows和linux中編譯器的差異造成。
2)各廠商生產的各種CPU的架構、支持的硬件規格都不一樣,通過匯編所提供的接口調用也不一樣,因此編譯操作系統時應根據特定環境進行編譯,通常默認編譯為當前CPU所支持的二進制,但也可以指定編譯為特定的CPU類型的二進制,叫做交叉編譯。
Linux的發行版
Linux指的是kernel,屬于GUN組織,以源碼的方式提供,但大多數使用者不具有將源碼編譯為二進制可執行程序的能力,因此有一些商業公司或者社區專門負責將kernel源碼和一些常用開源軟件一起編譯成二進制代碼,商業公司通過收取服務費獲取利益。
Linux的發行版:Linux的發行版有數百種之多,但主要有如下幾個派系
Debian:一個社區Linux發行版,包格式為deb,包管理器為 apt-get
Ubuntu:Debian的二次發行版
Mint:Ubuntu的二次發行版
Knopix:Debian的二次發行版
Slackware:
S.u.S.E:屬于Attachmate公司,包格式為rpm,,包管理器為zypper,zypper參考了yum,但是對外聲稱比yum好用
OpenSuSE:S.u.S.E的開源版
Redhat:包格式為rpm,包管理器為yum
Redhat Enterprise Linux:RHEL, 屬于Redhat公司的企業發行版
Fedora:Redhat將Redhat 9.0以前的版本貢獻給Fedora社區,是個人桌面版的Linux發行版
Centos:Centos社區的發行版,RHEL源碼編譯而來,和RHEL完全兼容
ArchLinux:相對于前三個派系,archlinux屬于輕量的linux發行版,包管理器較前三種都好用,但安裝過程較復雜
Gentoo:安裝過程需要邊編譯邊安裝,因此此操作系統是最適用于當前硬件平臺的
LFS:Linux From Scratch,從零構建Linux,提供的不是程序,而是一本書,指引如何下載源碼,如何一步步構建Linux,世上最純Linux
Kali:早期的BT,內置各種滲透工具
Linux Kernel的版本號:
major.minor.release
主版本號.次版本號.修訂號, kernel有重大更新時增加major, 一般功能更新增加minor, 為kernel漏洞打補丁時增加release。
Linux:0.99, 2.2, 2.4, 2.6, 3.0, 4.0
www.kernel.org
Linux發行版的版本號
和Linux Kernel版本號無關,只是發行商或者社區針對自己的Linux發行版指定的版本號
RHEL: 5.x, 6.x, 7.x
Debian:8.x
OpenSuSE: 13.x
程序管理
程序的組成:程序由如下四部分組成
二進制程序
配置文件
庫文件
幫助文件
程序的包管理器:將程序的組成文件打包成一個或有限幾個文件
安裝
卸載
查找
Linux的哲學思想
1)一切皆文件:
把幾乎所有資源統統抽象為文件形式,甚至是硬件設備和通信接口等
2)由眾多功能單一的程序組成:
一個程序只做一件事,并且做好,組合小程序完成復雜任務
3)盡量避免跟用戶交互:
目標是易于用編程的方式實現自動化任務
4)使用文本文件保存配置信息
終端設備:terminal
物理終端:console,比如鼠標鍵盤和顯示器,設備文件目錄:/dev/console
虛擬終端:tty,每套物理終端都會有一個虛擬終端與其對應,設備文件目錄:/dev/tty# [1,n]
命令終端
圖形終端
CentOS 6:在tty 7上,通過Ctrl+Alt+F7切換到tty 7上
CentOS 7:在哪個虛擬終端啟動,即位于哪個虛擬終端
串行終端:ttyS,通過串行接口輸出的終端,設備文件目錄:/dev/ttyS#
偽終端:pty,比如Xme4、SecureCRT等ssh終端軟件,每個窗口模擬一套終端,設備文件目錄:/dev/pts/#
注:在啟動終端設備之后,Linux會自動為其關聯一個用戶OS接口程序,即可實現與用戶交互。
OS的接口
計算機只有kernel是無法為我們完成指定工作的,因為kernel不包含任何應用程序,無法完成人機交互,所以有個特定應用程序叫OS的接口,OS的接口有兩類:
GUI:Graphic User Interface
GNome:c, gtk
KDE: c++, qt
CLI:Command Line Interface
bash
zsh
sh
csh
tcsh
ksh
文件和文件系統
目錄:路徑映射;
文件:存儲空間存儲的一段流式數據,對數據可以做到按名存?。?/span>
文件系統:一種存儲和組織計算機數據的方法,采用層級結構,呈倒置樹狀結構
/: 原初起點;
文件名使用法則:
嚴格區分字符大小寫:file1, File1, FILE1
目錄也是文件,在同一路徑下,兩個文件不能同名;
支持使用除/以外的任意字符;
最長不能超過255個字符;
以.開頭的文件為隱藏文件;
.: 當前目錄;
..: 當前目錄的上一級目錄;
例如:
/etc/sysconfig/
.: sysconfig
..: /etc
文件的路徑表示:
絕對路徑:從根開始表示出的路徑
相對路徑:從當前位置開始表示出的路徑
用戶有家目錄:home, 用戶的起始目錄;普通用戶管理文件的位置;(普通用戶只能管理家目錄下的文件和臨時目下的文件)
工作目錄:working,用戶登錄操作系統后,任何時刻都處于某個目錄下,此目錄就為工作目錄
路徑分隔符:
最左側/: 表示根目錄
其它的/: 表示路徑分隔符
inux的路徑分隔符是/
Windows的是\
基名和路徑名
basename:最右側的文件或目錄名;
dirname:basename左側的路徑;
命令:
~]# basename /PATH/TO/SOMEFILE
SOMEFILE
~]# dirname /PATH/TO/SOMEFILE
/PATH/TO
Linux文件系統標準
FHS:Filesystem Hierarchy Standard
/bin:所有用戶可用的基本命令程序文件;
/sbin:供系統管理使用的工具程序;
/boot:引導加載器必須用到的各靜態文件:kernel, initramfs(initrd), grub等;
/dev:存儲特殊文件或設備文件;
設備有兩種類型:
字符設備(線性設備):一個字符一個字符順序輸入或輸出,比如鍵盤和早期顯示器;
塊設備(隨機設備):將設備分成以1K或者其他單位的塊,讀取時一塊一塊的讀取。
/etc:系統程序的配置文件,只能為靜態;
/home:普通的家目錄的集中位置;一般每個普通用戶的家目錄默認為此目錄下與用戶名同名的子目錄,/home/USERNAME;
/root:管理員的家目錄;可選;
/lib:為系統啟動或根文件系統上的應用程序(/bin, /sbin等)提供共享庫,以及為內核提供內核模塊
libc.so.*:動態鏈接的C庫;
ld*:運行時鏈接器/加載器;
modules:用于存儲內核模塊的目錄;
/lib64:64位系統特有的存放64位共享庫的路徑;
/media:便攜式設備掛載點,cdrom, floppy等;
/mnt:其它文件系統的臨時掛載點;
/opt:附加應用程序的安裝位置;可選路徑;
/srv:當前主機為服務提供的數據;
/tmp:為那些會產生臨時文件的程序提供的用于存儲臨時文件的目錄;可供所用戶執行寫入操作;有特殊權限;
/usr:usr Hierarchy,全局共享的只讀數據路徑;
bin, sbin
lib, lib64
include:C程序頭文件;
share:命令手冊頁和自帶文檔等架構特有的文件的存儲位置
local:另一個層級目錄;
X11R6:X-Window程序的安裝位置
src:程序源碼文件的存儲位置
/usr/local:Local hierarchy,讓系統管理員安裝本地應用程序;也通常用于安裝第三方程序;
bin Local binaries
etc Host-specific system configuration for local binaries
games Local game binaries
include Local C header files
lib Local libraries
man Local online manuals
sbin Local system binaries
share Local architecture-independent hierarchy
src Local source code
/var:/var Hierarchy,存儲常發生變化的數據的目錄;
cache Application cache data
lib Variable state information
local Variable data for /usr/local
lock Lock files
log Log files and directories
opt Variable data for /opt
run Data relevant to running processes
spool Application spool data
tmp Temporary files preserved between system reboots
/proc:基于內存的虛擬文件系統,用于為內核及進程存儲其相關信息;它們多為內核參數,例如net.ipv4.ip_forward, 虛擬為net/ipv4/ip_forward, 存儲于/proc/sys/, 因此其完整路徑為/proc/sys/net/ipv4/ip_forward,這樣做的目的是為了對應Linux一切皆文件;
/sys:sysfs虛擬文件系統提供了一種比proc更為理想的訪問內核數據的途徑;其主要作用在于為管理Linux設備提供一種統一模型的的接口;
參考:https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/
Linux系統上的文件類型:
-:常規文件;即f;
d: directory,目錄文件;
b: block device,塊設備文件,支持以“block”為單位進行隨機訪問
l:symbolic link,符號鏈接文件;
p: pipe,命名管道;
s: socket,套接字文件;
c:character device,字符設備文件,支持以“character”為單位進行線性訪問
major number:主設備號,用于標識設備類型,進而確定要加載的驅動程序,使用8位二進制表示;
minor number:次設備號,用于標識同一類型中的不同的設備,使用8位二進制表示。
實例:
dev]$ ls -l tty
crw-rw-rw-. 1 root tty 5, 0 Nov 11 2011 tty #第5個字段為5,0非文件大小,5即為major number,0即為minor number
查看文件類型命令:~]# file FILENAME
程序編譯方式:
動態鏈接:程序編譯時不將調用的庫編譯進程序,而是指明所調用庫文件的接口,當執行時再將指定的庫文件裝載進內存。缺點是移植性差,當程序移植到另一臺服務器時,要求服務器必須擁有所需庫文件,否則不能執行,優點是多個程序占用內存小,當有多個應用程序調用同一個庫文件時,只需將一份裝入內存。
靜態編譯:程序編譯時連同調用的庫文件編譯進程序,執行時庫文件和程序一起裝載進內存,優點是移植性強,當程序移植到另一臺服務器時,無需服務器擁有所需庫,而是已經自備,缺點是占用內存大,當多個程序都調用相同的庫文件時,都將庫文件作為自己程序的一部分,且都裝入內存,這樣就浪費掉很多不必要的內存空間
進程的類型:
與終端相關:通過終端啟動
與終端無關:操作系統引導啟動過程當中自動啟動,因此shell不是操作系統必備的程序
Linux必備庫:glibc(GUN libraries C)
原創文章,作者:Yurnero,如若轉載,請注明出處:http://www.www58058.com/38946
贊,抽時間可以熟悉下markdown~加油~