linux高級編程-1.Linux內存管理**

1.Linux內存管理

進程內存空間管理
任意一個程序內存空間分爲四個基本部分:
1>.代碼區 常量,函數
2>.全局區棧區 :全局變量,static靜態變量
3>.堆 指針,進程中會被動態分配的內存段
4>.局部棧 變量
上面所展示的不是物理地址,而是爲邏輯內存分佈,邏輯地址僅僅是編號,編號使用int4字節整數表示。邏輯地址與物理地址關聯纔有意義–這個過程就是內存映射。
進程對內存具體是如何進行分配和管理的。
邏輯地址-通過段機制->線性地址-通過頁機制->物理地址。(但是我們要知道Linux系統雖然保留了段機制,但是將所有程序的段地址都定死爲0-4G,所以雖然邏輯地址和線性地址是兩種不同的地址空間,但在Linux中邏輯地址就等於線性地址,它們的值是一樣的)。
Linux操作系統採用虛擬內存管理技術,使得每個進程都有各自互不干涉的進程地址空間。該空間是塊大小爲4G的線性虛擬空間,用戶所看到和接觸到的都是該虛擬地址,無法看到實際的物理內存地址。利用這種虛擬地址不但能起到保護操作系統的效果(用戶不能直接訪問物理內存),而且更重要的是,用戶程序可使用比實際物理內存更大的地址空間(具體的原因請看硬件基礎部分)。
段錯誤:無效訪問,地址沒有映射到物理地址。
合法訪問:例如malloc分配空間之外的空間是非法訪問。
物理內存管理(頁管理)
Linux內核管理物理內存是通過分頁機制實現的,它將整個內存劃分成無數個4k(在i386體系結構中)大小的頁,從而分配和回收內存的基本單位便是內存頁了。
內核中分配空閒頁面的基本函數是get_free_page/get_free_pages,它們或是分配單頁或是分配指定的頁面(2、4、8…512頁)。

注意:get_free_page是在內核中分配內存,不同於malloc在用戶空間中分配,malloc利用堆動態分配,實際上是調用brk()系統調用,該調用的作用是擴大或縮小進程堆空間(它會修改進程的brk域)。如果現有的內存區域不夠容納堆空間,則會以頁面大小的倍數爲單位,擴張或收縮對應的內存區域,但brk值並非以頁面大小爲倍數修改,而是按實際請求修改。因此Malloc在用戶空間分配內存可以以字節爲單位分配,但內核在內部仍然會是以頁爲單位分配的。

另外,需要提及的是,物理頁在系統中由頁結構struct page描述,系統中所有的頁面都存儲在數組mem_map[]中,可以通過該數組找到系統中的每一頁(空閒或非空閒)。而其中的空閒頁面則可由上述提到的以夥伴關係組織的空閒頁鏈表(free_area[MAX_ORDER])來索引。
在這裏插入圖片描述
內存映射函數–brk/sbrk
sbrk/brk: brk和sbrk主要的工作是實現虛擬內存到內存的映射.

**進程的一些相關命令:**
**1./proc**一種僞文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關係統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。
目錄中包含許多以數字命名的子目錄,這些數字表示系統當前正在運行進程的進程號,裏面包含對應進程相關的多個信息文件。
cd /proc, ll /proc
**2.cmdline** — 啓動當前進程的完整命令,但殭屍進程目錄中的此文件不包含任何信息;
more /proc/2674/cmdline 
**3.cwd** — 指向當前進程運行目錄的一個符號鏈接;
**4.environ** — 當前進程的環境變量列表,彼此間用空字符(NULL)隔開;變量用大寫字母表示,其值用小寫字母表示;
more /proc/2674/environ 
**5.exe** — 指向啓動當前進程的可執行文件(完整路徑)的符號鏈接,通過/proc/N/exe可以啓動當前進程的一個拷貝;
**6.fd** — 這是個目錄,包含當前進程打開的每一個文件的文件描述符(file descriptor),這些文件描述符是指向實際文件的一個符號鏈接;
 ll /proc/2674/fd
**7.maps** — 當前進程關聯到的每個可執行文件和庫文件在內存中的映射區域及其訪問權限所組成的列表;
cat /proc/2674/maps 

2.linux 權限問題:
在linux系統中,一切皆是文件,一切文件皆有權限
目錄是一個特殊的文件,而目錄記錄的是此目錄下所有文件和目錄的權限
在linux系統中,權限分爲r(可讀)w(可寫)x(可執行) p(保護/私有)
查看目錄的權限ll或者ls -l
權限的是針對用戶的owner(主)group(組)other(其它用戶)
對於一個用戶來說,沒有任何一個用戶是沒有組的,在新建一個用戶的時候,如果沒有給此用戶指定組,系統則自動以此用戶名新建一個組。
權限位和修改:
rwx rwx rwx 所有者 所有者所在的組 其他用戶
如果用數字表示,r=4,w=2,x=1。
使用chmod 命令修改權限:chmod [參數] [模式] <文件或者目錄>;
[參數] -c 只有在文件的權限確認改變才進行詳細說明
-f 不輸出權限不能改變的文件的錯誤
-v 詳細說明權限的變化
-r 改變目錄及其子目錄的文件的權限(比較有用)
[模式] [ugoa] [±=] [rwxXs]
u:文件的所有者
g:所有者所在的組
o:其他的組
a:其他的用戶
+:增加
-:去掉
=:指定文件的權限

r:是讀的意思
w:是寫的意思
x:是執行
X:只有目標文件對某些用戶是可執行的火災該目標文件是目錄是才追加X屬性。
t:T位,拒絕刪除的權限位
s:設置SUID,SGID,指擁有這樣的權限的可執行程序當某一用戶執行的時候擁有屬主或者屬主所在的組的權限。

當然,你也可以使用數字來表示權限,用數值請注意了
XYZ,四個位
x代表文件的類型,你只有通過mc才能看到。
y代表SUID,SGID,T位,其中SUID=4,SGID=2,T位=1
Z代表權限位r=4,w=2,x=1

比如現在我要修改一個文件的權限,讓它的權限爲屬主擁有所有權限,屬主所在的組擁有讀和寫的權限,其他用戶擁有讀的權限,並防止其他用戶刪除我的文件。那麼執行
#chmod 1764 myfile
用字符表示就是
#chmod u+rwx,g+rw,o+r,a+T myfile
修改屬主和屬主所在的組
使用chown來修改
比如你要將myfile的屬主修改爲nicry的,那麼請使用
#chown nicry myfile
如果你要將文件的屬主所在的組改爲sohubbs組,請使用
#chown .sohubbs myfile
和在一塊就是
#chown nicry.sohubbs myfile
注意,該命令爲root專用。

進程線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章