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
  • pstree    //查看进程树
  • top         //实时打印进程资源
  • kill         //发送信号,结束进程
  • ulimit     //控制系统资源在shell和进程上的分配量
  • nice       //通过 nice 命令的帮助,用户可以设置和改变进程的优先级