当前位置: 首页 > news >正文

【进程篇】04.进程的状态与优先级

一、进程的状态

1.1 进程的状态

在这里插入图片描述

1.1.1 并行与并发

并行: 多个进程在多个CPU下分别,同时进行运行
并发: 多个进程在一个CPU下采用进程切换的方式,在一个时间片内,让多个进程都得以推进

1.1.2 时间片的概念

LInux/windows这些民用级别的操作系统都是分时操作系统,根据时间片进行调度轮转的,与之相对的是实时操作系统

1.1.3 进程具有独立性

上一篇博客中已经讲过。

1.1.4 认识运行、阻塞与挂起

• 在CPU中有一个runqueue,操作系统会根据FIFO获取进程并将进程基于时间片进行调度轮转,因而只要进程在runqueue中就已经是运行态
• 操作系统会对设备进行管理,因此有了struct device 对设备进行先描述后组织。当进程执行到某一位置时,可能会调用外部设备(如键盘),这时就会将进程链入waitqueue中,这一状态称为阻塞态
• 当内存内存资源严重不足时,操作系统会将等待队列的进程中的数据换出到磁盘中,而当用户完成指定操作后又会将数据换入到内存中,磁盘中支持此操作有专门的分区(swap分区)。这也就是阻塞挂起状态
• 对于阻塞挂起状态本质就是以时间换空间的做法,现在大部分的公司都会禁掉该操作。

1.2 Linux的进程状态

在这里插入图片描述

下面这段代码是Linux0.11版本中的状态源码:

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R :运行状态
S :浅度休眠状态,可以被kill
D:磁盘休眠状态,不可被kill

D状态存在的意义在于,当内存资源严重不足时,操作系统可能会将正在向磁盘传输数据的进程杀掉以维持自身安全,但是数据是不可恢复的,一旦进程被终止,我们并不知道传输数据这个操作是否成功,因此引入了D状态,使得操作系统不能杀死处于D状态的程序。

T:暂停状态,通常是进程做了非法但不致命的操作,只能用kill -9终止
t :追踪暂停状态,常见调试时打断点
X:死亡状态
Z:僵尸状态,用于维护自己的task_struct,方便为了父进程读取进程退出信息

理解X状态和Z状态
• 进程创建的目的自然是为了完成用户的任务。那么进程就需要知道这个任务完成的情况,这样就需要将执行的进程的执行结果返回给父进程/操作系统。我们可以使用$?来查看最近的一个进程的退出信息。
•进程=内核数据结构(struct task_struct)+代码和数据。进程在退出时,首先立即释放的就是该进程的代码和数据。但是进程的退出信息需要返回给父进程/操作系统,而退出信息保存在task_struct中。因此进程的退出信息必须要被操作系统维护起来,方便用户的获取。*这时的进程状态就是Z状态。 *当进程的退出信息被父进程/操作系统获取之后,进程就销毁了,这时的进程就是X状态。


知道了当子进程退出,父进程没有退出时,子进程就是僵尸进程;那么当父进程退出,子进程没有退出时是什么情况呢?
这就是孤儿进程,子进程会被系统领养,当它退出时,系统会对这个子进程进行处理回收。

二、进程的优先级

2.1 概念

优先级本质上就是对某种资源获取的先后顺序,这种资源往往是稀缺的。在进程层次来看,优先级竞争的是CPU资源。

2.2 Linux进程优先级

我们可以使用ps -l 查到优先级信息:

[caryon@VM-24-10-centos ~]$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001  6876  6875  0  80   0 - 29247 do_wai pts/0    00:00:00 bash
0 R  1001  6975  6876  0  80   0 - 38332 -      pts/0    00:00:00 ps

在task_struct中有优先级属性,它是通过几个int类型的变量来表示优先级的。优先级的数字越小,对应进程的优先级越高。
上图中的PRI和NI两个属性影响进程的优先级,其中PRI是默认优先级(80),NI是优先级的修正数据([-20,20))

优先级如何进行调整呢?
使用top指令,输入r,然后根据提示进行调整。

但是一般情况下我们不对优先级进行调整,即使调整也要保证nice值有一定的范围,这是因为我们的操作系统是分时操作系统,对进程的调度要尽量公平。

UID
上图中我们还看到了UID这一属性,UID全称User Identify,是用以标记进程是谁启动的。在文件显示时,我们可以使用ll -n来以数字显示文件的相关属性,这个数字也是UID。

[caryon@VM-24-10-centos linux]$ ll -n
total 2452
drwxrwxr-x 2 1001 1001   4096 Sep 16 11:39 test

前面我们知道文件有自己的权限,即拥有者、所属组;我们还知道Linux下一切皆文件,所有的操作都是进程操作,因此进程会记录是谁启动的这个进程。通过UID与文件的拥有者、所属组进行对比实现了对权限的控制。

http://www.lryc.cn/news/506423.html

相关文章:

  • ElasticSearch 数据聚合与运算
  • 科研学习|论文解读——智能体最新研究进展
  • 面试小札:Java后端闪电五连鞭_8
  • java error(2)保存时间带时分秒,回显时分秒变成00:00:00
  • 计算机毕业设计python+spark+hive动漫推荐系统 漫画推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据毕设
  • 数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?
  • (8)YOLOv6算法基本原理
  • LNMP+discuz论坛
  • 在linux系统的docker中安装GitLab
  • Python面试常见问题及答案12
  • 从0-1开发一个Vue3前端系统页面-9.博客页面布局
  • [手机Linux] 六,ubuntu18.04私有网盘(NextCloud)安装
  • 白话java设计模式
  • 助力 Tuanjie OpenHarmony 开发:如何使用工具包 Hilog 和 SDK Kits Package?
  • NSDT 3DConvert:高效实现大模型文件在线预览与转换
  • 电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据
  • VUE+Node.js+mysq实现响应式个人博客|项目初始化+路由配置+基础组件搭建
  • Python如何正确解决reCaptcha验证码(9)
  • web3跨链预言机协议-BandProtocol
  • JAVA将集合切分成指定份数(简易)
  • 深度神经网络(DNN)在时序预测中的应用与缺陷
  • springboot445新冠物资管理(论文+源码)_kaic
  • C++算法第十一天
  • 常 用 类
  • ACL(访问控制列表)
  • json字符串转json
  • GPT-Omni 与 Mini-Omni2:创新与性能的结合
  • 探秘 JSON:数据交互的轻盈使者
  • 源码分析之Openlayers中的Attribution属性控件
  • Shell自定义(二)