linux进程(进程状态)

目录

前言:

正文: 

 1.R运行状态(running)

2.睡眠状态(sleeping)

3.D磁盘休眠状态(Disk sleep) 

4停止状态(stop)

5僵尸状态(Z)

 6 孤儿进程

 补充知识:前后台进程


前言:

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在linux内核里,进程有时候也叫任务)

下面的状态在kernel源码中的定义:

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

正文: 

 1.R运行状态(running)

          运行态具体是指:当操作系统把CPU资源分配给进程时(cup对进程进行调度),进程会在运行队列里面排队(运行状态)在一个时间段内,所有的进程都会被执行,并发执行。在运行状态下,进程会执行它所分配的任务。当进程的时间片用完后,进程就会被挂起(带走自己的上下文),等待下一次CPU调度。

  我们可以看一下在Linux下的R状态【查看进程状态的命令:ps ajx/aux 】。如下:

 process.c

 1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int main()5 {6  pid_t id = fork();7  if(id < 0){ perror("fork");8  return 1;9  }10  else if(id == 0){11     // child12      printf("I am child, pid :[%d] ppid:[%d]\n", getpid(),getppid());13      sleep(20);14 15  }else{16      //parent17      printf("I am parent, pid: [%d] ppid:[%d]\n", getpid(),getppid());18     sleep(10);19     exit(0);                                                                   20 21  }22  return 0;23 }

Makefile 

 myprocess:process.c2     gcc -o myprocess process.c                                                 3 4 .PHONY:clean5 clean:6     rm -r myprocess7 8 .PHONY:catP9 catP:10     ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep11         

 通过指令对进程状态进行查看

 

我们会发现不管是父进程还是子进程,我们看到的状态都是S+,这是因为对于cpu来说,将数据回显到显示器的任务在电光火石之间就完成了,我们很难捕捉到,所以我们大部分捕捉的动作他都是在等待队列中进行排队。

        (R+是在运行队列中被操作系统管理这,也是在排队,他不一定被cpu调度)排队类似下图

为了捕捉,我们可以将打印语句屏蔽,让其一直死循环,这样我们就可以在调度的时间片内捕捉到其运行状态。 

 

2.睡眠状态(sleeping)

 

  睡眠状态是指:当进程被调用而等待某个事件的发生时,该进程就会进入睡眠状态。通俗来讲,当我们要完成某种任务的时候,任务条件不具备,需要进程进行某种等待。(也叫进程阻塞

  进程等待时,都是在等待CPU资源吗?答案是:并不是!

  睡眠状态被认为是一种阻塞状态,因为该进程在等待发生的事件情况下不能真正地执行,所以CPU的资源也就会被阻塞。只有当该事件发生,进程才能被唤醒并继续执行。

 补充:s+是一种前台进程,我们可以通过输入信号将其关闭,也就是键盘上的ctrl+c将进程杀死,(会在信号章节进行详细介绍)。

 

3.D磁盘休眠状态(Disk sleep) 

D磁盘休眠状态(Disk sleep)表示进程因等待磁盘I/O操作时而被阻塞,并且进程等待的操作可能会很慢,也可能永远不会完成。当出现大量相同操作的时候,就会出现休眠状态。

  例如有一个进程需要把数据写入磁盘,且数据量很大。而写入磁盘的过程相对来说并不是很快,进程需要等待一段时间。等待的过程中,同时也占用了CPU的资源, 我们都知道操作系统是不会浪费任何内存,所以他有杀死进程的功能。如果该进程写入的数据很重要,需要磁盘读取数据完成后的返回信息。但也可能会被误操作给删除。所以给他一个免死金牌D状态,该进程不可被操作系统终止。

  在Linux系统中,有些进程可能预期会处于D状态,例如,磁盘I/O操作比较耗时的进程。而对于其他类型的进程,处于D状态通常是不正常的,需要进行诊断和解决。常用的解决方法包括重启系统、更换设备等。
 

4停止状态(stop)

         

  T停止状态(stopped)表示进程已经被挂起,不再运行,但是它尚未完成或终止。进程可以进入停止状态是由于收到一个SIGSTOP、SIGTSTP、SIGTTIN或者SIGTTOU信号,以及调试器进程发送的SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT、SIGBUS、SIGFPE、SIGSEGV、SIGPIPE、SIGALRM、SIGTERM、SIGURG、SIGXCPU、SIGXFSZ和SIGSTOP信号。

我们可以利用kill - 18 kill-19让进程 恢复或者暂停。

5僵尸状态(Z)

与死亡状态相对应的还有一个 僵尸 T 状态

通俗来说,僵尸状态 是给 父进程 准备的
当 子进程 被终止后,会先维持一个 僵尸 状态,方便 父进程 来读取到 子进程 的退出结果,然后再将 子进程 回收。
单纯的在 bash 环境下终止 子进程,是观察不到 僵尸状态 的,因为 bash 会执行回收机制,将 僵尸 回收。

  • 我们可以利用 fork() 函数自己创建 父子进程 关系,观察到这一现象

 

1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int main()5 {6  pid_t id = fork();7  if(id < 0){ perror("fork");8  return 1;9  }10  else if(id == 0){11 12      // child                                                                  13      printf("I am child, pid :[%d] ppid:[%d]\n", getpid(),getppid());14      sleep(5);15 16  }else{17      //parent18     printf("I am parent, pid: [%d] ppid:[%d]\n", getpid(),getppid());19     sleep(20);20     exit(0);21 22  }23  return 0;24 }
~
~
~

 

 

 6 孤儿进程

  • 通过程序创建 父子进程
  • 通过指令终止 父进程,此时 子进程 会被OS领养
  • 子进程 的 父进程 变为 1号进程
  • 子进程 就变成了一个 孤儿进程

我们可以通过以下代码验证当父进程先退出的时候,子进程是不是被1号进程接管。

 1 #include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int main()5 {6  pid_t id = fork();7  if(id < 0){ perror("fork");8  return 1;9  }10  else if(id == 0){11 12      // child13      printf("I am child, pid :[%d] ppid:[%d]\n", getpid(),getppid());14      sleep(35);15 16  }else{17      //parent18     printf("I am parent, pid: [%d] ppid:[%d]\n", getpid(),getppid());19     sleep(5);                                                                  20     exit(0);21 22  }23  return 0;24 }
~

 

 补充知识:前后台进程

Linux中运行的程序可以在前台(foreground)或者后台(background)运行。前台程序是在当前终端会话中运行的程序,而后台程序则是在系统内部运行的,没有与用户终端会话相关联。上述带 ‘+’ 号的就是在前台运行的程序,不带 ‘+’ 号的就是在后台运行的程序。

  当用户在终端中输入运行一个程序的命令时,该程序默认以前台方式运行,它会在终端上打印输出并且用户必须等待程序执行完成。

  如果在命令末尾加上 & 符号,就可以让程序在后台运行。具体如下图:

 

  如果需要与后台程序交互,可以使用一些特殊的命令,如:jobs, fg等,来查看和控制程序的状态。 fg 指令就可吧后台进程转换到前台运行。例如: 


$ jobs       #查看后台运行的程序
$ fg %1     #将后台中的程序1转为前台运行

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

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

相关文章

攻防世界 CTF Web方向 引导模式-难度1 —— 11-20题 wp精讲

PHP2 题目描述: 暂无 根据dirsearch的结果&#xff0c;只有index.php存在&#xff0c;里面也什么都没有 index.phps存在源码泄露&#xff0c;访问index.phps 由获取的代码可知&#xff0c;需要url解码(urldecode )后验证id为admin则通过 网页工具不能直接对字母进行url编码 …

SolidWorks学习笔记——入门知识2

目录 建出第一个模型 1、建立草图 2、选取中心线 3、草图绘制 4、拉伸 特征的显示与隐藏 改变特征名称 5、外观 6、渲染 建出第一个模型 1、建立草图 图1 建立草图 按需要选择基准面。 2、选取中心线 图2 选取中心线 3、草图绘制 以对称图形举例&#xff0c;先画出…

股票均线的使用方法和实战技术,看涨看空的均线形态与案例教学

一、教程描述 本套教程讲解了14种均线的特殊形态&#xff0c;通过直观图形以及大量案例的教学&#xff0c;将深奥、繁琐的均线变得生动与具体&#xff0c;广大投资者在认真学习以后&#xff0c;可以学会均线的使用方法&#xff0c;掌握最强的均线应用实战技术。本套教程不仅适…

[韩顺平]python笔记

AI工程师、运维工程师 python排名逐年上升&#xff0c;为什么&#xff1f; python对大数据分析、人工智能中关键的机器学习、深度学习都提供有力的支持Python支持最庞大的 代码库 &#xff0c;功能超强 数据分析&#xff1a;numpy/pandas/os 机器学习&#xff1a;tensorflow/…

【Linux】指令提权-sudo

Hello everybody&#xff0c;新年快乐&#xff01;哈哈&#xff01;今天打算给大家讲讲指令提权的相关知识&#xff0c;虽然内容不多&#xff0c;但有时却很有用。在我们学习过权限&#xff0c;vim后就可以学习指令提权啦&#xff0c;没看过的宝子们建议先去看一看我之前的文章…

初识Solidworks:我的第一份作业的感想

从来没用CAD软件画过机械设计图。但我脑子里有一种概念&#xff0c;无非就是把尺规作图软件化&#xff0c;更方便画图、更方便修改、更方便打印一些。但第一份 Solidworks 作业就颠覆了我的认知&#xff0c;考虑到这个软件的上市时间&#xff0c;让我意识到自己对 CAD 软件的认…

BUUCTF LKWA

1.访问页面。 2.选择 Variables variable 关卡 3.获得flag http://357dab81-78b8-4d74-976a-4a69dd894542.node5.buuoj.cn:81/variables/variable.php?funcpassthru&inputcat%2Fflagflag{0020ced6-8166-4fa5-87a7-7d93ee687c3e}

SPSS基础操作:对数据按照变量进行排序

在整理数据资料或者查看分析结果时&#xff0c;如果变量设置得非常多&#xff0c;我们有时会希望变量值能够按照变量的某一属性大小进行升序或者降序排列&#xff0c;比如我们想观察有哪些变量是名义变量或者有序变量&#xff0c;有哪些变量进行了变量标签操作或者值标签操作等…

H12-821_73

73.某台路由器Router LSA如图所示&#xff0c;下列说法中错误的是&#xff1f; A.本路由器的Router ID为10.0.12.1 B.本路由器为DR C.本路由器已建立邻接关系 D.本路由器支持外部路由引入 答案&#xff1a;B 注释&#xff1a; LSA中的链路信息Link ID&#xff0c;Data&#xf…

python web 框架Django学习笔记

2018年5月 python web 框架Django学习笔记 Django 架站的16堂课 MVC架构设计师大部分框架或大型程序项目中一种软件工程的架构模式&#xff0c;把程序或者项目分为三个主要组成部分&#xff0c;Model数据模型、View视图、Controller控制器。 命令及设置相关 创建数据库及中间…

女程序员失业半年,某央企以为她已婚已孕,准备发offer,结果发现她未婚未孕,立马反悔,取消offer。...

职场中&#xff0c;性别平等一直是热议的话题。特别是女性职员&#xff0c;在招聘和晋升的过程中&#xff0c;往往面临着不小的挑战。 最近&#xff0c;一个帖子在网上引发了广泛关注。一位女性因为失业半年终于拿到了央企的offer&#xff0c;却因为企业误以为她已婚已孕而准备…

数据结构之外部排序

外部排序就是对大型文件的排序&#xff0c;待排序的记录存放在外存。在排序的过程中&#xff0c;内存只存储文件的一部分记录&#xff0c;整个排序过程需要进行多次内外存间的数据交换。   常用的外部排序方法是归并排序&#xff0c;一般分为两个阶段&#xff1a;在第一阶段&…

ElasticSearch之search API

写在前面 本文看下查询相关内容&#xff0c;这也是我们在实际工作中接触的最多的&#xff0c;所以有必要好好学习下&#xff01; 1&#xff1a;查询的分类 主要分为如下2类&#xff1a; 1:基于get查询参数的URI search 2&#xff1a;基于post body的request body search&am…

Go语言安全编码:crypto/sha1库全面解析

Go语言安全编码&#xff1a;crypto/sha1库全面解析 简介SHA-1基础原理和特点SHA-1与其他哈希算法的比较代码示例&#xff1a;基本的SHA-1哈希生成 使用crypto/sha1处理数据处理字符串和文件的SHA-1哈希代码示例&#xff1a;为文件生成SHA-1哈希 常见错误和最佳实践 在实际项目中…

leetcode(双指针)283.移动零(C++详细题解)DAY3

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 示例 1: 输入…

【Make编译控制 06】CMake初步使用

目录 一、概述与安装 二、编译源文件 三、无关文件管理 一、概述与安装 CMake是一个跨平台的项目构建工具&#xff0c;相比于Makefile&#xff0c;CMake更加高级&#xff0c;因为CMake代码在执行的时候是会先翻译生成Makefile文件&#xff0c;再调用Makefile文件完成项目构…

辅警考试怎么搜答案?这4款足够解决问题 #微信#知识分享

对于大学生来说&#xff0c;每天面对各式各样的学习任务和问题&#xff0c;寻找合适的学习资源和工具成了我们的迫切需求。幸运的是&#xff0c;现如今有许多高效且实用的日常搜题和学习软件可以满足我们的需求&#xff0c;助力我们取得更好的学习成果。 1.颐博查题 这是一个…

Django问题报错:TypeError: as_view() takes 1 positional argument but 2 were given

一、错误位置 from django.urls import pathfrom users_app.views import RegisterView, LoginView, LogoutViewapp_name users urlpatterns [path("register/", RegisterView.as_view, name"register"),path("login/", LoginView.as_view, n…

Netty中的常用组件(三)

ChannelPipeline 基于Netty的网路应用程序中根据业务需求会使用Netty已经提供的Channelhandler 或者自行开发ChannelHandler&#xff0c;这些ChannelHandler都放在ChannelPipeline中统一 管理&#xff0c;事件就会在ChannelPipeline中流动&#xff0c;并被其中一个或者多个Chan…

VED-eBPF:一款基于eBPF的内核利用和Rootkit检测工具

关于VED-eBPF VED-eBPF是一款功能强大的内核漏洞利用和Rootkit检测工具&#xff0c;该工具基于eBPF技术实现其功能&#xff0c;可以实现Linux操作系统运行时内核安全监控和漏洞利用检测。 eBPF是一个内核内虚拟机&#xff0c;它允许我们直接在内核中执行代码&#xff0c;而无…