linux知识点----进程

更多知识点:linux目录索引


进程

  • 概念

    从用户角度:进程就是程序的一次动态执行过程

    从操作系统角度:操作系统分配内存,CPU时间等系统资源的基本单位

  • 特点

    1.每一个进程都有自己独立的虚拟地址空间和进程状态

    2.进程是分配资源的最小单位(基本单位)

  • 进程和程序的区别和联系

    联系:

    1.程序=文件(静态的可执行文件)

    2.进程=执行中的程序=程序+执行状态

    3.同一个程序的多次执行对应为不同的进程(ls的多次执行对应多个不同进程)

    4.进程执行需要的资源:内存(保存代码和数据)+cpu(执行指令)

    区别:

    1.程序是静态的,进程是动态的

          程序是有序代码的集合
          进程是程序的执行,进程有内核态/用户态
    

    2.进程相对于程序的生命周期是短暂的,程序是永久的

    3.进程有PCB的数据结构

        程序:数据段+代码段
        进程:代码段+数据段+堆栈+PCB
    

    4.一个进程只能对应一个程序,一个程序可以对应多个进程


进程控制块(PCB)
  • 概念:

    操作系统感知一个进程存在的重要数据结构,进程存在的唯一标识,操作系统管理控制进程运行所用的信息集合

  • 原因:

    进程是程序的一次执行过程,需要保存进程的现场信息,这些信息需要一个数据结构来保存,在c语言中用结构体,我们将这个结构称为PCB

  • 使用:

    进程创建—-生成该进程的PCB
    进程终止—-回收PCB
    进程的组织管理—-通过PCB的组织管理来实现

  • PCB中包含的信息

    进程标识符
    进程状态
    进程间的通信信息
    进程优先级
    各种时间信息
    内存使用情况
    寄存器的信息(保存现场)

  • PCB组织形式

线性形式

不分状态组织在一个连续表中

优点:简单,不需要额外开销,适用于进程数目不多的系统

缺点:需要扫描整个PCB表

image

索引方式

对于具有相同状态的进程,分别设置各自的PCB索引表,表目为PCB在PCB表(线性表)中的地址。

两种表:就绪索引表和等待索引表

image


进程状态

进程的动态性表明进程在其生存期内需要经历一系列的离散状态。

  • 进程的三种状态

运行状态(Running): 指进程已获得CPU,并且在CPU上执行的状态。显然,在一个单CPU系统中,最多只有一个进程处于运行态。

就绪状态(Ready): 指一个进程已经具备运行条件,但由于没有获得CPU而不能运行所处的状态。一旦把CPU分配给它,该进程就可运行。处于就绪状态的进程可以是多个。

等待状态(Waiting): 也称阻塞状态(Blocked)或封锁状态。是指进程因等待某种事件发生而暂时不能运行的状态。

这里写图片描述


  • linux下进程的七态

运行状态:不意味着进程一定在运行中,表明进程要么在运行中要么在运行队列中

可中断睡眠:进程在等待时间完成

不可中断睡眠(磁盘休眠状态):进程通常等待IO结束

暂停(停止):可以通过发送SIGTOP信号给进程来停止进程。这个停止的进程可以通过发送SIGCONT信号让进程继续进行

死亡:只是一个返回状态,不会在任务列表中看到

这里写图片描述


进程标识符
  1. 操作系统会给每个进程分配一个独一无二的编号

  2. 编号的范围:[2-cat /proc/sys/kernel/pid_max]


查看进程
 ps aux | grep 03Fork.c | grep -v grep

进程死亡状态
  • 僵尸进程

    1. 如果子进程死亡,父进程存在,子进程称为僵尸进程。

    2. 僵尸进程会占用少量系统资源。

    3. 僵尸进程有害,僵尸进程不可人为杀死,会一直等待父进程死亡

  • 僵尸进程的危害

    1. PCB会一直维护僵尸进程

    2. 内存资源的浪费

    3. 内存泄露

例子:一个维持30秒僵尸进程

#include<stdio.h>
#include<sys/types.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("parent[%d] is sleeping...\n",getpid());
        sleep(30);
    }
    else
    {
        printf("child[%d] id begin z...\n",getpid());
        sleep(5);
        exit(EXIT_SUCCESS);
    }
    return 0;
}

效果:

这里写图片描述


  • 孤儿进程

    1. 如果父进程死亡,子进程存在,子进程称为孤儿进程。

    2. 孤儿进程托管给1号进程,1号进程为孤儿院

例子:

#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 am child,pid: %d\n",getpid());
        sleep(10);
    }
    else
    {
        printf("I am parent,pid: %d\n",getpid());
        sleep(3);
        exit(0);
    }
    return 0;
}

这里写图片描述


进程优先级
  • 概念
    cpu分配资源的先后顺序,指进程的优先级

    优先权高的进程有优先执行的权利。配置进程优先权可以改善系统的性能

  • 查看系统的进程:ps -l

  • 修改进程优先级:nice -n(调整的数值) 程序名

    修改nice值,:-20~19,共40个级别

    nice为负,优先级值变小,优先级升高

    nice为正,优先级值变大,优先级降低

  • 修改已存在的程序优先级:renice -n(调整值) -p 进程ID

  • top命令修改已存在的进程的nice:

    top

    进入top后,按‘r’->输入进程PID->输入nice值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值