本篇博客,纯属博主自初学阶段对知识的系统复习 ,如有错误还望指出,感谢!
一 、 比较程序与进程
程序是静态保存的代码 , 进程是动态运行的代码 ;程序是文件 , 进程是正在运行的程序(程序的一个执行实例)
通过查阅资料,对进程在进一步了解:
从内核观点来看,进程是担当分配系统资源的实体。
进程是两个基本元素是 程序代码 和 代码相关联的数据集
进程是⼀种动态描述,但是并不代表所有的进程都在运⾏。(进程在内存中因策略或调度需求,会处于各种状态)
二 、 如何查看进程信息
使用ps命令查看系统进程
显示所用进程 : ps aux | less
-A:显示所有进程
a:显示终端中包括其它用户的所有进程
x:显示无控制终端的进程
基本使用举例:
任务1:查看系统中的每个进程。
任务2: 查看非root运行的进程# ps -A # ps -e
任务3: 查看用户vivek运行的进程# ps -U root -u root -N
# ps -u vivek
当然还有其他命令:top 动态显示程序的进程
继续理解深入可参考:http://blog.csdn.net/fdipzone/article/details/43992153
三 、 进程描述
⼴义上,所有的进程信息被放在⼀个叫做进程控制块的数据结构中,可以理解为进程属性的集合
每一个进程在内核都有一个进程控制块(PCB)来维护进程相关信息。Linux的进程控制块就是task_struct结构体
关于task_struct可以查看http://blog.csdn.net/my_heart_/article/details/52315640
进程都以 task_struct 链表的形式存在内核
四 、 进程位置
C程序在执行过程中 , 经历 预处理、编译、汇编、链接 四个过程。 程序是怎么转化成为进程的呢?
程序-->进程:1 、内核将程序读入内存,为程序 分配你内存空间
2、 内核保存进程的pid及相应的状态信息 , 把程序 放到运行队列中等待执行(程序转化成为进程就 可 被操作系统调度执行了)
在这个过程中内核是如何存放可执行程序呢?
这就要谈到进程的内存映像,进程的内存映像就是内核在内存中如何存放可执行程序文件。具体如下图:
进程内存映像的位置依赖于使用内存的解决的方案。
五 、 进程的创建
在linux中,进程的创建主要有 fork 、 vfork 、 clone 三种方式。
fork
fork调用创建一个新的进程。新的进程或者说子进程是调用进程的或者说父进程的副本。
使用举例:
如果fork执行成功,就向父进程返回子进程的PID,并向子进程返回0 ; 如果创建失败,返回-1 。也就是fork有两个返回值<span style="font-size:14px;color:#009900;">#include<unistd.h> pid_t fork(void);</span>
具体过程如图:
六 、 进程状态
Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。
进程的各个状态如图:
这里对S、D、Z状态着重说明。
S(sleep):睡眠状态 , 是浅睡眠(可中断的睡眠)
D(disk sleep):睡眠状态 ,是深度睡眠(不可中断睡眠)
Z(zombie):僵尸状态 ,父进程没退出而子进程退出时 子进程 的状态(子进程已死,父进程还活着)。
下面实战,了解僵尸状态:
<span style="font-size:14px;">#include <stdio.h>
#include <sys/types.h>
int main()
{
//fork a child process
pid_t pid = fork();
if (pid > 0) //parent process
{
printf("in parent process, sleep for one miniute...zZ...\n");
sleep(60);
printf("after sleeping, and exit!\n");
}
else if (pid == 0)
{
//child process exit, and to be a zombie process
printf("in child process, and exit!\n");
exit(0);
}
return 0;
}</span><span style="font-size:18px;">
</span>
过了一会之后 ,我们发现子进程不见了 , 那么谁来给它收尸呢?
没有他人,就是系统(父进程死掉之后,其所有子进程过继给 init 进程,init 进程成为该僵尸进程的新进程,init 进程会周期性地去调用 wait 系统调用来清除它的僵尸孩子。因此,你会发现上面例子中父进程死掉之后,僵尸进程也跟着消失,其实是 init 进程为其收尸的!)
具体可参考: http://www.cnblogs.com/hazir/p/zombie_process.html
七 、 进程的优先级
进程cpu资源分配就是指进程的优先权( priority)。优先权高的进程有优先执行权利。
上面二 讲的,查看系统进程:
PRI的值越小, 那么它的优先级就越高,就会越快被执行。加入nice值后的PRI::PRI(new) = PRI(old) + nice
(当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行)
经过测验得到:
nice最小是 -20 ,最大是 19
PRI最小是 60 , 最大是 99
那么如何修改nice值呢?
有nice,renice两条命令:
参考:http://blog.csdn.net/codestinity/article/details/7496962
对于输入命令后系统做的一些动作,(纯属个人理解)如图:
参考:http://blog.sina.com.cn/s/blog_62ef2f1401011wmo.html
最后,能看到这里的读者,一方面肯定了我的成果,另一方面你也是勤学的人,那我就在讲一点:
僵尸进程:一个子进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程将会导致资源浪费,而孤儿则不会。