进程基础

进程是程序执行时的一个实例,可以分配给处理器并由处理器执行的一个实体,由单一顺序的执行显示,是当前状态和相关系统资源描述的活动单元

进程与可执行程序的区别

可执行程序是指令和数据的集合,作为一种数据资料长期存在,是一个静态概念。而进程是可执行程序的一次执行过程,是有生命期,是暂时的,是一个动态概念。所以同一个可执行程序可以对应多个进程

进程标识方法

PCB

进程信息被放在一个叫做进程控制块的数据结构,linux下就是task_struct结构体,其中主要内容有:
标识符:PID标识和PPID等
状态:任务状态,退出代码,退出信号等
优先级:相对于其他进程的优先级
程序计数器:程序中即将被执行的下一条指令的地址
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据:进程执行时处理器的寄存器中的数据
I/O状态信息:包括显示的IO请求,分配给进程的IO设备和被进程使用的文件列表
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
其他信息

PID与PPID

标识和区分进程的ID,是在当前linux系统中唯一的非负整数。进程运行时PID由操作系统随机分配,同一个程序运行两次会产生两个进程,也就有两个不同的PID

每个进程除了一定有PID还会有PPID(1号进程除外)通过PPID可以找到父进程的信息

PID为1的进程是由内核创建的init进程,其他子进程都是由它衍生出来,所有进程都来自于一个进程,所以Linux的进程模型也叫做进程树
查看方式:
可以通过/proc系统文件夹查看
通过top、pidof或者ps -ef命令来查看
通过系统调用函数getpid()getppid()

进程状态

R运行状态:并不意味着进程一定在运行中,同一时刻可能有多个进程处于此状态,这些进程的task_struct结构被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)它表明进程要么是在运行中,要么在运行队列里。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行

S可中断睡眠状态:意味着进程在等待某时间的发生(如,等待资源),这些进程的task_struct结构被放入对应事件的等待队列中,当这些事件发生时,对应的等待队列中的一个或多个进程将被唤醒

D不可中断的睡眠状态:指进程不响应异步信号,因此无法用kill杀掉,除非reboot,通常此状态是在等待IO,比如磁盘IO,网络IO,其他外设IO

T暂停状态、t跟踪状态:可以通过发送SIGSTOP信号,暂停状态,这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。跟踪状态是进程暂停下来,等待跟踪它的进程对它进行操作。比如在gdb中对被跟踪的进程下一个断点,进程在断点处停下来的时候就处于跟踪状态,跟踪状态的进程不能响应sigcont信号而被唤醒,只能等到调试进程通过ptrace系统调用执行

X死亡状态:这个状态只是一个返回状态,你不会在任务列表里看到这个状态

Z僵尸进程:当子进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程,僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码

进程优先级

cpu资源分配的先后顺序,就是指进程的优先级。由于linux是多任务环境的,所以配置优先级可以改善系统性能。还可以把进程运行到指定的CPU上,把不重要的进程安排到某个CPU,可大大改善系统整体性能

PRI与NI

命令ps -l可查看进程的PRI与NI,PRI为进程的优先级,越小优先级别越高;NI为优先级修正数值;所以PRI(new)=PRI(old)+NI,所以,调整进程优先级,Linux下,就是调整进程NI值。NI其取值范围是-20至19,一共40个级别,PRI默认为80

更改NI

进入top后按“r”–>输入进程PID–>输入nice值
renice -n (ni_val) -p (pid)
nice -n (ni_val) ./exe —在运行的时候直接设置