【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化

news2024/9/30 10:14:22

0102 Linux进程生命周期

专栏内容

  • postgresql使用入门基础
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 0102 Linux进程生命周期
  • 一、概述
  • 二、进程状态
  • 三、进程的生命周期
    • 3.1 周期阶段
    • 3.2 状态查看
  • 四、总结
  • 结尾

一、概述


在多任务并发编程中,进程是一个非常重要的概念,在应用程序运行时,都是以进程的方式启动,再展开为多进程或多线程的架构。

涉及到系统编程,每个操作系统平台实现存在差异,这里以linux操作系统为例。

在Linux操作系统中,进程是程序的一个实例化(也就是运行起来后),是系统进行资源分配和调度的基本单位。

每个进程是独立的占有资源,会被分配独立的内存空间,CPU核,文件描述符等。

进程之间通过进程间通信(IPC)机制进行通信和同步,当然这里是与线程有区别。

多进程编程就是在同一程序中创建并运行多个进程,以实现并发处理。

本节就来总体介绍一下linux下的进程相关知识,后续会对每个点进行详细介绍。
在这里插入图片描述

二、进程状态


在这里插入图片描述

在这此状态中有三个基本状态:

  • 就绪,进程的资源准备好了,尚未被分配CPU,此时处在就绪等待的状态;
  • 运行,进程被分配了CPU时间片,在分配的CPU核上正在执行时的状态;
  • 阻塞,或者睡眠;此时进程需要的资源尚未满足时所处的状态,此时会放弃占用的CPU;

三个状态相互转换:

  • 当就绪的进程被分配到CPU时,就会转换为运行状态;
  • 当运行状态的进程CPU时间片用完时,就会转换为就绪状态,等待再次分配CPU;
  • 当运行状态的进程中调用sleep或者read/write磁盘文件时,就会进入阻塞状态;
  • 当阻塞状态的进程,达到唤醒条件时,比如定时器超时,或者磁盘数据加载到了缓存时,就会转换为就绪状态;

三、进程的生命周期


在进程启动之后,通过一系列状态标识进程当前所处的阶段,直至进程结束。

3.1 周期阶段

在这里插入图片描述

对基本状态再进行细化后,整个进程的生命周期状态分为以下几种:

  • 创建:进程被创建,但尚未准备好执行。
  • 就绪:进程已准备好执行,但尚未被分配CPU时间。
  • 运行:进程正在执行。
  • 可中断的阻塞:进程在等待管道,锁等,当收到信号时可以被中断;
  • 不可中断的阻塞:进程正在等待IO动作完成,不能被信号中断;
  • 终止(Terminated):进程已完成执行或被终止。

3.2 状态查看

前一章节介绍了进程的查看方法,查看实时的活动状态,我们使用top命令;

执行命令之后,进程当前的状态是S列的值,状态取值有以下几种:

 S  --  Process Status
The status of the task which can be one of:
   D = uninterruptible sleep
   I = idle
   R = running
   S = sleeping
   T = stopped by job control signal
   t = stopped by debugger during trace
   Z = zombie
  • D,对应于不可中断的阻塞;
  • I,正在处于就绪空闲状态;
  • R,正在运行当中;
  • S,对应于可中断的阻塞;
  • T,被任务控制信号停止
  • t, 当前进程处理调试当前;
  • Z,也就是僵尸进程;

下面我们来看看实际运行的情况,在终端执行top命令:

top - 09:04:55 up 436 days, 58 min, 19 users,  load average: 3.65, 3.84, 3.86
Threads: 1512 total,   5 running, 1502 sleeping,   3 stopped,   2 zombie
%Cpu(s):  7.0 us, 13.6 sy,  0.2 ni, 77.3 id,  0.0 wa,  0.1 hi,  1.8 si,  0.0 st
MiB Mem :  31672.7 total,    260.3 free,  12496.5 used,  18915.9 buff/cache
MiB Swap:   1020.0 total,      0.0 free,   1020.0 used.  16843.8 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
1463957 senllang  20   0 2071732   1.2g   1644 R  75.6   3.7  25023:00 ./toadb-0-01 -M 2
1463958 senllang  20   0 2071732   1.2g   1644 R  75.6   3.7  25068:32 ./toadb-0-01 -M 2
1463959 senllang  20   0 2071732   1.2g   1644 S   1.3   3.7  25609:34 ./toadb-0-01 -M 2
3125409 root      20   0       0      0      0 D   1.0   0.0   0:01.80 [kworker/u32:0+flush-8:0]

可以看到有R,S,D几种状态。

当需要关注程序的性能时,如果处理D时间较长,就需要优化缓存等。

四、总结


本文介绍了linux平台下进程的基本状态,这些状态经过细化后对应进程生命周期中的各阶段;进程从创建启动之后,就处于一个有限状态机中,从就绪,运行,可中断阻塞,不可中断阻塞之间进行转换,直到进程的终止。

结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

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

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

相关文章

spring security 超详细使用教程(接入springboot、前后端分离)

