linux——进程管理

本篇博客,纯属博主自初学阶段对知识的系统复习 ,如有错误还望指出,感谢!

一 、 比较程序与进程

程序是静态保存的代码 , 进程是动态运行的代码 ;程序是文件 , 进程是正在运行的程序(程序的一个执行实例)


通过查阅资料,对进程在进一步了解: 

从内核观点来看,进程是担当分配系统资源的实体。

进程是两个基本元素是 程序代码 和 代码相关联的数据集

进程是⼀种动态描述,但是并不代表所有的进程都在运⾏。(进程在内存中因策略或调度需求,会处于各种状态)


二 、 如何查看进程信息

使用ps命令查看系统进程

显示所用进程 : ps aux | less

-A:显示所有进程
a:显示终端中包括其它用户的所有进程
x:显示无控制终端的进程

基本使用举例

任务1:查看系统中的每个进程。

# ps -A
# ps -e
任务2: 查看非root运行的进程
# ps -U root -u root -N
任务3: 查看用户vivek运行的进程
# 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调用创建一个新的进程。新的进程或者说子进程是调用进程的或者说父进程的副本。

使用举例: 

<span style="font-size:14px;color:#009900;">#include<unistd.h>

pid_t fork(void);</span>
如果fork执行成功,就向父进程返回子进程的PID,并向子进程返回0 ; 如果创建失败,返回-1   。也就是fork有两个返回值

具体过程如图:



六 、 进程状态

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进程对它们完成状态收集工作。 

僵尸进程将会导致资源浪费,而孤儿则不会。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值