【Linux杂货铺】进程的基本概念


目录

🌈前言🌈

📁进程的概念

📂描述进程-PCB

📂 查看进程

📂 查看正在运行的程序

📂杀死进程

📂通过系统调用获取进程标识符

📂通过系统调用创建进程

📂 进程的特点

📁进程的状态

📂 kill 信号

📂 僵尸进程 

📂 孤儿进程

📂 运行状态

📂 阻塞状态

📂 挂起状态

📁进程的切换

📁进程的优先级

📂 概念

📂 原则

📂 查看方式

📂 PRI 和 NI

📂 调整方式

📁 进程的地址空间 (虚拟地址)

📂 虚拟地址的好处

📁 Linux2.6 内核进程调度队列​编辑

📂 活动队列

📂  过期队列

📂active指针和expired指针

📁总结


🌈前言🌈

        欢迎观看本期【Linux杂货铺】,本期内容,将讲解操作系统中重要的概念——进程。本篇文章将讲解操作系统关于进程的通用知识,以及在Linux中如何组织管理进程,以及运行进程。

        如果你还不是很了解操作系统的概念,可以收看上期关于操作系统的知识:

【Linux杂货铺】操作系统-CSDN博客

        这里简单概括一下操作系统的的前置知识,即什么管理,简单概括就是先描述,在组织。举个例子,操作系统将一个个硬件描述为一个结构体struct,将结构体组织称不同数据结构,例如链表,通过对链表的增删查改来管理硬件。

        这里就先介绍了操作系统重管理的概念。

📁进程的概念

        除法任何一个事件时,系统都会将它定义为一个进程,并给予这个进程一个ID,称为PID,同时根据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。

        执行一个程序或者命令,就是触发一个事件,而获取一个PID。

        简单来说就是一个正在运行的程序。

📂描述进程-PCB

        进程的信息会被放在一个叫进程控制块的数据结构中,可以理解为进程的属性。在Linux系统中PCB是:task_struct。

        task_stuct就是Linux内核中的一个数据结构,它会被装载到内存里并且包含进程的信息。

task_ struct 内容分类
  ● 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  ● 状态: 任务状态,退出代码,退出信号等。
  ● 优先级: 相对于其他进程的优先级。
  ● 程序计数器: 程序中即将被执行的下一条指令的地址。
  ● 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  ● 上下文数据: 进程执行时处理器的寄存器中的数据 [ 休学例子,要加图 CPU ,寄存器 ]
  ● I/ O 状态信息 : 包括显示的 I/O 请求 , 分配给进程的 I O 设备和被进程使用的文件列表。
  ● 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  ● 其他信息

        进程 = 内核结构体PCB + 程序的代码和数据。

        每个进程都有一个唯一标识符,叫pid。

📂 查看进程

        进程信息可以通过 /proc 系统文件查看。如获得PID为1的进程信息,需要查看/proc/1这个文件。

        大多数进程信息同样可以使用top和ps这些用户级工具来获取。

📂 查看正在运行的程序

ps -ajx 
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 while(1){
 sleep(1);
 }
 return 0;
}

📂杀死进程

kill -9 pid

        kill 先简单理解为向进程发了个信号,-9表示杀死进程,在进程的状态会进行讲解。

📂通过系统调用获取进程标识符

进程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;
}

        我们通过父进程来创建子进程,子进程继承父进程的代码和数据,会有自己的PCB。

📂通过系统调用创建进程

        fork函数,fork函数会有两个返回值,父进程一个,子进程一个。这里可以这样理解,进入fork函数后,已经有了两个进程,父进程和子进程,父子进程会进行代码共享,即有两个return。

        父进程会得到子进程的pid,子进程的返回值为0。

#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){ //child
 printf("I am child : %d!, ret: %d\n", getpid(), ret);
 }else{ //father
 printf("I am father : %d!, ret: %d\n", getpid(), ret);
 }
 sleep(1);
 return 0;
}

📂 进程的特点

        1. 竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间具有竞争属性,为了高效完成任务,更合理的竞争相关资源,便具有了优先级。

        2. 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。

        3. 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。

        4. 并发: 多个进程在1个CPU下采用进程切换的方式,在一段时间内,让多个进程得以推进,称之为并发。

