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

【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程—详解!

 hi,我是云边有个稻草人  偶尔中二的博主^(* ̄(oo) ̄)^,与你分享专业知识,祝博主们端午节快乐!

Linux—本节博客所属专栏—持续更新中—欢迎订阅!

 目录

     一、冯诺依曼体系结构

二、操作系统(Operator System)

2.1 概念

2.2 设计OS的⽬的

2.3 核心功能

2.4 如何理解 "管理"

2.5 系统调用和库函数概念

三、进程

3.1 基本概念与基本操作

(1)描述进程-PCB

(2)task_ struct

(3)查看进程

(4)通过系统调⽤获取进程标⽰符

(5)通过系统调⽤创建进程—fork初识

3.2 进程状态

(1)Linux内核源代码怎么说

(2)进程状态查看

(3)Z(zombie)-僵⼫进程

(4)僵尸进程的危害

耶嘿!—Oops_Little Mix、Charlie Puth(我猜你一定听过)


正文开始——

【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程(结合画板一起看,理解效果更好)

一、冯诺依曼体系结构

我们常⻅的计算机,如笔记本。我们不常⻅的计算机,如服务器,⼤部分都遵守冯诺依曼体系

截⾄⽬前,我们所认识的计算机,都是由⼀个个的硬件组件组成。

  • 输⼊单元:包括键盘, ⿏标,扫描仪, 写板等
  • 中央处理器(CPU):含有运算器和控制器等
  • 输出单元:显⽰器,打印机等

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

  • 这⾥的存储器指的是内存
  • 不考虑缓存情况,这⾥的CPU能且只能对内存进⾏读写,不能访问外设(输⼊或输出设备)
  • 外设(输⼊或输出设备)要输⼊或者输出数据,也只能写⼊内存或者从内存中读取。
  • ⼀句话,所有设备都只能直接和内存打交道。

注意——对冯诺依曼的理解,不能停留在概念上,要深⼊到对软件数据流理解上,请解释:(可以看画图板上面的解释)

  • 从你登录上qq开始和某位朋友聊天开始,数据的流动过程。
  • 从你打开窗⼝,开始给他发消息,到他的到消息之后的数据流动过程。
  • 如果是在qq上发送⽂件呢?

二、操作系统(Operator System)

2.1 概念

任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)

笼统的理解,操作系统包括:

  • 内核(进程管理,内存管理,⽂件管理,驱动管理)
  • 其他程序(例如函数库,shell程序等等)

2.2 设计OS的⽬的

  • 对下,与硬件交互,管理所有的软硬件资源
  • 对上,为⽤⼾程序(应⽤程序)提供⼀个良好的执⾏环境

2.3 核心功能

在整个计算机软硬件架构中,操作系统的定位是:⼀款纯正的“搞管理”的软件。

2.4 如何理解 "管理"

  • 管理的例⼦ - 学⽣,辅导员,校⻓
  • 描述被管理对象
  • 组织被管理对象

总结 计算机管理硬件

  1. 描述起来,⽤ struct 结构体
  2. 组织起来,⽤链表或其他高效的数据结构

2.5 系统调用和库函数概念

  • 在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤, 这部分由操作系统提供的接⼝,叫做系统调⽤
  • 系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有心的开发者可以对部分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层⽤⼾或者开发者进⾏⼆次开 发。

承上启下

那在还没有学习进程之前,就问⼤家,操作系统是怎么管理进⾏进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!


三、进程

3.1 基本概念与基本操作

  • 课本概念:程序的⼀个执⾏实例,正在执⾏的程序等
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。

(1)描述进程-PCB

基本概念

进程信息被放在⼀个叫做进程控制块的数据结构中,可以理解为进程属性的集合。 • 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct。

task_struct—PCB的⼀种

  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的⼀种数据结构类型,它会被装载到RAM(内存)⾥并且包含着进程的信息。

(2)task_ struct

