linux的学习系列 8---进程管理
当我们运行程序时,Linux会为程序创建一个特殊的环境,该环境包含程序运行需要的所有资源,以保证程序能够独立运行,不受其他程序的干扰。这个特殊的环境就称为进程。
每个 Linux 命令都与系统中的程序对应,输入命令,Linux 就会创建一个新的进程。例如使用 ls 命令遍历目录中的文件时,就创建了一个进程。
简而言之,进程就是程序的实例。
系统通过一个五位数字跟踪程序的运行状态,这个数字称为 pid 或进程ID。每个进程都拥有唯一的 pid。
理论上,五位数字是有限的,当数字被用完时,下一个 pid 就会重新开始,所以 pid 最终会重复。但是,两个 pid 一样的进程不能同时存在,因为Linux会使用 pid 来跟踪程序的运行状态。
创建进程
有两种方式来创建进程:前台进程和后台进程。
前台进程
默认情况下,用户创建的进程都是前台进程;前台进程从键盘读取数据,并把处理结果输出到显示器。
我们可以看到前台进程的运行过程。例如,使用 ls 命令来遍历当前目录下的文件:
$ls ch*.doc
ch01-1.doc ch010.doc ch02.doc ch03-2.doc
ch04-1.doc ch040.doc ch05.doc ch06-2.doc
ch01-2.doc ch02-1.doc
这个程序就运行在前台,它会直接把结果输出到显示器。如果 ls 命令需要数据(实际上不需要),那么它会等待用户从键盘输入。
当程序运行在前台时,由于命令提示符($)还未出现,用户不能输入其他命令;即使程序需要运行很长时间,也必须等待程序运行结束才能输入其他命令。
后台进程
后台进程与键盘没有必然的关系。当然,后台进程也可能会等待键盘输入。
后台进程的优点是不必等待程序运行结束就可以输入其他命令。
创建后台进程最简单的方式就是在命令的末尾加 &,例如:
$ls ch*.doc &
ch01-1.doc ch010.doc ch02.doc ch03-2.doc
ch04-1.doc ch040.doc ch05.doc ch06-2.doc
ch01-2.doc ch02-1.doc
如果 ls 命令需要输入(实际上不需要),那么它会暂停,直到用户把它调到前台并从键盘输入数据才会继续运行。
查看正在运行的进程
可以使用 ps 命令查看进程的运行状态,包括后台进程,例如:
$ps
PID TTY TIME CMD
18358 ttyp3 00:00:00 sh
18361 ttyp3 00:01:31 abiword
18789 ttyp3 00:00:00 ps
还可以结合 -f 选项查看更多信息,f 是 full 的缩写,例如:
$ps -f
UID PID PPID C STIME TTY TIME CMD
amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
每列的含义如下:
| 列 | 描述 | 
|---|---|
| UID | 进程所属用户的ID,即哪个用户创建了该进程。 | 
| PID | 进程ID。 | 
| PPID | 父进程ID,创建该进程的进程称为父进程。 | 
| C | CPU使用率。 | 
| STIME | 进程被创建的时间。 | 
| TTY | 与进程有关的终端类型。 | 
| TIME | 进程所使用的CPU时间。 | 
| CMD | 创建该进程的命令。 | 
ps 命令还有其他一些选项:
| 选项 | 说明 | 
|---|---|
| -a | 显示所有用户的所有进程。 | 
| -x | 显示无终端的进程。 | 
| -u | 显示更多信息,类似于 -f 选项。 | 
| -e | 显示所有进程。 | 
终止进程
当进程运行在前台时,可以通过 kill 命令或 Ctrl+C 组合键来结束进程。
如果进程运行在后台,那么首先要通过 ps 命令来获取进程ID,然后使用 kill 命令“杀死”进程,例如:
$ps -f
UID PID PPID C STIME TTY TIME CMD
amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated
如上所示,kill 命令终结了 first_one 进程。
如果进程忽略 kill 命令,那么可以通过 kill -9 来结束:
$kill -9 6738
Terminated
父进程和子进程
每个 Linux 进程会包含两个进程ID:当前进程ID(pid)和父进程ID(ppid)。可以暂时认为所有的进程都有父进程。
由用户运行的大部分命令都将 Shell 作为父进程,使用 ps -f 命令可以查看当前进程ID和父进程ID。
僵尸进程和孤儿进程
正常情况下,子进程被终止时会通过 SIGCHLD 信号通知父进程,父进程可以做一些清理工作或者重新启动一个新的进程。但在某些情况下,父进程会在子进程之前被终止,那么这些子进程就没有了“父亲”,被称为孤儿进程。
init 进程会成为所有孤儿进程的父进程。init 的 pid 为1,是Linux系统的第一个进程,也是所有进程的父进程。
如果一个进程被终止了,但是使用 ps 命令仍然可以查看该进程,并且状态为 Z,那么这就是一个僵尸进程。僵尸进程虽然被终止了,但是仍然存在于进程列表中。一般僵尸进程很难杀掉,你可以先杀死他们的父进程,让他们变成孤儿进程,init 进程会自动清理僵尸进程。
常驻进程
常驻进程一般是系统级进程,以 root 权限运行在后台,可以处理其他进程的请求。
常驻进程没有终端,不能访问 /dev/tty 文件,如果使用 ps -ef 查看该进程,tty 这一列会显示问号(?)。
更确切地说,常驻进程通常运行在后台,等待指定事件发生,例如打印进程是一个常驻进程,它会等待用户输入打印相关的命令并进行处理。
top命令
top 命令是一个很有用的工具,它可以动态显示正在运行的进程,还可以按照指定条件对进程进行排序,与Windows的任务管理器类似。
top 命令可以显示进程的很多信息,包括物理内存、虚拟内存、CPU使用率、平均负载以及繁忙的进程等。例如:
$top
这里仅给出一个示意图,读者最好亲自运行一下:
任务和进程
任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是多个进程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以由一个进程来实现,也可以由多个进程来实现。  每个任务都有一个数字表示的任务号。
  
