Linux中的进程状态

news2024/12/24 8:57:44

目录

一、冯诺伊曼体系结构​编辑

关于冯诺依曼,必须强调几点:

二、操作系统

1、概念

2、操作系统的作用

3、本质

4、总结

5、系统调用和库函数概念

三、进程

1、基本概念

2、描述进程

3、task_struct

4、查看进程

5、通过系统调用获取进程标示符

6、代码创建子进程

四、进程状态

1、进程状态查看

 2、僵尸进程

3、孤儿进程


一、冯诺伊曼体系结构

 

截至目前,我们所认识的计算机,都是有一个个的硬件组件组成

输入单元:包括键盘, 鼠标,扫描仪, 写板等

中央处理器(CPU):含有运算器和控制器等

输出单元:显示器,打印机等

关于冯诺依曼,必须强调几点:

这里的存储器指的是内存

不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备) 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。

一句话,所有设备都只能直接和内存打交道。

总结:内存是体系结构中的缓存,适配外设和CPU速度不均的问题的。

二、操作系统

1、概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括: 内核(进程管理,内存管理,文件管理,驱动管理)

其他程序(例如函数库,shell程序等等)

2、操作系统的作用

与硬件交互,管理所有的软硬件资源

为用户程序(应用程序)提供一个良好的执行环境

3、本质

对数据的管理

4、总结

描述起来,用struct结构体

组织起来,用链表或其他高效的数据结构

5、系统调用和库函数概念

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分 由操作系统提供的接口,叫做系统调用。

系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统 调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

三、进程

1、基本概念

进程=可执行程序+该进程对应的内核数据结构

2、描述进程

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

课本上称之为PCBprocess control block),Linux操作系统下的PCB: task_struct

3、task_struct

Linux中描述进程的结构体叫做task_struct

task_structLinux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

4、查看进程

[sunlang3@VM-12-13-centos ~]$ ll
total 24
-rw-rw-r-- 1 sunlang3 sunlang3  827 Dec 24 10:47 install.sh
-rw-rw-r-- 1 sunlang3 sunlang3   83 Dec 24 10:51 Makefile
-rwxrwxr-x 1 sunlang3 sunlang3 8408 Dec 24 20:09 process
-rw-rw-r-- 1 sunlang3 sunlang3  530 Dec 24 20:09 process.c
[sunlang3@VM-12-13-centos ~]$ ./process
hello process
hello process
hello process
^C
[sunlang3@VM-12-13-centos ~]$ ps axj | grep 'mytest'
 4013  4181  4180  4013 pts/0     4180 S+    1003   0:00 grep --color=auto mytest
[sunlang3@VM-12-13-centos ~]$ ps ajx | head -1 && ps axj |grep 'mytest' |grep -v grep
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
[sunlang3@VM-12-13-centos ~]$ 

5、通过系统调用获取进程标示符

进程id PID

父进程id PPID

[sunlang3@VM-12-13-centos ~]$ vim process1.c
[sunlang3@VM-12-13-centos ~]$ cat process1.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
  printf("pid:%d\n",getpid());
  printf("ppid:%d\n",getppid());
  return 0;
}
[sunlang3@VM-12-13-centos ~]$ gcc -o process1 process1.c
[sunlang3@VM-12-13-centos ~]$ ./process
hello process
hello process
hello process
hello process
hello process
^C
[sunlang3@VM-12-13-centos ~]$ ./process1
pid:7457
ppid:4013

6、代码创建子进程

父进程返回子进程的pid,给子进程返回0

fork有两个返回值

父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

[sunlang3@VM-12-13-centos ~]$ cat process1.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
  int ret=fork();
  printf("hello proc:%d!,ret:%d\n",getpid(),ret);
  sleep(1);
  return 0;
}
[sunlang3@VM-12-13-centos ~]$ ./process1
hello proc:17676!,ret:17677
hello proc:17677!,ret:0
[sunlang3@VM-12-13-centos ~]$ cat process1.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
  int ret=fork();
  if(ret<0)
  {
    perror("fork");
    return 1;
  }
  else if(ret==0)
  {
    printf("I am child:%d!,ret:%d\n",getpid(),ret);
  }
  else{
    printf("I am father:%d!,ret:%d\n",getpid(),ret);
  }
  sleep(1);
  return 0;
}
[sunlang3@VM-12-13-centos ~]$ gcc -o process1 process1.c
[sunlang3@VM-12-13-centos ~]$ ./process1
I am father:19060!,ret:19061
I am child:19061!,ret:0

