linux下的进程

linux下的进程

在我们linux的学习中,有一个很重要的概念就是进程, 进程就是**程序的一个执行实例,是担当分配资源的实体,是资源竞争的最小单位。简单来说就是正在运行的程序。
我们在学习linux的时候,会发现有一个规律就是
管理者先将被管理者进行描述在组织起来。**对于进程来说,linux用一种来存放关于一个进程的描述信息,这个结构体就是PCB(process control block)
在linux中这个PCB就是task_struct这个结构体,这个PCB中包括进程的描述信息有:

  • 标识符:描述进程的唯一标识符,进程ID
  • 状态:描述进程的当前状态,例如睡眠状态等
  • 优先级:相对于其他进程的优先级
  • 内存指针:代码相关与进程相关的指针
  • 其他信息
  • 在linux下可以用/proc查看进程信息

进程状态

在刚刚的PCB我们提到了进程是有状态的,进程一般有以下几种形态

  • R运行状态:在运行中或者在运行队列里
  • S睡眠状态:这里的睡眠状态是可中断睡眠,进程等待事件完成
  • D磁盘休眠状态:这里的睡眠状态是不可中断睡眠,等待特殊信号唤醒
  • T停止状态:通过发送SIGSTOP来让进程进入停止状态
  • Z僵尸状态:父进程不关心子进程退出导致子进程资源没办法回收所致

僵尸进程

僵尸进程是一个特殊的进程状态,当子进程先于父进程退出而父进程没有关心子进程的退出信号所致,这个时候子进程已经退出可是并没有父进程回收子进程的资源所造成子进程变成僵尸进程

孤儿进程

孤儿进程是由于父进程先于子进程退出,造成子进程退出的时候没有进程替他回收资源,孤儿进程一般被1号init进程领养,由一号进程替他回收资源。
##创建进程
在linux下我们一般利用函数接口来创建进程

fork函数

fork是内核提供的创建子进程的函数,函数原型是
pid_t fork(void)
子进程返回0,父进程返回子进程ID,失败返回0.我们一般在父进程中使用fork函数创建子进程
进程的创建步骤:

  • 从小到大找到第一个没被使用的最小ID分配给子进程
  • 拷贝大部分父进程PCB的内容,创建子进程的PCB
  • 复制父进程的虚拟地址空间创建页表映射物理内存
  • 将进程放入就绪队列

fork创建的子进程是利用写诗拷贝技术,只读的时候不进行拷贝,只有进行写操作的时候才进行拷贝操作

vfork

vfork函数与fork函数只有一点不一样其他全部相同,vfork函数创立的子进程与父进程共用物理内存,在子进程进行操作的时候父进程进行阻塞等待,直到子进程退出父进程才能进行操作。

进程优先级

cpu资源分配是有先后顺序的,优先级高的先处理,我们可以将一个进程的优先级提高来让cpu先处理这个进程。
我们一般在linux中由ps -l或ps aux来查看进程这里写图片描述

  • PID:这个是当前进程ID
  • PPID:当前进程的父进程ID
  • UID:执行者身份
  • NI:进程的nice值
  • PRI:该进程可以被执行的优先级,越小越先被执行

nice值就是对于进程优先级的修正,一共-20到19共四十个级别,在linux中我们就是通过修改nice值来修改进程的优先级。一般用rnice的命令来调整进程的优先级

进程终止

一般来说进程有以下推出场景
代码运行完毕,正常推出,代码运行完毕,结果不正确,代码异常终止
在linux中一般有以下几种方式退出进程
正常退出:
main函数退出,main函数一般是调用exit函数并且回收资源返回返回值等
_exit退出:_exit函数是最暴力的一种退出方式,直接退出
exit推出:exit函数退出也调用了_exit函数,不过在调用以前做了以下几件事

  1. 执行用户通过atexit或on_exit定义的清理函数
  2. 关闭所有打开的流,所有缓存数据都被写入
  3. 调用_exit
    异常退出:
    异常退出一般是由于内核向进程发送退出信号所致
    ctrl+c 终止信号
    ##进程等待
    在之前我们提到,如果父进程不关系退出的子进程的话有可能形成僵尸进程,那么如果我们有一个函数让父进程关注子进程的退出状态那么就可以避免产生僵尸进程
    pid_t wait(int *status);
    参数是获取子进程退出状态,不关心置空,成功返回子进程的进程ID,失败返回-1
    pid_t waitpid(pid_t pid, int *status, int options);
    pid:当pid=-1 等待任意一个子进程当pid>0,等待进程ID为pid的进程
    status:WIFEXITED若正常退出返回真 WEXITSTATUS如不正常退出提取退出码
    options:WNOHANG若等待的子进程没有结束就返回0,结束了返回进程ID

进程替换

我们创建的子进程基本与父进程相同,可是一般情况下我们不希望子进程与父进程执行相同的代码,在linux下我们可以将另一个进程与子进程进行进程替换,这样子进程就可以做与父进程不同的事,程序替换的原理是页表的重新映射。
linux给我们提供了六个不同的接口供我们进行程序替换操作
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char *path, const char *arg, …, char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
调用这些函数成功的话下面的代码将全部失效然后转换成新的进程,失败的返回-1,这六个函数看着不好分情,其实只要掌握规律就很好分情
l表示参数采用列表,v表示采用数组,p表述自动搜索环境变量,e表示自己维护环境变量。
事实上只有execve是系统调用接口,其他都是在execve上进行的封装。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值