进程简介

unix或者linux系统中,每当运行一个程序,系统都会为这个程序创建一个特殊的环境,这个特殊的环境包含了运行该程序所依赖的一切东西。不论什么时候,你触发一个unix或者linux命令,都会创建或者启动一个新的进程。
所以可以这样理解,一个进程,就是一个运行中的程序的实例,它包含了该程序执行所需要的一切依赖。

进程追踪

操作系统给每个进程分配一个5位数字的pid来标示每个进程,每个进程都有唯一的pid。最终这5位数字组成的pid会被穷尽,那么到时候又会重头开始分配,不管怎样,同一时间不会出现pid相同的进程。

前台进程

默认情况下,每个进程运行在前台,接受用户的键盘输入然后将结果显示在屏幕上。

后台进程

一个后台进程的运行无需接受键盘的输入。后台进程的最大的好处就是无需等待当前进程处理完毕就可以执行其他的命令。如果某个后台进程需要接受一个输入,那么它会处于一个暂停状态直到它被切换到前后进程并且接受到从键盘输入的数据。

启动后台进程

启动一个后台进程最简单的方式就是在一个命令的末尾加上&符号。

比如在终端下输入ls -l &

1
2
3
4
$ ls -l &
[2] 30721 // 第一行
[1] Done ls -l // 第二行
$ // 第三行

其中的第一行的[2]表示job number,它是用来操作前后台进程切换的。
第二行表示ls -l命令后台进程成功的执行完成
第三行是等待下一个命令的输入

列出运行中的进程

通过ps(process status)命令很容易就可以列出运行中的进程。
ps命令有一些常用选项,最常用的是-f
具体选项如下

选项 描述
-f full, 列出详细的信息
-a all, 显示所有用户的信息
-x —-
-u —-
-e —-

以上的这些选项,-x, -e列出了一大堆信息,包括系统进程的,具体什么东西目前不是很清楚(TODO)。
-u在mac下测试不支持,或许是打开方式不对。。。

通过ps -f会在终端下显示如下信息

1
2
3
4
5
6
7
UID   PID  PPID   C STIME   TTY           TIME CMD
501 26649 26648 0 四12上午 ttys000 0:00.68 -bash
501 11212 11210 0 15 417 ttys001 0:00.31 -bash
501 11267 11266 0 15 417 ttys002 0:00.11 -bash
501 11545 11544 0 15 417 ttys003 0:00.19 -bash
501 24268 24267 0 三12下午 ttys004 0:00.39 -bash
501 16770 16766 0 一11上午 ttys007 0:00.92 -bash

关于以上每列所代表的含义如下:

标识符 描述
UID 该进程属于哪个用户的,也就是说该进程是哪个用户启动的,用户ID
PID 进程ID(process id)
PPID 该进程的父进程ID(parent process id)
C 进程利用的CPU
STIME 进程启动的时间
TTY 进程所使用的终端类型
TIME 进程占用的CPU时间
CMD 启动该进程所使用的命令

终止进程

终止一个进程有很多种方式,常用的如下

  • 直接通过按键CTRL + C
  • 通过kill pid

举例如下

1
2
3
4
5
// ①
$ps -f
501 16770 16766 011上午 ttys007 0:00.92 -bash
// ②
$kill 16770

但是有时候通过kill pid并不能终止一个进程,那么此时可以加个参数-9:

1
$kill -9 16770

父进程和子进程

unix或者linux系统中, 每个进程会被分配2个id,pid(process id), ppid(parent process id), 每个用户进程都会有一个父进程。

常驻进程(Daemon Processes)

常驻进程作为系统级别的进程,以root权限运行,为其他的进程服务。常驻进程是无法通过终端来控制的。你通过ps -ef来查看进程信息,可以看到所有的常驻进程的tty列显示的都是?

1
2
3
$ps -ef
UID PID PPID C STIME TTY TIME CMD
0 1 0 0 18 217 ?? 92:25.03 /sbin/launchd

其他的一些进程

….(不列了)

top命令

top命令是一个非常有用的工具命令,它列出了进程相关的一切信息,它将进程,CPU等相关的信息实时的显示在终端。