Spring Security 是一个强大且可扩展的框架,用于保护 Java 应用程序,尤其是基于 Spring 的应用。它提供了身份验证(验证用户身份)、授权(管理用户权限)和防护机制(如 CSRF 保护和防止会话劫持&a…

变压吸附制氧机:原理、应用与优势

变压吸附制氧机(Pressure Swing Adsorption Oxygen Generator,简称PSA制氧机)是一种利用变压吸附技术从空气中分离出氧气的设备。 一、基本原理 变压吸附制氧机的基本原理基于不同气体在吸附剂上的吸附能力随压力变化的特性。当原料空气经过鼓风机增压后&#xff0c…

鸿蒙harmonyos next flutter通信之MethodChannel获取设备信息

本文将通过MethodChannel获取设备信息,以此来演练MethodChannel用法。 建立channel flutter代码: MethodChannel methodChannel MethodChannel("com.xmg.test"); ohos代码: private channel: MethodChannel | null nullthis.c…

面试题:通过队列实现栈

题目: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返…

C++游戏开发详解:从入门到实践

目录 引言 使用C进行游戏开发的优势 常用的C游戏引擎和工具 C游戏引擎比较 开发工具 C游戏开发核心概念与代码示例 面向对象编程(OOP) 封装 继承 多态 内存管理 手动内存管理 智能指针 内存池 并发编程 多线程 同步机制 游戏开发流程 …

C#开发中如何在不破坏封装性下调用控件

在C#开发中,我们知道每个设计文件在完成后都会存在封装性,如果是方法,对象的调用,我们可以采取public方法来允许外部的访问,但是对于控件来说,封装性是与生俱来的,强行破环封装既复杂&#xff0…

【数据结构】图的最小生成树

快乐的流畅:个人主页 个人专栏:《C游记》《进击的C》《Linux迷航》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、最小生成树的概念二、Kruskal算法2.1 思想2.2 实现 三、Prim算法3.1 思想3.2 实现 四、Kruskal和Prim的对比…

前缀和(7)_连续数组

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 前缀和(7)_连续数组 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链接…

使用python进行自然语言处理的示例

程序功能 分词:将输入句子拆分为单词。 词性标注:为每个单词标注其词性。 命名实体识别:识别命名实体(如人名、地名、组织等)。 这段代码展示了如何用 nltk 进行基础的 NLP 任务,包括分词、词性标注和命名…

17、CPU缓存架构详解高性能内存队列Disruptor实战

1.CPU缓存架构详解 1.1 CPU高速缓存概念 CPU缓存即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。CPU高速缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是…

动态规划算法专题(一):斐波那契数列模型

目录 1、动态规划简介 2、算法实战应用【leetcode】 2.1 题一:第N个泰波那契数 2.1.1 算法原理 2.1.2 算法代码 2.1.3 空间优化原理——滚动数组 2.1.4 算法代码——空间优化版本 2.2 题二:三步问题 2.2.1 算法原理 2.2.2 算法代码 2.3 题二&a…

数据集-目标检测系列-鼠检测数据集 mouse >> DataBall

数据集-目标检测系列-鼠检测数据集 mouse >> DataBall 数据集-目标检测系列-老鼠检测数据集 mouse 数据量:6k 想要进一步了解,请联系。 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。…

高效互动随心畅谈语聊大厅语音聊天系统小程序源码

高效互动随心畅谈 —— 语聊大厅语音聊天系统全解析 🎉 初识语聊大厅:语音社交的新大陆 在这个快节奏的数字时代,文字聊天似乎已经无法满足我们对即时互动和真实情感交流的需求。而“高效互动随心畅谈语聊大厅语音聊天系统”的出现&#xff…

TiDB 在线打标签实现副本调度应用实践

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/4e14596a 案例背景 某原有系统为虚拟机环境部署,整体性能不满足预期。为提升集群整体性能,计划分阶段采购物理机,并以扩缩容的方式逐渐把物理机添加到…

如何从 Windows 11/10/8.1/8/7 中恢复已删除的视频

不小心删除了视频或格式化了 SD 卡/硬盘?没有备份已删除的视频?不要担心,我们有一个解决方案 可以恢复 Windows 11、10 中已删除的视频并处理这种可怕的情况。 但是,在详细介绍如何恢复已删除的视频和视频恢复应用程序之前&#…

【AI论文精读1】针对知识密集型NLP任务的检索增强生成(RAG原始论文)

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构(用一个例子来阐明)场景例子:核心点: 五、方法 (架构各部分详解)5.1 模型1. RAG-Sequence Model2. RAG-Toke…

docker安装Portainer CE

docker安装Portainer CE 教程 1、简介 Portainer 是一款开源的容器管理工具,旨在帮助用户更轻松地管理 Docker 环境。无论您是 Docker 新手还是经验丰富的开发人员,Portainer 都提供了直观的用户界面,使您能够方便地创建、部署和监控容器。…

抖去推数字人---技术本地服务器技术开发步骤

AI数字人制作流程大致可以分为以下几个关键步骤: 虚拟形象设计:设计虚拟人物的外观和特征,可以手工完成,也可以利用计算机图形学和机器学习算法自动生成。 驱动/动作捕捉:使用动作捕捉技术记录真实演员的动作&#xf…

Rust Web自动化Demo

1.新建项目 使用RustCover新建项目,目录如下: Cargo.toml文件 [package] name "Demo" version "0.1.0" edition "2021"[dependencies] tokio { version "1", features ["full"] } thirtyfour…

【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)

1. 前言 忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  …