子进程执行代码,计算数据,和父进程执行同样的代码,fork之后,父子进程代码共享,而数据各自独立,不同的返回值,让不同的进程执行不同的代码。

四、进程状态

操作系统下的进程状态:

运行状态:只要在运行队列中,代表已准备好,随时可以调度

终止状态:该进程还在,只不过永远不运行了,随时等待被释放

阻塞状态:进程等待某种资源(非CPU),资源没有就绪的时候,进程需要在该资源的等待队列中进行排队,此时进程的代码并没有运行,进程所处的状态就叫作阻塞

挂起状态:短期内不会被调度的进程,操作系统就会把该进程的代码和数据置换到磁盘上

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 */
};

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠

(interruptible sleep))。

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

1、进程状态查看

ps aux / ps axj

 2、僵尸进程

当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。

危害:

如果没有人回收子进程的僵尸,该状态会一直维护,该进程的相关资源(task_struck)不会被释放。

3、孤儿进程

父进程先退出,子进程就称之为“孤儿进程”,孤儿进程被1号init进程领养,由init进程回收。

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

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

相关文章

第19章 随机变量

第19章 随机变量 19.1随机变量示例 定义19.1.1&#xff1a;概率空间上的随机变量R是域等于样本空间的全函数。 R的陪域可以是任何东西&#xff0c;但通常是实数的一个子集。 例&#xff1a; 例如&#xff0c;假设我们抛三个独立的、公平的硬币。令C表示正面朝上的次数。如…

js中的JSON的简单用法

目录 1.JSON说明 2.JSON.stringify 3.JSON.parse 4.示例 1.JSON说明 当数据在浏览器与服务器之间进行交换时&#xff0c;这些数据只能是文本&#xff0c;JSON 属于文本并且我们能够把任何 JavaScript 对象转换为 JSON&#xff0c;然后将 JSON 发送到服务器。我们也能把从服…

最强docker部署模板

00.背景 最近学校让一个小组做一个web项目最后部署到linux服务器上&#xff0c;项目本身并不难就是简单的增删改查&#xff0c;但是我想借着这个机会写一个docker部署的模板&#xff0c;方便自己以后用&#xff0c;也希望可以帮助到大家。 01.docker简介 docker可以快捷 轻量…

Redis原理篇—网络模型

Redis原理篇—网络模型 笔记整理自 b站_黑马程序员Redis入门到实战教程 用户空间和内核态空间 服务器大多都采用 Linux 系统&#xff0c;这里我们以 Linux 为例来讲解: ubuntu 和 Centos 都是 Linux 的发行版&#xff0c;发行版可以看成对 Linux 包了一层壳&#xff0c;任何 …

第八章:数据库编程

一、嵌入式、过程化SQL、存储过程和函数 1、【单选题】 下表为oracle数据库表cj.temp_20221106的数据。建立存储过程: CREATE OR REPLACE PROCEDURE proc_temp_20221106(i INT) IS CURSOR c_temp IS SELECT * FROM cj.temp_20221106; ROW_NR c_temp%ROWTYPE; i_count …

【Linux】基础IO——系统文件IOfd重定向理解

文章目录一、回顾C文件接口1.打开和关闭2.读写文件3.细节二、系统文件I/O 1.open和closeumask小细节2.read和write1.write2.read3.小总结三、理解文件四、文件描述符fd1.引入2.理解3.分配规则4.close(1)问题五、重定向1.重定向2.接口3.追加重定向4.输入重定向六、Linux一切皆文…

信息技术 定义内涵

工作流运行 定义内涵 工作流运行是工作流模板的依次执行&#xff0c;在工作流运行时&#xff0c;用户可以随时取消或查看正在 运行的任务。由于工作流运行的模板的不同&#xff0c;运行过程中可能会产生不同的新资源&#xff0c;如数据 处理类型的工作流会产生新的数据集&…

