操作系统(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下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发