进程(process)常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。
jobs 命令可以用来查看系统中正在运行的任务,包括后台运行的任务。该命令可以显示任务号及其对应的进程ID。一个任务可以对应于一个或者多个进程号。
jobs 命令的 -l 选项可以查看当前任务包含的进程ID:
$jobs -l
[1] + 1903 running ls ch*.doc &
$
其中,第一列表示任务号,第二列表示任务对应的进程ID,第三列表示任务的运行状态,第四列表示启动任务的命令。
前台任务和后台任务的切换
fg 命令可以将后台任务调到前台,语法为:
$fg %jobnumber
jobnumber 是通过 jobs 命令获取的后台任务的的序号,注意不是pid。如果后台只有一个任务,可以不指定 jobnumber。
bg 命令可以将后台暂停的任务,调到前台继续运行,语法为:
$bg %jobnumber
jobnumber 同样是通过 jobs 命令获取的后台任务的的序号,注意不是pid。如果前台只有一个任务,可以不指定 jobnumber。
如果希望将当前任务转移到后台,可以先 Ctrl+z 暂停任务,再使用 bg 命令。任务转移到后台可以空出终端,继续输入其他命令。
linux的学习系列 8---进程管理的更多相关文章
- Linux内核学习笔记-2.进程管理
		原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ... 
- Linux学习笔记(六) 进程管理
		1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ... 
- linux kernel学习笔记-5内存管理_转
		void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ... 
- Linux内核学习笔记二——进程
		Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ... 
- Linux基础学习系列目录导航
		Linux基础学习-通过VM安装RHEL7.4 Linux基础学习-命令行与图形界面切换 Linux基础学习-基本命令 Linux基础学习-RHEL7.4之YUM更换CentOS源 Linux基础学习 ... 
- Spring5.0源码学习系列之事务管理概述
		Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ... 
- Linux系列之进程管理
		前言 进程是正在运行的程序,Linux系统通常有数百个进程同时运行.本文就来介绍下Linux是如何进行进程管理的. 我们可以看到: 查看进程(Viewing processes) 查找进程(Findi ... 
- Linux快速学习系列
		这篇文章会随着学习的进行,不断的更新!!! 总结 操作系统引入的抽象概念 进程(process) 地址空间(address space) 虚拟内存(virtual memory) 操作系统引入的cah ... 
- linux内核学习之四:进程切换简述
		在讲述专业知识前,先讲讲我学习linux内核使用的入门书籍:<深入理解linux内核>第三版(英文原版叫<Understanding the Linux Kernel>),不过 ... 
随机推荐
- 4、mybatis动态sql+struts2(通配符+全局配置+分页)
			1.创建userinfo.sql数据库脚本 create table USERINFO ( id NUMBER not null, uname ), password ), age NUMBER ) ... 
- mac 上面安装mysql-python
			安装过程中一直报错: EnvironmentError: mysql_config not found 最终下面的方式解决: 58down voteaccepted +200 Ok, well, fi ... 
- 重登陆模式 --ESFramework 4.0 快速上手(07)
			在ESFramework框架中基于TCP的服务端引擎(当然也包括Rapid引擎)都采用了这样一条规则:默认情况下,客户端与服务器成功建立TCP连接以后,服务端会从客户端发过来的第一条消息中取出消息头的 ... 
- 解决yum命令时出现Error: xz compression not available
			由于CentOS6的系统安装了epel-release-latest-7.noarch.rpm 导致在使用yum命令时出现Error: xz compression not available问题. ... 
- MongoDB执行计划分析详解
			要保证数据库处于高效.稳定的状态,除了良好的硬件基础.高效高可用的数据库架构.贴合业务的数据模型之外,高效的查询语句也是不可少的.那么,如何查看并判断我们的执行计划呢?我们今天就来谈论下MongoDB ... 
- LeadTools答题卡识别方案
			/// <summary> /// 批改操作 /// </summary> public AnswerCard DoCorrect(Stream AnserCardFile) ... 
- 如何让图片在div里面剧中显示
			你可能有很多种方式,但是这种方式我觉得更加简单,供大家参考. 用一个 display:inline-block 的helper容器高度为height: 100% 并且vertical-align: m ... 
- 封装一个Ajax工具函数
			/*封装一个ajax工具函数*/ window.$ = {}; /*通过$定义一个ajax函数*/ /* * 1. type string 请求的方式 默认是get * 2. url ... 
- 局部内部类访问方法的参数和局部变量必须是final的
			内部类的种类一共分为四种,我看其他几种内部类的时候思路都是很清晰的,然后我就碰到了这一条:"方法中的内部类可以访问外部类成员.对于方法的参数和局部变量,必须有final修饰才可以访问&quo ... 
- 移动UI
			UI设计需要关注:色彩,信息布局,交互流程,用户体验,尺寸等 