内容分类

  • 标⽰符: 描述本进程的唯⼀标⽰符,⽤来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执⾏的下⼀条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下⽂数据: 进程执⾏时处理器的寄存器中的数据[休学例⼦,要加图CPU,寄存器]。
  • I/O状态信息: 包括显⽰的I/O请求,分配给进程的I/O设备和被进程使⽤的⽂件列表。
  • 记账信息: 可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号等。
  • 其他信息 • 具体详细信息后续会介绍

组织进程

可以在内核源代码⾥找到它。所有运⾏在系统⾥的进程都以task_struct链表的形式存在内核⾥。

(3)查看进程

  1. 进程的信息可以通过 /proc 系统⽂件夹查看 如:要获取PID为1的进程信息,你需要查看 /proc/1 这个⽂件夹。
  2. ⼤多数进程信息同样可以使⽤top和ps这些⽤⼾级⼯具来获取

(4)通过系统调⽤获取进程标⽰符

  • 进程id(PID)
  • ⽗进程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}

(5)通过系统调⽤创建进程—fork初识

  • 运⾏ man fork 认识fork 
  • fork有两个返回值 
  • ⽗⼦进程代码共享,数据各⾃开辟空间,私有⼀份(采⽤写时拷⻉)
#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;
}
  • fork 之后通常要⽤ if 进⾏分流
#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){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ //fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}

注意

  • fork为什么会有两个返回值?
  • 两个返回值各种给⽗⼦如何返回?
  • ⾄于:⼀个变量怎么能让 if 和 else if 同时成⽴这个问题,需要在后⾯才能解释清楚。

3.2 进程状态

(1)Linux内核源代码怎么说

为了弄明⽩正在运⾏的进程是什么意思,我们需要知道进程的不同状态。⼀个进程可以有⼏个状态(在Linux内核⾥,进程有时候也叫做任务)。

进程状态其实就是task_struct结构体内的一个整型变量,在操作系统里面#define宏定义R,S等定义为不同的整型值0,1等, 根据进程的不同状态将task_struct里面的整型变量的值改为对应的状态,这就是状态,未来操作系统根据task_struct里面的整型值来选择如何控制进程(调度,挂起。。。)

下⾯的状态在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):这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态。

(2)进程状态查看

 ps aux / ps axj 命令
  • a:显⽰⼀个终端所有的进程,包括其他⽤⼾的进程。
  • x:显⽰没有控制终端的进程,例如后台运⾏的守护进程。
  • j:显⽰进程归属的进程组ID、会话ID、⽗进程ID,以及与作业控制相关的信息
  • u:以⽤⼾为中⼼的格式显示进程信息,提供进程的详细信息,如⽤⼾、CPU和内存使⽤情况等

(3)Z(zombie)-僵⼫进程

  • 僵死状态(Zombies)是⼀个⽐较特殊的状态。当进程退出并且⽗进程(使⽤wait()系统调⽤,后⾯讲)没有读取到⼦进程退出的返回代码时就会产⽣僵死(⼫)进程
  • 僵死进程会以终⽌状态保持在进程表中,并且会⼀直在等待⽗进程读取退出状态代码。
  • 所以,只要⼦进程退出,⽗进程还在运⾏,但⽗进程没有读取⼦进程状态,⼦进程进⼊Z状态

来⼀个创建维持30秒的僵死进程例⼦:

#include <stdio.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id > 0){ //parentprintf("parent[%d] is sleeping...\n", getpid());sleep(30);}else{printf("child[%d] is begin Z...\n", getpid());sleep(5);exit(EXIT_SUCCESS);}return 0;
}

(4)僵尸进程的危害

  • 进程的退出状态必须被维持下去,因为他要告诉关⼼它的进程(⽗进程),你交给我的任务,我 办的怎么样了。可⽗进程如果⼀直不读取,那⼦进程就⼀直处于Z状态?是的!
  • 维护退出状态本⾝就是要⽤数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中, 换句话说,Z状态⼀直不退出,PCB⼀直都要维护?是的!
  • 那⼀个⽗进程创建了很多⼦进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数 据结构对象本⾝就要占⽤内存,想想C中定义⼀个结构体变量(对象),是要在内存的某个位置 进⾏开辟空间!
  • 内存泄漏?是的!
  • 如何避免?后⾯讲。

