进程的概念、特点详细介绍及Linux系统中进程控制

进程的定义

对于操作系统中,程序时存放存储介质上的一个可执行文件,进程时程序执行实例,包括程序计数器,寄存器和变量的当前值。
程序是静态的,进程是动态的
简单来说:程序是一些指令的有序集合,而进程是程序执行的过程。
进程的状态是变化的,即创建,调度,消亡。

进程的状态及转换

进程整个生命周期可以划分为三种状态:
就绪态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间。
执行态:该进程正在占用CPU运行。

等待态:该进程因不具有某些执行条件而暂时无法继续执行的状态。
请添加图片描述
通常进程有以下五种状态,前三种是进程的基本状态。

1.运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。
2.就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。
3.阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。
4.创建状态:进程正在被创建,尚未转到就绪状态。创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分 配运行时所必需的资源;最后把该进程转入到就绪状态。
5.结束状态:进程正从系统中消失,这可能是进程正常结束或其他原因中断退出运行。当进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和 回收等工作。

进程控制块

PCB Progress Control Block
OS是根据PCB来对执行的进程进行控制和管理的,系统创建一个进程的时候会开辟一段内存空间存放与此进程相关的PCB数据结构。
PCB是操作系统中最重要记录型数据结构。PCB记录了用于描述进程进展情况及控制进程运行所需的全部信息。
PCB是进程存在的唯一标志,在Linux系统中存放在task_struct结构体中。

进程控制

每个进程都由一个进程号标识,其类型为pid_t 范围:0-32767
进程号总是唯一的,但可以重用, 当一个进程终止后就可以再次使用了。
Linux系统中进程号由0开始
进程号为0和1的进程由内核创建:
进程号0的进程通常调度进程,常被称为交换进程。
进程号1 的进程通常是init进程,除调度进程外,linux下面所有进程都由init进程直接创建或间接创建。

进程号

进程号PID:表示进程的一个非负整数。
父进程号:任何一个进程(除init进程)都是由另外一个进程创建,该进程成为被创建进程的父进程,对应父进程号PPID.
进程组号PGID:进程组是一个或者多个进程的集合。
下面我们介绍几个LINUX系统中的过的进程号的函数


头文件<sys/types.h>
<unistd.h>
pid_t getpid(void)
返回本进程PID
pid_t getppid(void )
返回此函数的进程的父进程号ppid
pid_t getpgid(pid_t pid)
参数:0为当前pgid,否则为指定进程的pgid
返回进程组号

创建进程

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


pid_t fork(void);
//从一个已存在的进程中创建一个新进程,新进程被称为子进程,原进程成为父进程。
成功,紫禁城返回0,父进程返回子进程id
失败返回-1

使用fork创建的子进程是父进程的一个复制品,从父进程处继承了整个进程的地址空间包括,上下文,进程堆栈,打开的文件描述符,信号控制设定,进程优先级,进程组号
子进程只独有它的进程号和计数器

请添加图片描述

特殊进程

僵尸进程

父进程未运行结束,已运行结束的子进程。

孤儿进程

父进程运行结束,但子进程未运行结束的子进程。

守护进程

守护进程是个孤儿进程,他提供系统服务,常常在系统启动时启动,在系统关闭时才终止

进程挂起

进程在一段时间内没有任何动作
<unistd.h>
unsigned int sleep(unsigned int sec);
进程挂起指定的秒数,知道指定的时间用完或收到信号才解除挂起。

进程等待函数

父子进程有时需要简单的进程间同步,如父进程等子进程的结束。
LInux中提供了两个等待函数wait() waitpid();
<sys/types.h>
<sys/wait.h>


pid_t wait(int *status);
等待子进程改变状态,如果子进程终止了,此函数会回收子进程的资源。
参数:函数返回时,参数status包含子进程退出时的状态信息。子进程的退出信息在一个int中包含了多个字段,用宏定义可以取出其中的每个字段。
WIFEXITED 如果子进程是正常终止的,取出的字段值非零。

WEXITSTATUS 取出的字段值为子进程调用exit函数返回的值,用此宏前应先用宏WIFEXITED判断子进程是否正常退出,正常退出才可以使用此宏
pid_t waitpid(pid_t pid ,int *status,int options);
等待子进程改变状态,如果子进程终止了,此函数会回收子进程的资源。
成功返回子进程id

失败返回-1
   
   参数pid取值
pid>0等待进程id等于pid的子进程
pid=0 等待同一个进程组中的任何子进程,如果子进程已经加入别的进程组,waipid不会等待他。
pid=-1等待任一子进程,此时waitpid和wait'作用一样。
pid<-1等待指定进程组中的任何子进程,这个进程组ID等于pid的绝对值 
options参数:
0 同wait  阻塞父进程,等待子进程退出
NOHANG 没有任何已经结束的子进程,则立即返回。
WUNTRACED 如果子进程已暂停则马上返回,且子进程结束状态不予理会。

结束进程

Linux中可以通过以下方式结束正在运行的进程:
void exit(int value);
库函数

void _exit(int value);
系统调用

请添加图片描述

进程在退出时可以用atexit函数注册推出处理函数。
<stdlib.h>
itn atexit(void (*function) (void));

atexit是注册进程正常结束前调用的函数。
function  进程结束前,调用函数的入口地址
一个进程中可以多次调用atexit 函数注册清理函数,正常结束前函数的顺序和注册时的顺序相反。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值