进程基础篇之初识进程

时间:2021-06-09 09:20:17

操作系统(Operator System)

要想了解进程,首先就要对操作系统有一个大致的了解,常见的操作系统有Windows,Linux,Unix,安卓,甚至是数字电视也有自己的一套操作系统。

概念:任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。

操作系统大致包括:

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(例如函数库,shell程序等等)

设计操作系统的目的:

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的运行环境

如何理解操作系统的“管理”

举个例子:将计算机的操作系统比喻为大学校长,将辅导员比作驱动(操作系统通过驱动来管理硬件),将学生比作硬件。校长通过查看学生的信息表,成绩单等等,这些就相当与对学生的描述,校长通过这些描述来将学生组织起来,校长下达命令的时候就由辅导员等来执行;这就类似于计算机中的操作系统,学生的信息表就相当于硬件的数据,操作系统通过查看相关数据对硬件做出相关描述(用到struct结构体),用链表或其他高效的数据结构将其组织起来,下达指令时通过驱动来进行相关操作。

操作系统对进程也一样,先把进程描述起来,再把进程组织起来

进程

基本概念:程序的一个执行实例,正在执行的程序等

内核观点:担当分配系统资源(CPU时间,内存)的实体

进程的描述:

  • 进程的相关信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
  • Linux操作系统下的PCB被叫做task_struct,task_struct是Linux内核的一种数据结构,它会被装载到内存里并且包含着进程的信息

进程控制块(task_struct)的内容

  • 标识符:每个进程都有一个标识符,可以看成是标签,用来区分其他进程
  • 状态:进程当前的任务状态,退出代码,退出信号等
  • 优先级:相对于其他进程的优先级
  • 程序计数器:程序中即将被执行的下一条指令的地址
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享内存块的指针
  • 上下文数据:进行中的进程被切换时之前的CPU数据会被保存下来,保存到内存中的当前正在执行进程的PCB里
  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
  • 其他信息

进程的组织:

  • 所有运行在系统里的进程都以task_struct链表(双链表)的形式存在与内核中

查看进程

进程的信息可以通过/proc 系统文件夹查看
在Linux或者Unix系统中,用ps -l 命令可查看当前目录下所有进程的部分信息

  • 如:要获取PID(子进程标识符)为1的进程信息,你需要查看/proc/1这个文件夹
下面我们了解一些进程相关的信息

进程的标识符

下面我们用简单的代码通过系统调用获取进程的标识符

  1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<unistd.h>
  4 int main()
  5 {
  6     printf("pid: %d ,ppid: %d \n",getpid(),getppid());                                                                            
  7     return 0;
  8     }           

运行结果

[wh@localhost Linux1]$ ./a.out 
pid: 5678 ,ppid: 5580 
[wh@localhost Linux1]$ 

进程的状态

  • R运行状态(running):表明程序要么是在运行中要么是在运行队列里
  • S睡眠状态(sleeping):俗称浅度睡眠,也叫可中断睡眠,意味着进程在等待时间完成
  • D磁盘休眠状态(Disk sleep):俗称深度睡眠,有时候也叫不可中断睡眠状态,在这个状态的进程通常会等待IO的结束
  • T停止状态(stopped):可以通过发送SIGSTOP 信号给进程来停止(T)进程,这个被暂停的进程可以通过发送SIGCONT信号让进程继续进行
  • X死亡状态(dead):这个状态只是一个返回状态,你不会再任务列表里看到这个状态
  • 初次之外还有僵尸进程,孤儿进程,在后面的博客中我将详细介绍,并写出相关代码帮助大家理解

进程优先级(PRI)

基本概念:

  • 进程在被CPU分配到资源后才可运行,但资源是有限的,CPU分配资源的先后顺序,就是指进程的优先权
  • 优先权(优先执行权利)和优先级值不一样,优先级值低的进程反而优先权高。配置进程优先权对多任务环境的Linux很有用,可以改善系统性能
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能

NI(nice值)

  • 表示进程可被执行的优先级的修正数值
  • PRI(new)=PRI(old)+nice
  • 即当nice值为负的时候,该进程的优先级值会变小,则优先权会越高,则其越快执行
  • nice其取值范围是-20至19

修改进程优先级的命令

  • 开始执行程序时就指定nice值: nice -n -5 ./test
  • 调整已存在进程的nice值:renice -5 -p 1000 //PID为5200的进程nice设为-5
  • 用top命令更改已存在进程的nice值:

    • top
    • 进入top后按“r”->输入进程PID->输入nice值

进程的其他概念

  • 竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。
  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰(但存在通信)
  • 并行:多个进程在多个CPU下同时进行运行,这称之为并行
  • 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发