📁进程的状态

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

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)
没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

R : 进程运行状态

S:(浅)休眠状态,进程处于等待状态,等待资源就绪,可中断休眠。

D:(深)休眠状态,不可被杀,深度睡眠,不可中断睡眠。

  1. 等待进程自己醒来。

  2. 断电重启。

T:暂停状态

        kill -19 pid 改为暂停状态,即将进程暂停。

        kill -18 pid  继续运行进程。

t : 调试暂停,debug调试,遇到断点就暂停。

📂 kill 信号

        kill 向指定进程发送信号。kill -l 查看信号

📂 僵尸进程 

        z状态,即进程已经运行完毕,但需要维持自己的退出信息,在自己的task_struct记录自己的退出信息,未来让父进程读取,如果父进程没有读取,僵尸进程会一直存在。

        僵尸进程不可以被杀死。如果僵尸进程一直没有被父进程读取,就会造成内存泄漏。

        x状态就就是,读取了z,由os释放进程。

📂 孤儿进程

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

        孤儿进程可以被杀死。

📂 运行状态

        R运行状态:并不意味着程序一定在运行中,表明程序要么在运行中,要么在运行队列中。

        分时操作系统,即每个进程都有一个时间片,在规定时间片内执行进程,如果进程没有执行完毕,则会再次进入运行队列等待。

📂 阻塞状态

        S休眠状态:意味着进程正在等待事件完成。

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

📂 挂起状态

        内存资源不足,且进程处于阻塞状态时,进程就会被唤出到swap分区中。过多的挂起,会导致效率问题

📁进程的切换

        基于时间片等原因,进程可能会切换到其他状态,那么CPU是如何知道进程执行到哪了呢,接着上一次执行继续执行呢?

        CPU的寄存器会保存着进程的临时数据。CPU内部所有寄存器中的临时数据,就叫做进程的上下文。

📁进程的优先级

📂 概念

        本质是指定一个进程获得某种资源的先后顺序,在task_struct中是一个数字int,优先级数字越小,优先级越高。

        为什么要有优先级呢?因为进程访问的资源是有限的。

📂 原则

        分时操作系统,基于时间片调度轮转,要保证基本的公平。如果进程因为长时间不被调度,就会造成饥饿问题。

📂 查看方式

ps -l

UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的 nice

📂 PRI 和 NI

        PRI就是进程的优先级,其值越小,进程的优先级就越高。

        NI就是nice值,即进程可被执行的优先级的修证数据。

        进程优先级 = PRI + NI。

        nice值的取值范围是[-20 , 19] 一共40个级别。

        RPI优先级默认是从801开始的,取值是[60 , 99]。

📂 调整方式

        用top命令更改已存在的进程的nice

● top

● 输入“r” -> 输入PID -> 输入nice值

📁 进程的地址空间 (虚拟地址)

        我们在C/C++语言中看到的地址都是虚拟地址。物理地址,用户是看不到的,由os统一管理。os负责将虚拟地址转换为物理地址。

        地址空间本质上是一个结构体,内部是很多属性,表示每个区间的范围。可以简单理解,每个进程都有一个地址空间和页表,页表负责将地址空间上的虚拟地址转为物理地址。

        父进程创建子进程后,子进程的页表与父进程的页表是一样的,即相同的虚拟地址映像到相同的物理地址。但是如果一个进程想要修改,则物理地址就会发生改变,即虚拟地址对应不同的物理地址。这就是写实拷贝

📂 虚拟地址的好处

1. 将无序变为有序,以统一的视角看待物理内存以及运行各个区域。

2. 进程管理模块和内存管理模块进行解耦

3. 有效的拦截非法请求。

📁 Linux2.6 内核进程调度队列

        一个CPU拥有一个requeue(运行队列)。

        普通优先级:100-139 

        实时优先级:0 - 99 (不关心)
 

📂 活动队列

         时间片还没有结束的所有进程都会按照优先级放在该队列。

