Linux:进程的概念

1.进程的概念

进程根据字面意思,无非就是正在执行或者正在运行的程序。

但是在内核观点上理解,它就是担任分配系统资源的实体。

2.描述进程

linux中,每一个进程都由task_struct 数据结构来定义,而它就是我们常说的PCBprocess control block),它是对进程控制的唯一手段,也是最有效的手段,他对被装载到RAM里并包含这进程的信息。

task_struct内容的简述:

  1. 进程的状态:记录进程的状态,等待,运行或者阻塞等等
  2. 标识符:描述本进程的唯一标识符,用来区别其他进程
  3. 优先级:和其他进程相比优先级的大小
  4. 内存指针:指向程序运行的代码和数据
  5. 上下文数据:cpu在对进程进行切换调度时,保存数据
  6. 程序计数器:即将执行的下一个指令的地址
  7. IO状态信息:包含显示的IO请求,分配给进程的IO设备和被进程使用的文件列表
  8. 记账信息 :可能包括处理器时间总和,使用的时钟总和,时间限制,记账号等
  9. 其他信息

3.查看进程信息的命令

          ps   -ef    查看所有的进程信息
          ps   -ef|grep   xxx(可执行的程序)   查看某一个可执行程序具体的进程信息                               
          ps aux    查看的比较详细
          top         能够实时显示系统中各个进程的资源占用状况
          getpid     系统调用接口,在代码中获取进程pid


4.创建一个进程

我们通常使用fork指令来创建一个进程,我们可以使用man fork来了解linux下fork的相关概念。

使用fork系统调用通过复制调用进程来创建一个新的进程,调用进程我们称之为父进程
创建出来的新进程称之为子进程
fork函数对于父进程来说,返回值是子进程的pid
                   对于子进程来说,返回值是0;

因为子进程是以父进程为模板来创建的,因此父子进程的代码段是完全一样的,也就是说他们运行的程序是一样的,我们用户就是通过对返回值的判断来分辨父子进程,来进行代码分流,父子进程返回值不同,公用同一个代码段,但是他们的数据并不共用。

  

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
    pid_t ret = fork();
    if(ret < 0){
        perror("fork");
        return 1;
    }
    else if(ret == 0){ //child
         printf("I am child : %d!, ret: %d\n", getpid(), ret);
    }else{//father
    printf("I am father : %d!, ret: %d\n", getppid(), ret);
    }
    sleep(1);
    return 0;
}

5.进程的状态

我们在linux内核种可以看到进程的不同状态。

R  running      (运行状态)         并不意味着进程一定在运行,它表明进程要么在运行当中,要么在运行队列之中

S  sleeping     (睡眠状态)         进程在等待时间完成  

D  Disk sleep  (磁盘休眠状态) 也可以叫作不可中断睡眠状态,在这个状态的进程通常会等待IO的结束

T  stopped     (停止状态)         可以通过发送SIGSTOP信号来停止进程,这个暂停的进程可以通过发送SIGCONT让进程继续运行

X  dead         (死亡状态)         这是一个返回状态,不会再任务列表中看到

 

(1)僵尸进程

  产生原因:子进程先于父进程退出,它要保留退出原因在pcd中,incident退出后不会释放所有资源,子进程退出后操作系统会通知父进程                     这个家属说子进程退出了,你去获取一下原因,然后完全释放子进程资源,假如父进程不管子进程的退出状态,那么这个子进                      程将进入将死状态,,成为僵尸进程。

#include<stdio.h>
#include<stdlib.h>
int main()
{
        pid_t id=fork();
        if(id<0)
        {
                perror("fork");
                return -1;
        }
        else if(id>0)
        {
                printf("parent[%d] is sleeping ...\n",getpid());
                sleep(60);
        }
        else
        {
                printf("child[%d] is  begin z  ....\n",getpid());
                sleep(5);
                exit(EXIT_SUCCESS);
        }
        return 0;
}

Z+状态就是僵尸态

危害:父进程创建了子进程,但是没有回收,这个僵尸进程一直占着资源,没有释放,就造成了资源的泄漏。

 

(2)孤儿进程

父进程先于子进程退出,子进程将成为孤儿进程。 父进程变成init进程,子进程如果后来退出了,init进程将负责释放资源,init进程
将负责释放资源,所以孤儿进程最后不会变成僵尸进程。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
        pid_t id=fork();
        if(id<0)
        {
                perror("fork");
                return -1;
        }else if(id==0)
        {
                printf("i an child,pid:%d\n",getpid());
                sleep(1);
        }
        else
        {
                printf("i am parent,pid:%d\n",getpid());
                sleep(1);
        }
        return 0;
}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值