⾄此,值得关注的进程状态全部讲解完成,下一节来认识另⼀种进程。

完——


耶嘿!—Oops_Little Mix、Charlie Puth(我猜你一定听过)

至此结束——

我是云边有个稻草人

期待与你的下一次相遇!

相关文章:

【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程—详解!

hi&#xff0c;我是云边有个稻草人 偶尔中二的博主^(*&#xffe3;(oo)&#xffe3;)^&#xff0c;与你分享专业知识&#xff0c;祝博主们端午节快乐&#xff01; Linux—本节博客所属专栏—持续更新中—欢迎订阅&#xff01; 目录 一、冯诺依曼体系结构 二、操作系统(Opera…...

WPF 全局加载界面、多界面实现渐变过渡效果

WPF 全局加载界面与渐变过渡效果 完整实现方案 MainWindow.xaml <Window x:Class"LoadingScreenDemo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&quo…...

WebSocket与实时对话式AI服务的集成

WebSocket与实时对话式AI服务的集成 在现代对话式AI系统中,传统的HTTP请求-响应模型已难以满足实时交互的体验需求。特别是用户对响应速度、逐字输出、会话上下文保持等方面提出更高要求时,需要一种能够建立持久连接并支持双向通信的协议。WebSocket正是在这一背景下,成为A…...

【xmb】】内部文档148344599

这里写自定义目录标题 CyberDog 2 仿真智能物流配送系统 – 初赛设计报告摘要目录1 引言2 任务与需求分析3 系统总体设计4 核心算法与模块实现5 仿真测试与结果分析6 结论与展望 CyberDog 2 仿真智能物流配送系统 – 初赛设计报告 团队名称&#xff1a; &#xff08;晚点写&am…...

MobaXterm国内下载与安装使用教程

MobaXterm是一款为 Windows 用户量身打造的远程终端工具&#xff0c;它将多种网络功能集成在一个轻量级、便携式的界面中&#xff0c;尤其适合需要频繁与远程主机交互的开发者、系统运维工程师以及科研技术人员。无论是管理 Linux 服务器、远程执行命令&#xff0c;还是图形化运…...

数据结构——优先级队列(PriorityQueue)

1.优先级队列 优先级队列可以看作队列的另一个版本&#xff0c;队列的返回元素是由是由插入顺序决定的&#xff0c;先进先出嘛&#xff0c;但是有时我们可能想要返回优先级较高的元素&#xff0c;比如最大值&#xff1f;这种场景下就由优先级队列登场。 优先级队列底层是由堆实…...

代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包依赖包安装包加载需要的R包数据下载以及转换mzML数据预处理代谢物注释LipidFinder过滤MultiABLER数据预处理过滤补缺失值对数变换数据标准化下游数据分析总结系统信息参考介…...

服务器上用脚本跑python深度学习的注意事项(ubantu系统)

bash: $\r: command not found 问题原因&#xff1a; 出现 bash: $\r: command not found 以及路径中出现 \r 通常是因为脚本文件是在Windows系统下编辑&#xff0c;然后在Linux&#xff08;如Ubuntu&#xff09;系统中运行。在Windows系统中&#xff0c;文本文件的换行符是 \…...

【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议

Chapter.1 AXI4总线协议 作者&#xff1a;齐花Guyc(CAUC) 一、总线介绍 AXI4总线 AXI4总线就像是SoC内部的“高速公路”&#xff0c;负责在不同硬件模块之间高效传输数据。 AXI4协议通过 5个独立通道 传输数据和控制信号&#xff0c;每个通道都有自己的信号线&#xff0c;互…...

青少年编程与数学 02-020 C#程序设计基础 10课题、桌面应用开发

