1、操作系統的基礎 調用:kernel通過給應用程式提供system call的方式來提供硬體資源; 註意:應用程式也包括庫文件 庫文件是運行在ring0上的一段程式代碼,不對客戶直接提供應用 2、程式運行原理(一個進程和對個進程) 一個進程:首先我們需要把硬碟中的程式代碼載入到記憶體中(複製),再將 ...
1、操作系統的基礎
調用:kernel通過給應用程式提供system call的方式來提供硬體資源;
註意:應用程式也包括庫文件
庫文件是運行在ring0上的一段程式代碼,不對客戶直接提供應用
2、程式運行原理(一個進程和對個進程)
一個進程:首先我們需要把硬碟中的程式代碼載入到記憶體中(複製),再將這段代碼放到CPU上運算,此時,這段程式就回去調用更多的進程;由這些進程來完成程式所指定任務
在這個過程中,我們就需要去解決數據的輸入輸出,還有存儲問題
多個進程:在電腦中一般都是存在多個進程的,而CPU卻只有一個,我們就使用time space 的方式來給進程分配固定時間來運行;某個進程只能在輪到自己運行的時候才會被放到CPU上去運行,時間一到,就會被踢下來,CPU則會執行下一個進程;
問題:
1、進程誰先誰後的問題?
進程優先順序
2、如果進程沒有運行完就被踢下來怎麼辦
程式數據
輸入數據輸出數據(運行到一半留下的數據)
進程元數據
task struct 數據結構體:它定義了進程數據的存儲格式;我們將進程數據及進程元數據存儲於task struct中,這種結構下方便CPU快速存儲和讀取。
物理地址空間 ---- 線性地址空間
記憶體進程在運行後的一些數據通過線性地址對應的物理地址,存儲到記憶體中;MMU就是用來將不連續的物理地址轉換為連續的線性地址
這些分開的頁框數據又有兩種組織形式:1、鏈表型數據 2、雙向鏈表
3、進程造反了怎麼辦
Linux結構下進程也是樹形結構 – pstree
內核管理不會去直接管理;一般所有進程都有上一級進程來管理
最大的進程 --- init,有許可權去管理所有進程
正常情況:
如何生成子進程:父進程在需要完成一項工作的時候自己無法完成,則需要生成對應的子進程來完成這項工作,並把自己的記憶體空間中的數據複製一份交給子進程,用來存儲子進程所需的運行數據;這個過程我們就叫寫實複製;
子進程完成任務後,如何關閉:子進程完成任務後,交出所占用的資源,再由父進程關閉子進程。
3、進程優先順序
0-139
0-99 守護進程 越大越優先
100-139 普通進程 越小越優先
【特性】普通用戶可以轉讓自己的優先順序
nice值:定義普通進程的優先順序,範圍在-19 – 20 對應100-139
在我們的記憶體上會提供一個空間,專門存放運行過後的進程,當所有的進程運行一遍後,這個空間會和原有空間對換,提供給CPU讀取。直到進程運行完成為止。
4、進程間通訊原理
1、主機間進行通訊
single信號通信
共用記憶體
管道形式
2、主機間的進程通訊
streams --- rpc
socket
5、進程類型
守護進程:維護系統的正常運行
普通進程:提供應用
另一種分類方式:根據占用資源的不同
占用CPU多的進程:後臺運行進程
占用記憶體多的進程:前臺要顯示進程,<優先>
6、進程的狀態
進程和程式比較起來,進程是有生命周期的,他會死去
running運行
sleeping狀態
stop停止狀態
zombie僵死狀態
中斷
7、進程管理的命令
- pstree 查看進程樹;通過樹形結構顯示進程關係,yum install psmisce -y
- ps 查看進程當前運行狀態
PID 進程ID
TTY 啟動該進程的終端是誰
TIME 進程累計在CPU上運行的時間
CMD 啟動該進程的命令程式
常用組合:
ps -aux
ps -ef
ps -ejH 以樹形結構顯示進程
ps -eo 自定義參數格式 ps -eo uid,pid,comm
ps -U 查看指定用戶運行的進程
- top
與ps向反,top實時更新狀態,能夠動態刷新
k --- 關閉進程 輸入PID即可
調整top排序
M 根據記憶體排序
P 根據CPU即用率排序
T 根據使用CPU累計時長排序
N 根據PID進行排序
- htop
top的高級版本,預設yum源里沒有,需要去下載並編譯安裝使用
- vmstat
查看虛擬機記憶體的相關信息
進程信息、記憶體信息、交換記憶體信息、system系統IO信息、cpu信息
-s 以統計的形式顯示相關信息
- pmap
報告記憶體的記憶體映射信息
pmap pid
映射記憶體空間中的物理地址信息和CPU所能識別的線性地址信息。
- pidof
通過進程ID(UID)來查看進程號(PID)
pidof bash
- dstat
預設沒有安裝,通過yum dstat安裝
動態的顯示各種信息,可以自己定義
- kill
管理進程,通過kill對進程發送相應的操作信號
1信號:HUP ,掛起進程
2信號:INT ,中斷進程,ctrl + c就是使用2信號
9信號:KILL,強制關閉進程,不去保存進程數據,直接殺死
15信號:TERM,優雅關閉,能儲存打開的文件
kill -l 查看系統支持的所有信號
- pgrep
進程過濾,也可以做進程查找,類似於pidof
- pkill
直接去關閉進程,可以按照UID(名字)關閉
- jobs
作業:---進程
前臺作業:
後臺作業:在後臺自動運行
前臺作業放到後臺: ctrl + z
把後臺進程切回到前臺:fg 【+代表預設切回的進程】
將前臺進程放到後臺:bg
- iptables
ip的tables ip的表格
iptables只是netfilter的前端管理工具;netfilter是Linux內核提供的數據流量管理模塊
防火牆作用:1、流量控制 2、接VPN
網路防火牆:一般處在外網出口處,主要對於內外網交互的流量進行監控與過濾
主機防火牆:主機有內核空間和用戶空間,netfilter的過濾模塊運行在內核空間,但是它又無法提供數據匹配,所以我們需要使用函數來調用netfilter模塊,匹配數據流量模塊;
匹配數據流量:
五個鉤子函數:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
三種流量:
1、到達主機的流量
2、通過主機的流量
3、主機發起的流量
四張表:
raw 保持連接---建議不要開啟這個表的功能
mangle 數據包修改
nat 做nat映射,包括SNAT和DNAT
filter 數據包過濾,預設啟用
raw關聯OUTPUT、PREROUTING
mangle關聯PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat關聯PREROUTING、OUTPUT、POSTROUTING
filter關聯INPUT、FORWARD、OUTPUT
【對於數據包的行為,就決定了這個數據包經過的鏈】
防火牆處理數據包的四種方式:
ACCEPT 允許數據包通過
DROP 直接丟棄數據包,不給任何回應信息
REJECT 拒絕數據包通過,必要時會給數據發送端響應信息。
LOG 在/var/log/messages 文件中記錄日誌信息,然後將數據包傳遞給下一條規則
註意:寫策略的時候需要關聯鉤子,策略是屬於鉤子的,而鉤子只做策略匹配,不能進行數據操作;所以,我們需要關聯表,每一種表決定了一種行為操作;
表包含鏈 鏈包含策略
iptables用法:
iptables [-t table] {-A|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-4-Z} [chain [rulenum]] [option...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name
參數:
-t 指定表
-A -I 添加策略 -A在最下麵添加 ,-I在最上面添加
-D 刪除策略
-R 替換鏈表,需要指定所替換的編號
iptables -t filter -R INPUT 2 -s 1.1.1.1 -d 2.2.2.2 -j ACCEPT
-S 顯示鏈表的所有用法
-P 指定鏈表的預設行為
iptables -t filter -P INPUT DORP
建議寫白名單用
-N 自己定義鏈表;
如果策略過多,我們需要將策略分類,這就用自己定義鏈表來分類;讓後再將自己定義的鏈表調用在其他可以匹配數據流量的鏈表上;
-X 清除自定義的鏈表
iptables -t filter -X chain
-v 可以查看策略匹配的數據包
-w 詳細查看數據包匹配情況-w
iptables -t filter -L -v
-Z 數據包計數清零
-L 顯示所有chain上面所有的規則rule
-F 清空指定chain上面的所有規則
-E 替換chain的名稱