Linux——进程管理

目录

进程的概念

定义

程序与进程的区别

进程运行的状态

Linux进程管理

ps aux 命令

 top命令

 pgrep命令

kill命令 

进程控制块

进程的标识

简介

函数调用 

创建进程

fork函数

孤儿进程

僵尸进程

wait函数

 终止进程


进程的概念

定义

  • 进程是一个程序一次执行的过程,同时也是资源分配的最小单元

程序与进程的区别

  • 程序静态的,是一些指令的有序合集
  • 进程动态的,是程序的执行过程,包括动态创建、调度和消亡的整个进程。
  • 进程Linux系统的基本调度和管理资源的单位。

进程运行的状态

  • 就绪态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间
  • 执行态:该进程正在占用CPU运行
  • 等待态:进程因不具备某些执行条件暂时无法继续执行的状态。

Linux进程管理

ps aux 命令

  •  PID:进程的ID
  • %CPU:进程占用的CPU百分比
  • %MEM:占用内存的百分比
  • COMMAND:命令的名称参数
  • STAT:S 处于休眠状态,静止状态R 正在运行Z 僵尸进程不存在但暂时无法消除

 top命令

  •  P:%CPU排序
  • M:%MEM排序
  • 空格:马上刷新(默认3秒)
  • q:退出(默认的top会一直占用当前端口)

 pgrep命令

 -l:列出进程的名称

kill命令 

kill -9 进程号

进程控制块

进程控制块(PCB)

  • 系统根据PCB来对并发执行的进程进行控制和管理
  • 系统在创建一个进程的时候会开辟一段内存空间存放与此进程相关的PCB数据结构。

进程的标识

简介

  • 每个进程都由一个进程号来标识,其类型pid_t
  • 进程号的范围0~32767
  • 进程号为0及1的进程由内核创建
  • 进程号总是唯一的,但进程号可以重用

函数调用 

  • 进程号PID :getpid()
  • 父进程:

       任何进程(除init进程)都是由另一个进程创建

       该进程称为被创建进程的父进程对应的进程号称为父进程号

  • 父进程号PPID:getppid()
  • 需要包含头文件: #include <sys/types.h> 、#include <unistd.h>

创建进程

fork函数

功能描述:

  • fork() 通过复制调用进程创建一个新进程
  • 子进程新进程是精确的调用过程的副本,称为父进程

以下几点除外:

  • 子进程有自己唯一的进程号ID,而这个PID与任何现有进程组的ID都不匹配
  • 子进程的父进程ID父进程ID相同

返回值

  • 成功:父进程中返回子进程的PID子进程中返回0
  • 失败:父进程返回-1

程序实例

#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t pid;
    pid=fork();
    if(pid>0)//parent 先执行父进程
    printf("1\n");
    if(pid==0)//son 再执行子进程
    printf("2\n");  
    if(pid<0)
    printf("error\n");
    printf("...\n");
    return 0;
}

实验现象

孤儿进程

孤儿进程:没有父进程的进程,每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,孤儿进程结束了其生命周期。因此孤儿进程不会危害

僵尸进程

  • 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中
  • 僵尸进程的危害:如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号导致系统不能产生新的进程

wait函数

函数原型:pid_t wait(int *status)//返回信息

函数功能:

等待子进程终止,如果子进程终止了,此函数会回收子进程的资源。

调用wait函数的进程会挂起,直到它的一个子进程退出或收到一个不能被忽视的信号时才被唤醒。

若调用进程没有子进程或它的子进程已经结束,该函数立即返回。

函数返回值:

如果执行成功返回子进程的进程号

出错返回-1,失败原因存于errno中

函数参数:

函数返回时,参数status中包含子进程退出时的状态信息。子进程的退出信息在一个int中包含了多个字段,用宏定义可以取出其中的每个字段。

取出子进程的退出信息WIFEXITED(status)

如果子进程是正常终止的,取出的字段值非零

WEXITSTATUS(status) 返回子进程的退出状态,退出状态保存在status变量的8~16位

在用此宏前应先用宏WIFEXITED判断子进程是否正常退出,正常退出才可以使用此宏

注意:此status是个wait的参数指向的整型变量。

程序实例

 终止进程

 void exit(int value)  void _exit(int value) 

 exit函数:#include <stdlib.h> void exit(int status) 

_exit函数:#include <unistd.h> void _exit(int status)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白变形计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值