Linux作業系統基礎
- 1. 作業系統
- 1.1 設計os的目的
- 1.2 定位
- 2. 行程
- 2.1 認識行程
- 2.2 查看行程
- 2.2.1 第一種方法
- 2.2.2 第二種方法
- 3. 通過系統呼叫獲取識別符號
- 4. 行程需要注意的幾個地方
我們常見的計算機,大部分都遵守馮諾依曼體系,

- 輸入設備:鍵盤,滑鼠,攝像頭,麥克風,網卡,硬碟等
- 存盤器:記憶體(掉電易失性存盤介質)
- 中央處理器:
- 運算器:算數運算,邏輯運算
- 控制器:控制電路信號(非資料性,什么時候該進行什么操作,進行操作的時間)
輸出設備:顯示幕,聲卡,喇叭,硬碟
從資料信號看,cpu不和輸入輸出設備互動,

- cpu 暫存器:納秒
- 記憶體:微妙
- 硬碟:毫秒
- 距離cpu越近存盤效率越高,成本越高,且容量比較小,
- 出于成本和效率,一般由快的設備給慢的設備做快取,
輸入輸出設備距離cpu遠,所以一般由記憶體作為緩沖區實作預加載與預寫入,
這一些列操作都是計算機作業系統(os)幫我們做的,
當登上qq和某位朋友開始聊天,發訊息的資料流動程序:
我:輸入設備(鍵盤)——>存盤器——>cpu封包——>存盤器——>網卡
朋友:輸入設備(網卡)——>存盤器——>cpu解包——>存盤器——>顯示幕
1. 作業系統
任何計算機系統都包含一個基本程式的集合,成為作業系統(os),作業系統包括:
- 內核(行程管理,記憶體管理,檔案管理,驅動管理)
- 其他程式(例如函式庫,shell程式)
1.1 設計os的目的
- 與硬體互動,管理所有的軟硬體資源
- 為用戶程式提供一個良好的執行環境
1.2 定位
一款純粹的"管理"軟體

如何理解這個"管理"呢
管理:真正的管理是有"絕策權"的,與"執行權"不同,
任何管理都是先描述,在組織
先看下三層:
底層硬體:學生(被管理者)
驅動程式:導員,樓管,圖書管理員(執行者)
作業系統:校長(管理者)
- 校長從來不與學生直接見面,通過資訊管理,通知執行者導員,對學生進行操作
- 驅動層可以幫管理者拿到被管理者的資料
- 被管理者資訊量很大,資訊就需要被組織起來,要組織就要先描述,(可以理解為先宣告,在定義)
先描述,
struct stu
{
_name;
_sex;
_num;
_grades;
struct stu* next;
}
在組織:
Struct s1,s2,s3...
s1->next=s2;
s2->next=s3;
...
作業系統操作過于復雜,提供了系統呼叫介面,操作也有部分成本,所以提供了用戶操作介面,
在我們實際進行編程或者開發的時候大多數用的都是lib庫函式,有的庫函式與硬體進行互動那么,他就會呼叫系統呼叫,
總結:
- 作業系統是什么?什么是管理?
一款"管理"軟體;具有決策權的才叫管理,執行者不算, - 作業系統怎么進行管理?
通過驅動操作硬體資訊,具有同種型別的資訊很多,先描述,在組織, - 作業系統為什么要進行管理?
一套系統,需要一個管理者進行領導,對上給用戶一個穩定高效的執行環境,對下管理好軟硬體資源提供穩定的軟硬體環境, - lib庫函式和系統呼叫之間的關系
庫函式在系統呼叫的上層,使用庫函式與硬體進行互動的話會呼叫系統呼叫,
2. 行程
2.1 認識行程
作業系統一般在硬碟根目錄的boot目錄,
運行起來的時候加載在記憶體當中

當一個程式運行起來被加載到記憶體的瞬間就成為了行程,
寫一個程式:

2.2 查看行程
2.2.1 第一種方法
首先,運行程式,在另一個視窗通過ps命令查看這個行程

USER :行程的所屬用戶,
PID :行程的行程ID號,
%CPU :行程占用的 CPU資源 百分比,
%MEM :行程占用的 物理記憶體 百分比,
VSZ :行程使用掉的虛擬記憶體量 (Kbytes) ,
RSS :行程占用的固定的記憶體量 (Kbytes) ,
TTY :與行程相關聯的終端(tty),?代表無關,tty1-tty6是本機上面的登入者程式,pts/0表示為由網路連接進主機的程式,
STAT :行程的狀態,具體見2.1列出來的部分 ,
START :行程開始創建的時間 ,
TIME :行程使用的總cpu時間,
COMMAND : 行程對應的實際程式,
2.2.2 第二種方法
線運行程式,在另一個視窗通過ls /proc查找

可以看到第一種方法查找到mybin 的pid是9797,在第二種方法中右上角也找到了9797,那個9999是grep命令的行程,
通過ctrl+c終止程式,發現9797沒有了,

再次運行呢,又重新分配了pid,(行程1一般都是作業系統)
然后進入9797對應的目錄里,這里都是它的基本資訊

3. 通過系統呼叫獲取識別符號
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<sys/types.h>
4 int main()
5 {
6 while(1)
7 {
8 printf("pid : %d\n" , getpid());
9 printf("ppid : %d\n" ,getppid());
10 sleep(1);
11 }
12 }
~
~
- pid(行程id)
- ppid(父行程id)
運行查看對應的id,

終止,在重新運行,重新分配了pid,父行程沒有變化

通過ps aux | grep 22717查看行程,發現父行程始終是bash命令,shell為命令列解釋器,bash是Linux中的命令列解釋器(就和pcb是行程,struct task_struct是Linux中的行程一樣)
4. 行程需要注意的幾個地方
- 記憶體當中會有很多行程,那么作業系統怎么進行管理呢?
答:很明顯 先描述,在組織, - 行程(Process Control Block簡稱pcb)在c語言中pcb被定義為
struct task_struct, - 就像檔案=內容+屬性一樣,程式檔案加載進記憶體成為行程,那么行程是一定比原檔案體積要大的,
- 描述行程的資料結構,就是一批結構體物件,
所以一個行程實際的大小就是可執行程式+所需要的資料結構的集合
struct task_struct
{
1.標識資訊
2.運行資訊,時間
3.優先級資訊
4.背景關系(假如程式暫時停止,等到他恢復的時候還要讓他繼續運行)
5.關系資訊
6.信號
7.狀態
}
- 在Linux內核,采用雙鏈表進行管理行程
- 為什么bash(命令列解釋器)要存在子行程?
答:在對Linux進行操作時,總會有些指令出現bug,那么作為父行程他是不可以被掛掉的,他一出現問題所有的命令不能在被執行,所以每次在命令列運行命令bash創建自己的子行程,即使出現問題子行程掛掉也不影響父行程,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259234.html
標籤:其他
上一篇:超級簡單反匯編破解一個小程式