nr_active: 总共有多少个运行状态的进程
queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照 FIFO 规则进行排队调度 , 所以,数组下标就是优先级!
从该结构中,选择一个最合适的进程,过程是怎么的呢?
1. 0 下表开始遍历 queue[140]
2. 找到第一个非空队列,该队列必定为优先级最高的队列
3. 拿到选中队列的第一个进程,开始运行,调度完成!
4. 遍历 queue[140] 时间复杂度是常数!但还是太低效了!
bitmap[5]: 一共 140 个优先级,一共 140 个进程队列,为了提高查找非空队列的效率,就可以用 5*32
比特位表示队列是否为空,这样,便可以大大提高查找效率

        上图,我们展示活动队列,过期队列也是同理。

📂  过期队列

        过期队列和活动队列一模一样,过期队列上放置的集成,都是时间片耗尽,但是还没有结束的进程。当活动队列上的进程都处理完毕后,对过期队列进程时间片重计算。

📂active指针和expired指针

        active指针永远指向活动队列。

        expired指针永远指向过期队列。

        可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。

        没关系,在合适的时候,只要能够交换active 指针和 expired 指针的内容,就相当于有具有了一批新的活动进程!

📁总结

        以上,就是本期【Linux杂货铺】进程基本概念的所有内容了,讲解了什么事进程,进程的状态有哪些,包括僵尸进程,孤儿进程,讲解了进程的优先级,也粗略的讲解了进程的地址空间,也就是平常说的虚拟地址,以及Linux中临时拷贝是什么,在Linux中是如何调度进程的。

        如果感觉本期内容对你有帮助,欢迎点赞,收藏,关注Thanks♪(・ω・)ノ

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

万界星空科技商业开源MES,技术支持+项目合作

商业开源的一套超有价值的JAVA制造执行MES系统源码 亲测 带本地部署搭建教程 教你如何在本地运行运行起来。 开发环境&#xff1a;jdk11tomcatmysql8springbootmaven 可以免费使用&#xff0c;需要源码价格便宜&#xff0c;私信我获取。 一、系统概述&#xff1a; MES制造执…

机器学习(26)回顾gan+文献阅读

文章目录 摘要Abstract一、李宏毅机器学习——GAN1. Introduce1.1 Network as Generator1.2 Why distribution 2. Generative Adversarial Network2.1 Unconditional generation2.2 Basic idea of GAN 二、文献阅读1. 题目2. abstract3. 网络架构3.1 Theoretical Results 4. 文…

学习数据结构和算法的第16天

单链表的实现 链表的基本结构 #pragma once #include<stdio.h> #include<stlib.h> typedf int SLTDataType; typedy struct SListNode {SLTDataType data;struct SListNode*next; }SLTNode;void Slisprint(SLTNode*phead); void SListPushBack(SLTNode**pphead,S…

使用 VS Code + Github 搭建个人博客

搭建个人博客的方案 现在&#xff0c;搭建个人博客的方式有很多&#xff0c;门槛也很低。 可以选择已有平台&#xff1a; 掘金语雀知乎简书博客园SegmentFault… 也可以选择一些主流的博客框架&#xff0c;自行搭建。 HexoGitBookVuePressdumi… 如何选择&#xff1f; 我…

每日五道java面试题之mybatis篇(三)

目录&#xff1a; 第一题. MyBatis的框架架构设计是怎么样的?第二题. 为什么需要预编译?第三题. Mybatis都有哪些Executor执行器&#xff1f;它们之间的区别是什么&#xff1f;第四题. Mybatis中如何指定使用哪一种Executor执行器&#xff1f;第五题. Mybatis是否支持延迟加载…

如何学习一个大型分布式Java项目

前言 很多同学在没有实习经验的时候看到一个多模块分布式项目总是有一种老虎吃天的无力感&#xff0c;就像我刚毕业去到公司接触项目的时候一样&#xff0c;模块多的夸张&#xff0c;想学都不知道从哪开始学&#xff0c;那么我们拿到一份代码后如何从头开始学习一个新项目呢。…

挑战杯 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— Button按钮组件

