进程的基础知识 -- 进程概念 ,PCB,进程状态(僵尸进程孤儿进程),进程优先级

进程基本概念

进程是什么

  • 宏观:执行中的一个程序,一段指令的集合
  • 微观:分配系统资源的一个基本单位

进程就是执行中的程序,而程序则是一段有序指令的集合,根据冯诺依曼体系结构我们可以得到,程序员的代码存储在硬盘中,当其执行的时候代码会首先被加载到内存上面。
当加载到内存上面时候,就需要操作系统对其进行描述与组织,也就是管理。
而操作系统则是通过一个结构体对这个指令和数据进行描述然后组织,从而达到管理的目的。
在这里插入图片描述
这个描述我们把它叫做PCB,通过对pcb的管理,操作系统实现了对不同进程的切换与调度,实现了并发与并行。

PCB - 进程控制块

操作系统中一个进程的各种信息都被一个PCB(进程控制块)所描述起来,我们可以将其理解为进程属性的集合。在Linux下的pcb是一个 task _struct 的结构体
task _struct是Linux内核的一种数据结构,被装载到RAM里面

task _struct内部信息

标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

进程状态

进程状态查看
ps aux / ps axj 命令
进程状态分类

"R (running)", 
"S (sleeping)",
"D (disk sleep)"
"T (stopped)", 
"t (tracing stop)"
"X (dead)", 
"Z (zombie)",

常见状态

  • 运行态 R 就绪/运行(+代表前台运行)
  • 可中断休眠态 S 当前阻塞能被中断唤醒
  • 不可中断休眠态 D 当前阻塞不能被中断唤醒 等待条件满足自己醒来
  • 停止态 T 停止运行什么都不干
  • 僵死态 Z 进程已经退出但是资源没有完全释放

阻塞的含义可以理解为:为了执行某个命令,但是没有达到可以执行该命令的条件,于是一直等待,通常将这种等待视为阻塞。

僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源
危害
1.占用空间 如文件描述符表
2.内存泄露

如何避免僵尸进程
一般采用wait等待

孤儿进程

与僵尸进程相反, 孤儿进程的产生是因为父进程先于子进程退出,子进程被一号进程收养,子进程就变成了孤儿进程。

创建一个孤儿进程

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t id = fork();
if(id < 0){
perror("fork");
return 1;
}
else if(id == 0){//child
printf("I am child, pid : %d\n", getpid());
sleep(10);
}else{//parent
printf("I am parent, pid: %d\n", getpid());
sleep(3);
exit(0);
}
return 0;
}

进程优先级

cpu资源分配的先后顺序,就是指进程的优先权(priority)。

查看操作
ps -l 我们会看到以下内容
在这里插入图片描述
PRI就是进程优先级
NI全名为nice值
通常我们通过修改nice值来改变进程的优先级
一般来说 这两个的值越小进程的优先级越高 NI值为 -19 – 20 40个级别

修改命令
通过top进行修改
进入top后按“r”–>输入进程PID–>输入nice值

猜你喜欢

转载自blog.csdn.net/ifwecande/article/details/106326999