青少年编程与数学 02-020 C#程序设计基础 10课题、桌面应用开发 一、桌面应用1. 主要特点2. 常见类型3. 优势4. 局限性 二、开发步骤1. 准备工作2. 创建项目3. 开发应用4. 运行调试5. 打包发布 三、Windows 窗体应用&#xff08;一&#xff09;定义&#xff08;二&#xff09;特…...

把 jar 打包成 exe

1. 把自己的项目先正常打成jar包 2. 使用exe4j工具将jar转换为exe 2.1 exe4j下载地址&#xff1a;https://www.ej-technologies.com/download/exe4j/files 2.2 下载完成之后激活 2.3 可以点击Change License&#xff0c;输入秘钥L-g782dn2d-1f1yqxx1rv1sqd 2.4 直接下一步…...

【目标检测】检测网络中neck的核心作用

1. neck最主要的作用就是特征融合&#xff0c;融合就是将具有不同大小感受野的特征图进行了耦合&#xff0c;从而增强了特征图的表达能力。 2. neck决定了head的数量&#xff0c;进而潜在决定了不同尺度样本如何分配到不同的head&#xff0c;这一点可以看做是将整个网络的多尺…...

【经验】Ubuntu中设置terminator的滚动行数、从Virtualbox复制到Windows时每行后多一空行

1、设置terminator的滚动行数 1.1 问题描述 在终端 terminator 中&#xff0c;调试程序时&#xff0c;只能查看有限行数的打印日志&#xff0c;大约是500行&#xff0c;怎么能增加行数 1.2 解决方法 1&#xff09;安装terminator sudo apt install terminator和 terminato…...

使用微软最近开源的WSL在Windows上优雅的运行Linux

install wsl https://github.com/microsoft/WSL/releases/download/2.4.13/wsl.2.4.13.0.x64.msi install any distribution from microsoft store, such as kali-linux from Kali office website list of distribution PS C:\Users\50240> wsl -l -o 以下是可安装的有…...

