1. 程式人生 > >6、進程知識(參合內核調度知識)

6、進程知識(參合內核調度知識)

進程管理 內核調度

進程管理:

什麽是文件?
其實就是磁盤上的存儲空間(一段數據流)

存儲方式有:
二進制存儲或者是文本存儲(字節存儲和2進制大有不同,2進制更緊湊)

技術分享圖片

SHELL腳本
是純文本的,不能單獨執行,用的就是bash解釋器(#!/bin/bash)
無論是可執行文件(像ls,cat,這些二進制執行文件)和shell腳本(純文本,由bash解釋器去執行),都是最終成為一個數據流的,交於CPU去處理的。
shell腳本是交給/bin/bash運行,而ls,cat這些可執行文件,也是有依賴公共庫文件的
技術分享圖片

程序只要讀數據和輸出數據,其實都是I/O數據流的
進程是程序的實例,各個進程不會互相幹擾和識別的

技術分享圖片

內核的作用:
內核是資源調度工具,上圖的箭頭,其實都是由內核去管理的,分配管理各個進程和CPU處理機制相關的東西。

Linux本身就是搶占式多任務的(根據時鐘驅動去搶占)
程序和內核申請資源的話,才能由內核調度給CPU去運行

CPU的計算能力:
是靠時間流逝來進行的
內存的計算能力呢?是空間,大多為分頁內存空間,也叫作內存頁面(page frame: 頁框),而且這個頁框是固定大小的
運行程序不是加載程序所有,可能就是加載了一部分,使用固定大小的頁框去存儲
這個跟磁盤上的磁盤塊其實也是差不多的

進程在使用內存空間的時候的機制?
進程不知道內存中是不連續的,而內核是知道的,所以內核都是虛擬了一個空間給進程,讓進程以為自己在內存的空間都是連續的,而且每一個進程都以為自己有一個固定大小的內存使用,如果是32位系統,進程都會以為他有4G的內存可用

技術分享圖片

進程以為自己在內存中的頁框都是連續的

Linux的Swap分區就是Window的虛擬內存(Window的這樣說法是不太合適的)
因為Swap分區它只是存儲一些最近最少使用的,騰出內存空間給新的進程使用,而硬盤保存的只是臨時存儲的,需要交給CPU再次處理的話,還是需要交還給內存再傳送的。

內存映射(產生:共享內存空間)如下圖:

技術分享圖片

Linux中,所有進程的父進程(守護進程)都是init,而Centos7.0+之
後父進程(守護進程)都是systemd
init -->
父進程終止子進程,也需要跟內核去申請去執行的,所以每一個進程都有一定的記錄信息,讓父進程或者是我們用戶本身去找到這個進程,通常我們就是用的進程ID去管理這個進程

fork()

C語言的追蹤進程的方式:雙向循環鏈表

技術分享圖片

所謂查看進程數據,就是通過數據結構的標示去訪問的
不然我們去訪問/proc的話,根本是看不懂的,這就需要進程管理工具幫我們去查看並顯示成我們能夠接受清晰的數據
父進程調度子進程,相當於領導分派任務,你給我返回一個結果就行了,返回結果之後,父進程在繼續往下執行

進程之間可以共享共享庫,不過是不能共享數據的
比如兩個進程不能同時打開一個文件

線程是一個進程的多個實例
技術分享圖片

CPU是有保護機制的,之前說的環0,1,2,3(普通的在環3,內核的在環0;23沒用先)
CPU時鐘驅動:
是根據以下去占用CPU去讓CPU執行的
進程優先級:
進程調度:進程調度是內核的核心功能之一

公平:
結果公平:
起點公平:

技術分享圖片

每一個進程剛創建的時候優先級是一樣的,當某一個進程占據CPU時間過長,就要降低優先級,而一些沒有用的就需要加大優先級,而這個也是有內核去完成的

如下:
就是線性地址空間組織結構圖
棧放的是本地變量
堆一般放文件中的數據啊,等等
技術分享圖片

上圖可以看到
4GB的內存,其中1GB給了內核,3G給了其他

Linux一共有140個隊列,也就是有140個優先級
0-99實施優先級,是屬於內核管理的優先級。越大,優先級越高,所以99的優先級是最高的
而100-140屬於用戶可以設置的,也就是所謂的Nice值,對應著就是-19到+20,值越小優先級越高

有了這些概念,就可以學習一些進程管理的命令了。

6、進程知識(參合內核調度知識)