Java框架精品项目【用于个人学习】

难度系数说明&#xff1a; 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目可用作参赛作品、大作业、计算机毕业设计等需求 前言 大家好&#xff0c;我是二哈喇子&#xff0c;此博文整理了各种项目需求&#xff0c;用于博主自己学习&#xff0c;当做个人笔记…

黑烟车识别抓拍系统 python

黑烟车识别抓拍系统利用Python基于YOLOv5通过道路已有卡口相机对现场画面中包括黑烟车、车牌信息、车头车尾照片、林格曼黑度等级数据回传给后台。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流行&#xff0c;主要是因为它的简单性和代码可…

IMX6ULL学习笔记(14)——GPIO接口使用【C语言方式】

一、GPIO简介 i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同&#xff0c;例如 GPIO1 拥有 32 个引脚&#xff0c; GPIO2 拥有 22 个引脚&#xff0c; 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference M…

【魔法圣诞树】代码实现详解 --多种实战编程技巧倾情打造

一、前言 本文会基于C# GDI技术 从零到一 实现一颗 魔法圣诞树&#xff01;源码和素材在文末全部都有&#xff01; 二、魔法圣诞树 对于用代码画圣诞树&#xff0c;网上各种编程语言像python、css、java、c/c我们都有见到过了&#xff0c;那么在绘图方面&#xff0c;还有一位…

从刘润的商业简史,预测互联网与能源的未来,辉煌的人生需要顺势而为

所有理所当然的现在&#xff0c;都是曾经看起来不可能的未来。 所有现在看起来不可想象的未来&#xff0c;可能都是明天理所当然的现在。 未来已来&#xff0c;只是尚未流行。 “一切历史都是当代史。”学习历史的目的&#xff0c;正是为了从中总结规律&#xff0c;然后用这些…

第四章:数据库安全性

一、数据库安全概述和控制 1、【单选题】TCSEC/TDI安全级别划分中&#xff0c;C1级需要实现的安全策略为&#xff1a; 我的答案&#xff1a;A 2、【单选题】能够对系统的数据加以标记&#xff0c;对标记的主体和客体实施强制存取控制&#xff08;MAC&#xff09;、审计等安全机…

绿盟SecXOps安全智能分析技术白皮书 工作流运行

工作流运行 定义内涵 工作流运行是工作流模板的依次执行&#xff0c;在工作流运行时&#xff0c;用户可以随时取消或查看正在 运行的任务。由于工作流运行的模板的不同&#xff0c;运行过程中可能会产生不同的新资源&#xff0c;如数据 处理类型的工作流会产生新的数据集&…

【关于时间序列的ML】项目 10 :用机器学习预测降雨

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

浅谈会话技术:Cookie,Session、Token

◼️ 什么是会话 会话&#xff1a; 数据交互的过程&#xff0c;在web中指 浏览器从发出一个请求到浏览器关闭&#xff0c;这个过程就是一个会话。在这个过程中&#xff0c;需要有很多的状态和数据需要我们关注&#xff0c;记录&#xff0c;这个就是我们要研究的会话 ◼️ 什么…

基于主从博弈的社区综合能源系统分布式协同优化运行策略(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

源码系列 之 HashMap

简介 HashMap可能是Java程序员最常用的集合之一了&#xff0c;面试也是常考题之一。那么我们平时了解到的特性都是怎么来的呢&#xff0c;什么一会儿是链表&#xff0c;一会儿又是红黑树。八股文选手现在已经像高中背《滕王阁序》一样&#xff0c;肌肉反应似的在脑子背过一遍了…

Github一夜爆火,不愧是阿里、字节高级架构师联合创作的Netty核心原理手册

讲到这里&#xff0c;你可能要问了&#xff1a;如果我的工作中涉及网络编程的内容并不多&#xff0c;那我是否还有必要花精力学习 Netty 呢&#xff1f;其实在互联网大厂&#xff08;阿里、腾讯、美团等&#xff09;的中高级 Java 开发面试中&#xff0c;经常会问到涉及到 Nett…

【Javassist】快速入门系列06 当检测到构造方法调用时替换方法调用的内容

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 文章目录系列文章目录前言引入J…