概述 Button为按钮组件&#xff0c;通常用于响应用户的点击操作。 参数 Button组件有两种使用方式&#xff0c;分别是不包含子组件和包含子组件&#xff0c;两种方式下&#xff0c;Button 组件所需的参数有所不同&#xff0c;下面分别介绍 不包含子组件 不包含子组件时&…

解决 Nginx 1.24 版本下载视频慢和文件问题的方法

解决 Nginx 1.24 版本下载视频慢和文件问题的方法 如果你最近在腾讯云服务器上遇到了下载视频慢以及视频文件无法正常使用的问题&#xff0c;可能需要检查一下你的 Nginx 版本。下面是一个真实案例的分析和解决方案&#xff0c;希望能帮助你避免或解决类似问题。 背景 一个运…

使用gitee自动备份文件

需求 舍友磁盘前两天gg了&#xff0c;里面的论文没有本地备份&#xff0c;最后费劲巴拉的在坚果云上找到了很早前的版本。我说可以上传到github&#xff0c;建一个私人仓库就行了&#xff0c;安全性应该有保证&#xff0c;毕竟不是啥学术大亨&#xff0c;不会有人偷你论文。但是…

从JVM的退出机制分析Java程序的优雅关闭退出

前言 Java程序启动从main函数开始启动&#xff0c;是程序入口和主线程&#xff0c;但程序会在什么时候结束&#xff1f;为什么有的Java程序在启动后很快就结束了&#xff0c;比如HelloWorld程序&#xff0c;有的程序却能一直在运行&#xff0c;比如Tomcat启动后就一直保持进程…

AI:149-法律电子邮件图像中的欺诈检测与敲诈勒索追踪—深度学习技术

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

JSONP漏洞详解

目录 同源策略 JSONP简介 JSONP劫持漏洞 漏洞原理 漏洞利用过程 利用工具 JSONP漏洞挖掘思路 JSONP防御 首先&#xff0c;要了解一下什么是同源策略&#xff1f; 同源策略 同源策略&#xff08;SOP&#xff09;是浏览器的一个安全基石&#xff0c;浏览器为了保证数据…

AI系统性学习01- Prompt Engineering

文章目录 面向开发者的Prompt Engineering一、简介二、Prompt设计原则1 环境配置2.两个基本原则2.1 原则1&#xff1a;编写清晰、具体的指令2.1.1 策略一&#xff1a;分割2.1.2 策略2&#xff1a;结构化输出2.1.3 策略3&#xff1a;模型检测2.1.4 策略4&#xff1a;提供示例 2.…

[数据集][目标检测]焊接件表面缺陷检测数据集VOC+YOLO格式2292张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2292 标注数量(xml文件个数)&#xff1a;2292 标注数量(txt文件个数)&#xff1a;2292 标注…

【GPT-SOVITS-03】SOVITS 模块-生成模型解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

【PyTorch】进阶学习:一文详细介绍 torch.load() 的应用场景、实战代码示例

【PyTorch】进阶学习&#xff1a;一文详细介绍 torch.load() 的应用场景、实战代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

栈和队列(Java实现)

栈和队列&#xff08;Java实现&#xff09; 栈 栈(Stack)&#xff1a;栈是先进后出&#xff08;FILO, First In Last Out&#xff09;的数据结构。Java中实现栈有以下两种方式&#xff1a; stack类LinkedList实现&#xff08;继承了Deque接口&#xff09; &#xff08;1&am…

Python基础算法解析:支持向量机(SVM)

支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归分析的机器学习算法&#xff0c;它通过在特征空间中找到一个最优的超平面来进行分类。本文将详细介绍支持向量机的原理、实现步骤以及如何使用Python进行编程实践。 什么是支持向…

【Java刷题篇】串联所有单词的子串

这里写目录标题 &#x1f4c3;1.题目&#x1f4dc;2.分析题目&#x1f4dc;3.算法原理&#x1f9e0;4.思路叙述✍1.进窗口✍2.判断有效个数✍3.维护窗口✍4.出窗口 &#x1f4a5;5.完整代码 &#x1f4c3;1.题目 力扣链接: 串联所有单词的子串 &#x1f4dc;2.分析题目 阅…