Linux——进程基础概念
一、进程简介
1、进程与程序
程序是编译好的二进制文件,存放在磁盘上,不占用cpu、内存等系统资源。
进程是运行中的程序,已经加载到了内存中,且需要占用系统资源。
2、进程与并发
针对单核单线程cpu而言,多个进程无法并行但是可以并发。并发是站在人的视角上看到的结果,对于单核单线程cpu,它只能线性的执行程序。所谓并发即把一个进程划分为多个片段,cpu执行完一个片段后将该进程挂起,并切换到另一个线程运行。由于cpu处理速度极快(每条指令纳秒级),在人的视角上看起来像是所有进程在同时运行。举例来说:A、B两盏灯交替点亮,一盏灯亮1纳秒后熄灭,另一盏亮。由于交替间隔极短人眼无法分辨,看起来两盏灯是同时亮的。
因为阻塞的普遍存在,和多任务同时进行的要求,并发是必要的。若非并发,进程参与人机交互时会有大量阻塞,系统资源只能空闲等待,但此时其他进程还在排队,造成系统资源的极大浪费。
3、进程状态
进程基本的状态有 5 种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。
4、进程与虚拟内存
在32位的操作系统中,当进程创建的时候(程序运行时),系统会为每一个进程分配大小为4GB的虚拟内存空间,该空间0—3GB的部分为用户区域,3GB—4GB为内核。看起来,每一个进程都独自占用全部的内存空间。实际上,各个进程的内存空间都是虚拟的,由MMU把虚拟内存映射到物理内存上。MMU只会映射有用的部分,所以有时1G的物理内存也可以运行32位系统的程序。
5、进程控制块PCB
每个进程在内核(虚拟内存3GB-4GB部分)中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是 task_struct 结构体。/usr/src/linux-headers-3.16.0-30/include/linux/sched.h 文件中可以查看 struct task_struct结构体定义。其内部成员有很多,重点掌握以下部分即可:- 进程 id。系统中每个进程有唯一的 id,在 C 语言中用 pid_t 类型表示,其实就是一个非负整数。
- 进程的状态
- 进程切换时需要保存和恢复的一些 CPU 寄存器。
- 描述虚拟地址空间的信息。
- 描述控制终端的信息。
- 当前工作目录(Current Working Directory)。
- umask 掩码。
- 文件描述符表,包含很多指向 file 结构体的指针。
- 和信号相关的信息。
- 用户 id 和组 id。
6、进程与线程
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
二、进程相关命令
- ps //查看 Linux 中当前运行的进程的命令。能列出系统中运行的进程,包括进程号、命令、进程状态、CPU使用量、内存使用量等
- 与 |grep XXX 联用可查找指定进程
ps -aux | grep bash
- 与 |grep XXX 联用可查找指定进程
- pstree //查看进程树
- top //实时打印进程资源
- kill //发送信号,结束进程
- ulimit //控制系统资源在shell和进程上的分配量
- nice //通过 nice 命令的帮助,用户可以设置和改变进程的优先级