进程概念

进程


进程概念

为了使程序并发的执行,并且对并发执行的程序加以描述和控制,人们引入了进程的概念,进而提高了硬件设备的利用率与系统的吞吐量。

进程:是指在系统中作为系统资源分配的基本单位,由机器指令、数据和堆栈组成,是一个独立运行的活动实体。

操作系统用于描述和管理进程的一个数据结构,称为进程控制块(Process Control Block, PCB);

进程实例:由程序段, 相关的数据段, 和PCB;
创建进程:实际上是创建相应的PCB, 操作系统分配相配套的资源;
销毁进程:实际上就是释放进程占有的资源,回收PCB;

Linux下:

PCB是task_struct结构体;

在本人linux系统下task_struct定义在
/usr/src/kernels/2.6.32-431.el6.i686/include/linux路径下的sched.h文件

这里写图片描述

task_struct 描述信息分类:

  • 标示符 : 描述本进程的唯一标识符,用来区别其他进程。
  • 状态 :任务状态,退出代码,退出信号等。
  • 优先级 :相对于其他进程的优先级。
  • 程序计数器:程序中即将被执行的下一条指令的地址。
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
  • 上下文数据:进程执行时处理器的寄存器中的数据。
  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其它信息;
通过系统调用获取进程ID
  • PID :进程ID
  • PPID:父进程ID

这里写图片描述

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


int main()
{
    printf("pid :%d\n", getpid);
    printf("ppid :%d\n", getppid);

    return 0;
}

这里写图片描述

通过系统调用创建进程

这里写图片描述
函数调用成功 父进程返回子进程ID, 子进程返回0
失败返回-1

#include <stdio.h>
#include <unistd.h>



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

这里写图片描述

可以看到两个进程间是交替运行的。

fork() 创建出来的进程,父子进程代码共享,数据各自开辟空间, 各有一份(写实拷贝)。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
    int data = 10;
    pid_t pid;
    if((pid = fork()) < 0)
    {
        perror("fork");
        return 1;
    }
    else if(pid == 0)
    {
       //child
     while(1)
     {
         sleep(1);
         printf("child data : %d, pid = %d, ppid = %d\n",\
                         data, getpid(), getppid());

     }
    }
    else
    {
    //father
      while(1)
      {
       sleep(1);
       printf("father data: %d, pid = %d, ppid = %d\n", data,\
                       getpid(), getppid());
      }
    }
    return 0;
}

这里写图片描述

进程状态

linux下进程状态
这里写图片描述

这里写图片描述

  • R运行状态(running):并不意味进程一定在运行中,它表明进程要么是在运行中要么在运行队列中。
  • S睡眠状态(sleeping):意味进程在等待某件事情的完成(有时也叫可中断睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep)有时叫作不可中断睡眠状态(uninterruptible sleep), 通常这个状态的进程会等待IO的结束。
  • T停止状态(stopped) : 可以通过发送SIGSTOP信号给进程停止(T)进程,可以通过发送SIGCONT信号让进程继续运行。
  • X死亡状态(dead): 这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
进程优先级

CPU分配资源的先后顺序 ,就是指进程的优先级(priority)

ps -l 命令
这里写图片描述

PRI:表示进程优先级
NI:代表进程nice值

PRI值越小,表示权限越高。
PRI与NI关系:
PRI(new) = PRI(old) + nice

  • nice 取值范围-19~20, 一共40个级别。

修改进程优先级命令:
nice/renice/top

nice: 启动进程前设定进程nice值
  nice -n -3   ./a.out
  设置进程nice为-3
renice: 进程已存在时设定进程nice值
  renice -3 -p   2455  
  设置进程pid为2455的nice值为-3
top: 进程已存在时设定进程nice值
  top
  进入top后输入 r ——> 输入进程pid  -->输入 nice 值 

欢迎各位,批评指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值