HackMyVM-Teacher

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-01 01:02 EDT Nmap scan report for 192.168.43.1 Host is up (0.0084s latency). MAC Address: C6:45:66:05:91:88 (Unknow…...

BugKu Web渗透之矛盾

开启场景&#xff0c;打开网页。发现是一段php代码。 这段代码也很好理解&#xff0c;就是get方式传参num&#xff0c;如果num不是数字类型&#xff0c;那么输出num的值&#xff0c;并且num1时&#xff0c;输出flag的值。 首先看看is_numeric的意思。 开始我想到了使用科学技术…...

hot100 -- 4.子串系列

1.和为 K 的子数组 问题&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 方法1&#xff1a;暴力枚举 # 方法1&#xff1a;暴力枚举&#xff08;遍历子数组起点和终点&…...

Python实现P-PSO优化算法优化卷积神经网络CNN回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能和深度学习技术的快速发展&#xff0c;卷积神经网络&#xff08;CNN&#xff09;在图像分类、目标检测…...

ssm 学习笔记day03

环境搭建 spring配置数据库 1.在pom.xml安装相应的依赖 2.在properties里面配置数据库的相关信息&#xff0c;需要强调的一点是&#xff0c;一定不要在properties里面添加任何空格&#xff0c;否则就会像我一样搞了两小时&#xff0c;数据一直报错&#xff0c;然后发现是空格的…...

mkdir: cannot create directory ‘gitlab-stu’: No space left on device

Linux中创建目录时报错“mkdir: cannot create directory ‘gitlab-stu’: No space left on device”&#xff0c;磁盘空间不足。 使用df命令查看&#xff0c;发现 / 下面use%占满了&#xff1a; 查看inode使用情况&#xff1a; 可以看到docker的数据大部分存放在/var/lib/do…...

【前端面经】云智慧一面

写在前面&#xff1a;面经只是记录博主遇到的题目。每题的答案在编写文档的时候已经有问过deepseek&#xff0c;它只是一种比较普世的答案&#xff0c;要学得深入还是靠自己 Q&#xff1a;手撕代码&#xff0c;两个有序数组排序 A&#xff1a; function mysort(arr1, arr2) {…...

ESP8285乐鑫SOCwifi芯片32bit MCU和2.4 GHz Wi-Fi

简介 ESP8285 拥有完整的且⾃成体系的 Wi-Fi ⽹络功能&#xff0c;既能够独⽴应⽤&#xff0c;也可以作为从机搭载于其他主机 MCU 运⾏。当 ESP8285 独⽴应⽤时&#xff0c;能够直接从外接 flash 中启动。内置的⾼速缓冲存储器有利于提⾼系统性能&#xff0c;并且优化存储系统。…...

DL00916-基于深度学习的金枪鱼各类别目标检测含完整数据集

文末有获取方式 &#x1f680; 基于深度学习的金枪鱼目标检测——开创智能识别新领域&#xff01; 在计算机视觉和深度学习的快速发展中&#xff0c;目标检测 技术已成为提升行业效率的核心利器。而对于海洋生物领域&#xff0c;尤其是金枪鱼的 目标检测&#xff0c;更是填补了…...

不可变集合类型转换异常

记录一个异常&#xff1a;class java.util.ImmutableCollections$ListN cannot be cast to class java.util.ArrayList (java.util.ImmutableCollections$ListN and java.util.ArrayList 文章目录 1、原因2、解决方式一3、解决方式二4、关于不可变集合的补充4.1 JDK8和9的对比4…...

【PyQt5】从零开始的PyQt5 - QLabel篇

从零开始的PyQt5 - QLabel篇 引言一、简述二、例程2.1 显示到QWidget窗口上2.2 重新设置Label大小和对齐方式2.3 添加内容&#xff0c;设置边框2.4 显示富文本 三、参考 引言 QLabel主要用于显示文本或图像&#xff0c;不提供用户交互功能。本文主要简述PyQt5中的QLabel以及展…...

多模态AI的企业应用场景:视觉+语言模型的商业价值挖掘

关键词&#xff1a;多模态AI | 视觉语言模型 | 企业应用 | 商业价值 | 人工智能 &#x1f4da; 文章目录 一、引言&#xff1a;多模态AI时代的到来二、多模态AI技术架构深度解析三、客服场景&#xff1a;智能化服务体验革命四、营销场景&#xff1a;精准投放与创意生成五、研…...

数据结构(7)树-二叉树-堆

一、树 1.树的概述 现实生活中可以说处处有树。 在计算机里&#xff0c;有一种数据结构就是像现实中的树一样&#xff0c;有根&#xff0c;有分支&#xff0c;有叶子&#xff1b;一大片树就叫做森林。 这些性质抽象到计算机里也叫树&#xff0c;大致长这个样子&#xff1a; …...

时序数据库IoTDB基于云原生的创新与实践

概述 Apache IoTDB 是一款独立自研的物联网时序数据库&#xff0c;作为 Apache 基金会的顶级项目&#xff0c;它融合了产学研的优势&#xff0c;拥有深厚的科研基底。IoTDB 采用了端边云协同的架构&#xff0c;专为物联网设计&#xff0c;致力于提供极致的性能。 数据模型 I…...

怎么快速判断一款MCU能否跑RTOS系统

最近有朋友在后台中私信我&#xff0c;说现在做项目的时候有时候总是会考虑要不要用RTOS&#xff0c;或者怎么考量什么时候该用RTOS比较好、 关于这个问题&#xff0c;我个人也是深有感触的&#xff0c;做开发这么久了&#xff0c;大大小小的产品都做过不少了。有用RTOS开发的…...

使用原生前端技术封装一个组件

封装导航栏 navbar-template.html <header><nav><ul><li><a href"index.html"><i class"fas fa-home"></i> 主页</a></li><li><a href"#"><i class"fas fa-theate…...