Linux进程管理 简介
何为进程,我想这个问题大家再熟悉不过了吧,无非就是“执行中的程序”!
概念性的东西本文暂时忽略或者略微一提,详细信息还需要阅读相应的blog或专业书籍。(博主收藏了计算机相关的大量国内外知名书籍,需要的可以留言,免费奉上)
1. 进程资源
进程的运行需要内存、CPU等资源,系统为进程提供两种资源:
内核空间进程资源:即PCB(Process Control Block, 进程控制块),包括PID、PPID、打开的文件表项、当前目录与当前终端信息等;
特点:只能通过系统调用才可以访问,当前进程退出,由另外的进程进行资源回收
详细定义:可见/usr/src/kernels/xxx/include/linux/sched.h
的struct task_struct
用户空间进程资源:包括进程的代码段、数据段、堆、栈以及可共享的库的内存空间
2. 进程状态信息
进程的状态在Linux系统中主要分为五个:
- Running: TASK_RUNNING
运行态或就绪态(得了了除CPU意外的其它所有资源)- Waitting:
- Waitting Interuptable:TASK_INTERRUPTIBLE
等待状态,等待资源有效时唤醒,可被中断唤醒- Waitting Uninteruptable:TASK_UNINTERRUPTIBLE
等待状态,等待资源有效时唤醒,不可被中断唤醒
- Stop: TASK_STOPPED
进程被暂停,当再次允许时可再次执行- Zombie:TASK_ZOMBIE
进程用户资源空间被释放,但PCB并未释放,等待父进程回收
3. 进程属性
1). PID
进程号(Process IDentification),是进程的唯一标识,为一个正整数,由内核分配,用户无法修改。
获取PID的函数为:
函数:getpid()
作用:
获取该进程的PID头文件:
#include <unistd.h>
函数原型:
pid_t getpid(void)
返回值
成功:pid号
失败:-1
2). PPID
父进程号(Parent Process IDentification),是父进程的唯一标识,为一个正整数。
获取PPID的函数为:
函数:getppid()
作用:
获取父进程的PID头文件:
#include <unistd.h>
函数原型:
pid_t getppid(void)
返回值
成功:pid号
失败:-1
3). PGID
进程号(Parent Process IDentification),是父进程的唯一标识,为一个正整数。
获取PGID的函数为:
函数:getpgid()
作用:
获取本进程所属进程组的组号头文件:
#include <unistd.h>
函数原型:
pid_t getpgid(pid_t pid)
返回值
成功:pgid号
失败:-1
4. 进程管理
1). 创建进程 - fork
Linux的最初进程为init
,PID为1,所有其它进程都是由该进程直接或间接创建。
创建进程常用函数为fork()
和vfork()
:
- 函数:fork
作用:
创建新的进程,被创建的进程为子进程,子进程复制父进程的几乎所有信息(所有用户空间信息和绝大多数内核空间信息),子进程独立于父进程的内存空间。头文件:
#include <unistd.h>
函数原型:
pid_t fork(void)
返回值:
成功:父进程中返回子进程的PID(正整数),子进程中返回0
失败:-1
- 函数:vfork
作用:
同样是创建一个新进程
与fork
的区别在于:创建进城后并不复制父进程的地址空间,而是在必要的时候才申请内存空间;即共享父进程的内存空间头文件:
#include <unistd.h>
函数原型:
pid_t vfork(void)
返回值:
成功:父进程中返回子进程的PID(正整数),子进程中返回0
失败:-1
2). 运行新代码 - execX家族
当fork()
创建子进程后,在子进程中需要运行新的程序,则可以采用两种方式:
system(const char *cmd): 创建一个新的子进程执行
cmd
,执行完成后返回到父进程,为阻塞执行
execX家族: 不创建新进程,执行完成后,该语句执行完成后结束本进程
- system
头文件:
#include <stdlib.h>
函数原型:
int system(const char* command)
返回值:
成功:0
失败:-1
- execX 家族
头文件:
#include <unistd.h>
函数原型:
函数 原型 使用文件名(p) / 路径名 使用参数表(l) / argv(v) execl int execl(const char *path, const char *arg, ...) l execlp int execlp(const char *file, const char *arg, ...) p l execle int execle(const char *path, const char *arg, ..., char * const envp[]) l execv int execv(const char *path, char *const argv[]) v execvp int execvp(const char *file, char *const argv[]) p v execve int execvpe(const char *file, char *const argv[], char *const envp[]) v
- 参数:
- path: 欲执行的程序名(可不包括路径),在$PATH中查找
- file: 欲执行的程序名(绝对路径)
- argv[]: 参数列表
- envp[]: 新执行程序的环境变量
- ...: 执行程度的参数列表,最后一个参数必须为
(char *)NULL
- 返回值:
成功:void
失败:-1
3). 用户空间资源回收 - exit/return
用户空间资源回收由两个函数完成:
return: 退出当前函数,但并不退出当前进程(main函数除外)
exit: 退出当前进程,刷新流缓冲区,关闭所有I/O流
- exit:
头文件:
#include <stdio.h> //for exit() atexit() on_exit()
#include <unistd.h> //for _exit()
函数原型:
函数 原型 描述 exit void exit(int status) 调用 atexit() / on_exit() 函数后退出,刷新I/O缓冲区 _exit void _exit(int status) 不调用任何注册函数而直接退出,不处理标准I/O缓冲区 atexit int atexit(void (*function)(void)) 注册一个回调函数,当执行exit时,优先执行回调函数 on_exit int on_exit(void (*function)(int , void *), void *arg) 同at_exit,只是增加了回调函数的参数值
- 返回值:
成功:0 (atexit/on_exit)
失败:非0值 (atexit/on_exit)
4). 内核空间资源回收 - wait
进程退出时,只是清除了用户空间资源,而PCB是由其父进程进行回收的,回收子进程PCB的函数为:wait()
和 waitpid()
.
- wait
作用:
父进程阻塞等待子进程的状态变化,回收该子进程的内核进程资源头文件:
#include </usr/include/sys/wait.h>
函数原型
函数 原型 描述 wait pid_t wait(int *status) 父进程阻塞等待 任何一个 子进程完成后,回收其资源后退出 waitpid pid_t waitpid(pid_t pid, int *status, int options) 父进程阻塞等待 指定子进程 完成后,回收其资源后退出
- 参数:
- pid: 子进程ID号
PID 描述 PID>0 等待该PID的进程结束 PID=0 等待与当前进程的进程组PGID一致的进程结束 PID=-1 等待任意子进程结束,相当于 wait() PID<-1 等待进程组PGID等于该PID(绝对值)结束
- status: 子进程退出时的状态信息
- options:等待选项,一般设置为0,特殊情况请查阅man
5). 三种新进程启动方式比较:
启动方式 | 特点 |
---|---|
system() | 需要启动新的shell并在新的shell是执行子进程,所以对环境的依赖较大,而且效率也不高; 同时system函数要等待子进程的返回才能执行下面的语句。 |
execX() | 用新的进程来替换原先的进程,效率较高; 但它不会返回到原先的进程,也就是说在exec函数后面的所有代码都不会被执行,除非exec调用失败。 然而exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开, 但需要注意,任何在原进程中已打开的目录流都将在新进程中被关闭。 |
fork() | 用当前的进程来复制出一个新的进程,新进程与原进程一模一样,执行的代码也完全相同; 但新进程有自己的数据空间、环境变量和文件描述符, 我们通常根据fork函数的返回值来确定当前的进程是子进程还是父进程, 即它并不像exec那样并不返回,而是返回一个pid_t的值用于判断,我们还可以继续执行fork后面的代码。 用fork与exec系列函数就能创建所需的进程。 |
5. 特殊进程
1). 孤儿进程
因父进程先退出而导致一个子进程被init
收养,称该进程为孤儿进程。
孤儿进程的父进程为init
,该进程在孤儿进程退出后回收其PCB
2). 僵死(僵尸)进程
进程已经退出,但是其父进程尚未来得及回收其PCB资源,即其PCB资源还没有释放,成为 “Zomble”
3). 守候进程
守候进程是在后台运行的一个特殊进程,它脱离于终端,可避免被终端所产生的信号打断;执行过程中的任何信息不在终端显示;周期性的执行某些任务或等待处理某些发生的事件。
其实,Linux上存在大量守候进程,如web,日志管理进程等。
Linux进程管理 简介的更多相关文章
- linux进程管理和系统状态查看命令简介
1 进程管理简介 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础 2 常用命令 2.1 pstree 2.1.1 功能描 ...
- linux进程管理和系统状态常用命令简介
1 进程管理简介 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础 2 常用命令 2.1 pstree 2.1.1 功能描 ...
- Linux进程管理
一.进程管理简介 进程是正在执行的程序或命令,每一个进程都是一个运行实体,都有自己的地址空间,并占用一定的系统资源. 进程管理的作用: 1.判断服务器的健康状态 2.查看系统中的所有进程 3.杀死进程 ...
- Linux进程管理工具Supervisor的安装配置
目录 Linux进程管理工具Supervisor的安装配置 简介 安装Python包管理工具 安装Supervisor 配置 配置文件参数说明 配置进程管理 启动supervisor 控制进程 交互终 ...
- Linux进程管理子系统分析【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/51298732 Linux进程管理: 进程与程序: 程序:存放在磁盘上的一系列代码 ...
- 12个Linux进程管理命令介绍(转)
12个Linux进程管理命令介绍 [日期:2015-06-02] 来源:Linux中国 作者:Linux [字体:大 中 小] 执行中的程序在称作进程.当程序以可执行文件存放在存储中,并且运行的 ...
- Linux进程管理知识整理
Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...
- Linux性能及调优指南(翻译)之Linux进程管理
本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...
- Linux进程管理专题
Linux进程管理 (1)进程的诞生介绍了如何表示进程?进程的生命周期.进程的创建等等? Linux支持多种调度器(deadline/realtime/cfs/idle),其中CFS调度器最常见.Li ...
随机推荐
- ActiveMq 总结(二)
4.2.6 MessageConsumer MessageConsumer是一个由Session创建的对象,用来从Destination接收消息. 4.2.6.1 创建MessageConsumer ...
- TFS支持移动设备,微软已经走出了第一步(手机上更新、查询工作项)
TFS支持移动设备,微软已经走出了第一步! 从现在开始,你可以在手机浏览器上打开自己的VSTS团队项目,会看大手机版的工作项界面,你可以在手机设备上更新.查询工作项. 这是原生自带的,这些移动功能马上 ...
- .NET 日志工具 log4net使用
1.NuGet安装log4net. 2.修改配置文件 <?xml version="1.0"?> <configuration> <configSec ...
- NetCore入门篇:(八)Net Core项目使用Controller之三
一.简介 1.本节主要说明入参的几种接收方式 二.不限定模式 1.定义一个id入参与一个model入参. 2.get\post分别查看访问效果. api代码 public class OneContr ...
- XML Web Service架构图
- python docker库
安装方式pip pip install docker -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 官方文档地址 ht ...
- Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)
学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...
- Windows 环境下使用强大的wget工具
安装 下载[http://www.interlog.com/~tcharron/wgetwin.html] 解压到目录 比如我解压到D:\Tool\wget 添加wget环境变量,这样使用就更方便了, ...
- java 附件上传、下载前后端代码
前言:业务需要:附件上传,需要同时满足浏览器上传,和APP上传附件,并且浏览器端不可使用form表单提交,因为表单提交无法直接获取返回值,除非刷新页面才可显示上传的附件.所以此处使用ajaxfileu ...
- BZOJ 1719--[Usaco2006 Jan] Roping the Field 麦田巨画(几何&区间dp)
1719: [Usaco2006 Jan] Roping the Field 麦田巨画 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 82 Solved ...