多年前的一個午后,那時陽光燦爛,正值青春,那天我第一次遇到了ta。--進程
1.什么是進程?
進行是程序的一次動態執行過程.(有動態性,和周期性)
進程是獨立擁有資源(什么資源呢)的基本單位很執行的基本單位。
2在計算機中,進程是什么?
進程是一個數據結構,數據結構中有個屬性是p_id,就是進程的id;ppid是該進程的父id,還有進程所處的狀態。運行?阻塞,僵屍(Z)等,以后細講。
3.如何查看進程?
windows先任務管理器,linux ps等命令。
4linux.進程之間是如何組織的?
進程之間是一種樹結構,父子關系。使用pstree,就如同下面
init─┬─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─accounts-daemon───{accounts-daemon} ├─acpid ├─apache2─┬─apache2 │ └─2*[apache2───26*[{apache2}]] ├─at-spi-bus-laun───2*[{at-spi-bus-laun}] ├─atd ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─colord───2*[{colord}]
我們看到init進程是所有進程的祖宗,以后的孤兒進程和僵屍進程將會說。
剛才你說進程擁有的自己的資源,是指內存資源,也就是地址空間,每個進程都有自己的地址空間,那么這個地址空間都是什么呢?(C語言的經典例子)http://soft.chinabyte.com/os/51/12324551.shtml(參考)
程序的一次執行過程就是進程,寫個C程序吧,然后運行它,我們就會發現多個進程了同時注意下面說的都是虛擬地址空間。
1、text:看名字知道是文本段,C里面就是代碼段,可以這么理解,其實存的是機器指令。
2.初始化段: 存的是初始化的變量,如果在代碼中 int a=5;說明a初始化了。
2.未初始化段: int a[100],定義了,但是沒初始化,會被初始化為0;
3.堆和棧很重要,仔細講講,(java中的堆和棧是干啥的?)
1首先看圖,堆向上生長,棧向下生長。
2.我們知道在new 創建的對象一定要delete(java呢?),ta就分配在堆上,說白了,就是程序員自己分配的內存要自己釋放,他們可以沒有垃圾回收。
3.對於棧,是程序自己管理的,例如局部變量和臨時變量等,進程結束,全部自動釋放。(這個棧和數據結構中的棧有啥關系,還真有關系,有空會寫程序如何調用的,最后遞歸的實現原理)。
好了,那普通的的進程的地址空間什么樣呢?
其實大同小異。
http://blog.csdn.net/wangxiaolong_china/article/details/6844325(參考)
void print(char *str,intp) { char *s1 = "abcde";//abcde在常量區,s1在棧上 char *s2 = "abcde";//abcde在常量區,s2在棧上 s2-s1=6可能等於0,編譯器優化了相同的常量,只在內存保存一份 //而&s1>&s2 char s3[] = "abcdeee";//abcdeee在常量區,s3在棧上,數組保存的內容為abcdeee的一份拷貝 long int *s4[100]; char *s5 = "abcde"; int a = 5; int b =6; int c; int d;//a,b,c,d均在棧上,&a>&b>&c>&d地址反向增長 char *q=str;// int m=p;// char *r=(char *)malloc(1); char *w=(char *)malloc(1);// r<w 堆正向增長 printf("s1=%p s2=%p s3=%p s4=%p s5=%p na=%p b=%pc=%p d=%pn str=%pq=%p p=%p m=%p r=%p w=%pn", s1,s2,s3,s4,s5,&a,&b,&c,&d,&str,q,&p,&m,r,w); } /* 棧和堆是在程序運行時候動態分配的,局部變量均在棧上分配。棧是反向增長的,地址遞減;malloc等分配的內存空間在堆空間。堆是正向增長的,地址遞增。 r,w變量在棧上(則&r>&w),r,w所指內容在堆中(即r<w)。*/
下面將會主要看看java的內存分配