进程状态、排队

进程状态

  • 1. 进程排队
  • 2. 进程各个状态
  • 3. 查看一个进程的状态
  • 4. linux内核描述进程状态
  • 5. 孤儿进程

1. 进程排队

进程为什么要排队呢?答案就是资源不够。需要等待某个软硬件资源,就像我们常用的scanf函数就是等待键盘资源。

之前的文章我们有个结论,进程 = PCB + 可执行程序,那么进程排队是谁在排队呢?答案是PCB在排队,就像我们找工作,是简历排队。排队就是链入到一个数据结构中,且PCB可以链入到多种数据结构,linux内核的PCB——task_struct是以双向链表的形式链接起来的。但和一般的双向链表的实现不一样,指向下一个task_struct的指针指的不是起始地址。
在这里插入图片描述

获取起始地址的运算:(task_struct*)(&n - ((task_struct*)0 ->n)

那如何理解可以链入到多个数据结构中呢?答案就是一个task_struct中有多个struct listnode节点。

在这里插入图片描述

2. 进程各个状态

在这里插入图片描述

看起来很复杂,但是在task_struct中,状态就是一个整型变量

那分成这么多状态有什么用呢?因为状态决定了后续动作。

  1. 运行状态
    明确一个概念,一个CPU有一个运行队列,当task_struct被链入到这个运行队列中,就处于运行状态(R),表明随时准备好被调度。
    在这里插入图片描述
  2. 堵塞状态
    一个现实:当你写了一个死循环程序运行,其他的程序依然不受影响的在运行,这就表明了它被从运行队列中移除了。
    现在有一个场景,你写的程序中有一个scanf函数,我们知道是在等待键盘资源,这时候该程序的状态会发生什么呢?
    在这里插入图片描述
    这时候该程序会从运行队列中移除,将自己的状态改为堵塞,链接到键盘的等待队列中,如果等待成功,就会再将自己从等待队列中移除,链接到运行队列中,将自己的状态改为运行。

所以堵塞状态就是将task_struct从运行队列中移除再链入到等待队列中。

  1. 挂起状态
    当内存非常吃紧的时候,操作系统会将一些进程的代码和数据放入到磁盘的一个特定的区域,当缓和时,再将代码和数据放入内存。但注意task_struct不会放入磁盘。这种状态就称为挂起状态。

3. 查看一个进程的状态

  1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 5 int main()6 {7     while(1)8     {9     printf("I am a process,pid: %d,ppid: %d\n",getpid(),getppid());10     //sleep(1);                                                               11     }12     return 0;13 }
ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep

在这里插入图片描述

在这里插入图片描述
这里可能会有疑惑,为什么该段代码一直在死循环的运行,但状态还是Sleep呢?关键在于printf这个函数大部分时间还是处于一个等待硬件资源的过程中,所以很难查到运行状态,你以为printf执行的很快,但不要以自己的想法衡量CPU的速度。
为了验证这个我们将代码中这一句注释掉

 1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 5 int main()6 {7     while(1)8     {9     //printf("I am a process,pid: %d,ppid: %d\n",getpid(),getppid());10     //sleep(1);                                                               11     }12     return 0;13 }

在这里插入图片描述
果然变成的运行状态,后面的加号是什么意思呢?有加号表示这个进程是前台进程,没有加号表示是后台进程,我们在运行一个程序的时候再后面输入一个&。该程序就会以后台程序运行,只能通过kill命令终止该进程。

4. linux内核描述进程状态

/*
* 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 */
};
  1. R运行状态(running) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列
    里。
  2. S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠
    (interruptible sleep))。
  3. D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  4. T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  5. X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态.

S、D、T、t都可以理解成堵塞状态,它们都在等待资源。

  1. Z僵尸状态(zombie)
    当一个进程执行完成之后,该进程的代码和数据可以释放了,但是它返回的信息不能释放(存放在struct_task),因为需要被父进程获取。僵尸状态就是进程执行完毕但是没有获取该进程的返回信息
  1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 #include <stdlib.h>5 6 int main()7 {8     pid_t id = fork();9     if(id == 0)10     {11         printf("I am child, pid : %d, ppid : %d\n",getpid(),getppid());12         sleep(5);13         exit(0);14     }15     else16     {17         printf("I am father, pid : %d, ppid : %d\n",getpid(),getppid());18         sleep(10);19     }20     return 0;21 }

在这里插入图片描述
这会造成什么问题呢?很简单,就是内存泄漏,解决办法后面会介绍。

5. 孤儿进程

父进程比子进程先退出,那么子进程就会变成孤儿进程,并且同时变成后台程序
会造成什么影响吗?答案是不会的因为孤儿进程会被操作系统所领养

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ROS机器人系统】实验 2 熟悉和使用 URDF 创建机器人模型

文章目录 实验 2 熟悉和使用 URDF 创建机器人模型1、实验目的2、实验设备3、实验内容3.1 创建 URDF 机器人模型:(1)URDF 介绍(2)准备建立机器人模型创建文件夹以及功能文件编写相关机器人模型信息运行演示完善机器人再次运行查看动手实现1∶利用实验所学知识,为机器人添加…

简单的Udp服务器

目录 简单的UDP网络程序1.1 UdpServer.hpp1.2 UdpClient.cc1.3 main.cc1.4 makefile1.5 log.hpp 简单的UDP网络程序 1.1 UdpServer.hpp #pragma once#include <iostream> using namespace std;#include <unistd.h> #include <sys/types.h> #include <sy…

17:数据库连接池与Servlet整合-Java Web

目录 17.1 引言17.2 数据库连接池原理及实现17.3 Servlet实现数据库操作17.4 数据库连接池与直连的区别总结17.5 数据库连接池的详细配置与优化17.6 Servlet结合JDBC操作数据库的进阶实践17.7 Spring框架下的数据库连接池与数据库操作17.8 应用场景总结 在构建高性能的Java Web…

Nginx反向代理WebSocket

Nginx 配置文件说明 在配置 Nginx 前先了熟悉一下配置文件的说明&#xff0c;方便更好的理解。 #全局设置 main # 运行用户 user www-data; # 启动进程,通常设置成和cpu的数量相等 worker_processes 1;# 全局错误日志及PID文件 error_log /var/log/nginx/error.log; pi…

VOL_偷懒记录!!

目录 前端1.记录 js如何获取当前时间(YY-MM-DD hh:mm:ss)2.记录 http请求3.记录(常用) 后端1.记录 前端 1.记录 js如何获取当前时间(YY-MM-DD hh:mm:ss) getCurrentTime() {const now new Date();return ${now.getFullYear()}-${(now.getMonth() 1).toString().padStart(2,…

java面试题:MySQL中的各种JOIN的区别

表关联是频率非常高的一种数据库操作&#xff0c;在MySQL中&#xff0c;这种JOIN操作有很多类型&#xff0c;包括内联接、左外连接、右外连接等等&#xff0c;而每种连接的含义都不一样&#xff0c;如果死记硬背&#xff0c;不仅很难记住&#xff0c;而且也容易搞混淆&#xff…

pytorch 利用Tensorboar记录训练过程loss变化

文章目录 1. LossHistory日志类定义2. LossHistory类的使用2.1 实例化LossHistory2.2 记录每个epoch的loss2.3 训练结束close掉SummaryWriter 3. 利用Tensorboard 可视化3.1 显示可视化效果 参考 利用Tensorboard记录训练过程中每个epoch的训练loss以及验证loss&#xff0c;便于…

前端工程化之:webpack3-5(css module)

目录 一、css module 1.思路 2.实现原理 3.如何应用样式 4.其他操作 &#xff08;1&#xff09;全局类名 &#xff08;2&#xff09;如何控制最终的类名 5.其他注意事项 一、css module 通过命名规范来限制类名太过死板&#xff0c;而 css in js 虽然足够灵活&…

Qt应用软件【协议篇】TCP示例

文章目录 TCP协议简介Qt中的TCP编程完整代码示例实际使用中的技巧实际使用中的注意事项TCP协议简介 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。与UDP不同,TCP提供了数据包排序、重传机制、流量控制和拥塞控制,确保了数据传输的可靠性和顺序…

京东首页移动端-web实战

设置视口标签以及引入初始化样式 <link rel"stylesheet" href"./css/normalize.css"><link rel"stylesheet" href"./css/index.css"> body常用初始化样式 body {width: 100%;min-width: 320px;max-width: 640px;margin:…

作业2.5

第四章 堆与拷贝构造函数 一 、程序阅读题 1、给出下面程序输出结果。 #include <iostream.h> class example {int a; public: example(int b5){ab;} void print(){aa1;cout <<a<<"";} void print()const {cout<<a<<endl;} …

mysql 多数据源

依赖 <dependencies><!--mysql连接--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--多数据源--><dependency><g…

PostgreSQL开启wal日志归档模式

1.检查归档模式是否开启 postgres# show archive_mode;archive_mode --------------off (1 row)2.开启归档模式 ## 创建归档目录 mkdir -p /pgsql15.4/pg_arch## 配置归档相关参数 postgres# alter system set archive_modeon; ALTER SYSTEM postgres# alter system set arc…

P9240 [蓝桥杯 2023 省 B] 冶炼金属--2024蓝桥杯冲刺省一

点击跳转例题 思路&#xff1a;最开始读完题&#xff0c;我们知道求最小值最大&#xff0c;和最大值最小。是符合二分的性质的&#xff0c;但是我们再一思考可以发现这是简单的数学。 求每条记录的最小值&#xff1a;a/&#xff08;b1&#xff09;1。可以发现 a%b的情况下&…

【手写数据库toadb】虚拟文件描述符,连接表对象与物理文件的纽带,通过逻辑表找到物理文件的密码

22 存储管理抽象接口层 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,…

VLM 系列——Llava1.6——论文解读

一、概述 1、是什么 Llava1.6 是llava1.5 的升级暂时还没有论文等&#xff0c;是一个多模态视觉-文本大语言模型&#xff0c;可以完成&#xff1a;图像描述、视觉问答、根据图片写代码&#xff08;HTML、JS、CSS&#xff09;&#xff0c;潜在可以完成单个目标的视觉定位、名画…

【go】gorm\xorm\ent事务处理

文章目录 1 gorm1.1 开启事务1.2 执行操作1.3 提交或回滚 2 xorm2.1 开启事务2.2 执行操作2.3 提交或回滚 3 ent3.1 开启事务3.2 执行操作3.3 提交或回滚 前言&#xff1a;本文介绍golang三种orm框架对数据库事务的操作 1 gorm Begin开启事务 tx *gorm.DB 1.1 开启事务 tx :…

Qt PCL学习(一):环境搭建

参考 (QT配置pcl)PCL1.12.1QT5.15.2vs2019cmake3.22.4vtk9.1.0visual studio2019Qt5.15.2PCL1.12.1vtk9.1.0cmake3.22.2 本博客用到的所有资源 版本一览&#xff1a;Visual Studio 2019 Qt 5.15.2 PCL 1.12.1 VTK 9.1.0https://pan.baidu.com/s/1xW7xCdR5QzgS1_d1NeIZpQ?pw…

计算机设计大赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

React+Antd+实现省、市区级联下拉多选组件

1、效果 是你要的效果&#xff0c;咱们继续往下看&#xff0c;搜索面板实现省市区下拉&#xff0c;原本有antd的Cascader组件&#xff0c;但是级联组件必须选到子节点&#xff0c;不能只选省&#xff0c;满足不了页面的需求 2、环境准备 1、react18 2、antd 4 3、功能实现 …