Linux:进程的概念

基本概念

课本概念:程序的一个可执行实例,正在执行的程序。

内核观点:担当分配系统资源实体。

当操作系统要执行程序时,也就是说操作系统要执行代码,但一个操作系统需要执行多个程序,而CPU只有一块,那么这些需要执行代码的程序要排队依次执行。

 CPU有一个task_struct结构体将代码和关于这代码所处程序的信息存起来,比如进程的状态,优先级等,而这个task_struct被称为PCB

为了让进程依次执行,所以需要将进程进程排队,操作系统中有一个链表,就是运行队列,通过将PCB结构体链入链表中的方式来将进程进行排队,所以本质上是PCB给我们的进程排队,不是进程在排队,当有一个PCB被选中的时候,加载对应的进程。

内容分类

以下是一些task_struct的一些信息

标识符:用来标识进程的唯一标识符,用于区别其它进程

状态:任务状态,退出代码,退出信号等。

优先级:相对其它进程的优先级。

程序计数器:程序中即将被执行的下一条语句的地址

内存指针:包括进程代码和程序相关数据的指针,还有和其它进程共享的内存指针块的指针

上下文数据:程序执行时处理器中寄存器的数据

I/O状态信息:包括显示I/O请求,分配给进程的I/O设备和被文件使用的进程列表

再说内存指针,用于标识代码执行到那个语句在下次执行程序时,可以直接运行。

再说记账信息,其存储这进程共占有多久CPU,这样可以让CPU做出更好的决策防止一个进程过久占据CPU.

组织进程

查看进程

进程的信息可以通过/proc系统文件查看所有进程

也可以通过 ps axj 和ps aux来查看所有进程状态信息

如果我们想要获取某一个进程的信息我们可以使用ps axj | grep 进程名 

这里我们写一个死循环进程,就是一值在运行的进程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{while(1){printf("我是一个进程,我的PID是%d\n",getpid());sleep(1);}
}

我们开始让这个程序运行

 获取进程信息有两种方式

 通过进程名获取信息

  

通过进程PID获取信息 

父子进程 

在Linux中每个进程都有一个父进程,在刚刚ps axj中PPID就是父进程的PID,查看图片process的父进程PID是1123083

函数getppid()可以获取父进程PID,其包含在unistd.h头文件中,返回值类型是pid_t 

写入以下代码

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{pid_t pid = getpid();pid_t ppid = getppid();while(1){printf("ppid = %d,pid = %d\n", ppid, pid);      sleep(1);}
}

 输出结果

此进程的PID是1123908,父进程的PID是1123417 

我们可以用ps axj 来查询以下父进程

这里1123417是bash的进程这里提出一个重要的概念 

一切命令行调用的进程都是在bash的子进程

/proc 

proc的全称是process,翻译过来就是进程的意思,我们可以通过proc来查看所有进程

 蓝色的代表文件目录,可以看到大部分呢数字都是文件,这些文件对应了PID值,我们之前的bash的PID就是1123160,就在这个文件中,我们可以查看一下

里面存放了很多描述性文件,我们就不一 一举例了,我们就那两个来说明

cwd:当前文件下的路径 

我现在的工作路径就是/root/working7/,所有cwd可以显示当前的工作路径 

exe:可执行程序路径 

exe的可执行路径是/usr/bin/中这个很重要我们以后会讲到

fork 

fork可以用来在程序中创建子进程,它的头文件在unistd.h中,直接调用fork就可以创建子进程了

#include <stdio.h>      
#include <unistd.h>      int main()      
{      printf("before: ppid = %d,pid = %d\n", getppid(), getpid());    fork();    printf("after:  ppid = %d,pid = %d\n", getppid(), getpid());    return 0;    
}          

先输出before的pid和ppid,after之后在输出pidppid

运行结果

 我们在输出before时只输出了一个before的信息,而fork之后输出了两个after的信息,说明,我们的进程创建成功了,一共运行了两次语句。

 对于第一条语句就是这个进程执行的

而第二条语句的pid和ppid都和第一条一样,说明这两条语句都由一个进程运行

而第三条语句是新的,所以第三条语句是新建立出来的,是原先进程的子进程

fork之后会创建两个进程

一个是原本的进程

一个是原本进程的子进程 

fork也有返回值

对于父进程,返回子进程的PID

对于子进程返回0

如果创建失败返回-1 

 根据fork的返回值判断父子进程

#include <stdlib.h>    
#include <unistd.h>    
#include <sys/types.h>    int main()    
{    pid_t id = fork();    if(id == 0)    {    printf("child:  ppid = %d,pid = %d\n", getppid(), getpid());    }    else    {    printf("father: ppid = %d,pid = %d\n", getppid(), getpid());    }    return 0;                                                           
}                

输出结果

 我们可以来了解一下子进程和父进程

当使用fork创建子进程的时候,子进程是以父进程为模板来进程创建,会继承父进程的PCB,

子进程会和父进程公用一份代码和数据

当子进程需要修改代码或数据时,操作系统会为子进程创建一份需要修改的代码或数据,将需要修改的代码和数据进行创建,将不需要的代码和数据继续和父进程公用。

如果父子进程一旦有某个数据需要修改,就需要写时拷贝,这样父进程和子进程的代码和数据就互不影响了,如果某个数据和代码从头到尾都没有进行修改,那么这份数据和代码就会一直公用

PCB里面还存在一个内存指针的数据,定义如下

内存指针:包括进程和代码的相关数据指针 ,还有和其它进程共享的内存块指针

 当父进程进行到fork时,便会创建子进程,子进程会继承父进程的PCB和内存指针,此时子进程的内存指针也指向fork,所以子进程会从fork处开始运行

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

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

相关文章

前端基础之《Vue(10)—过滤器》

一、过滤器 1、作用 用于数据处理。 2、全局过滤器 使用Vue.filter(名称, val>{return newVal})定义。 在任何组件中都可以直接使用。 3、局部过滤器 使用选项&#xff0c;filters: {}定义&#xff0c;只能在当前组件中使用。 4、过滤器在Vue 3.0中已经淘汰了 5、过滤器…

平板电脑做欧盟网络安全法案(EU)2022/30

平板电脑做欧盟网络安全法案&#xff08;EU&#xff09;2022/30 平板电脑做EN18031,平板电脑做无障碍法规EU2019/882 欧盟委员会于2022年通过补充授权法案 &#xff08;EU&#xff09; 2022/30&#xff0c;明确要求无线电设备需满足网络安全、隐私保护及反欺诈要求。 新规时间轴…

Unity中打可选择的AssetBundle,以及URP中加载AssetBundle包Shader丢失问题显示洋红色的解决方案

在上一篇打AssetBundle中已经实现了简单的打AB包和加载,《Unity中打包AssetBundle并加载》,本篇笔记是进一步上一篇最后提出的问题,进行优化。 一、打可选择的AssetBundle 每次打包都会把设置了AssetBundle名称和后缀的所有文件都打包,这也是现在网上教学最多的 但是有时…

解决cannot find attribute `serde` in this scope记录

问题描述&#xff1a; 在Rust中使用serde做json序列化&#xff0c;需要对一个字段指定序列化方法&#xff0c;添加serde注解后报错: error: cannot find attribute serde in this scope --> src\models\order_model.rs:38:7 | 38 | #[serde(deserialize_with &qu…

基于whisper和ffmpeg语音转文本小程序

目录 一、环境准备 ✅ 第一步&#xff1a;安装并准备 Conda 环境 ✅ 第二步&#xff1a;创建 Whisper 专用的 Conda 虚拟环境 ✅ 第三步&#xff1a;安装 GPU 加速版 PyTorch&#xff08;适配 RTX 4060&#xff09; ✅ 第四步&#xff1a;安装 Whisper 和 FFMPEG 依赖 ✅…

Linux GPIO驱动开发实战:Poll与异步通知双机制详解

1. 引言 在嵌入式Linux开发中&#xff0c;GPIO按键驱动是最基础也最典型的案例之一。本文将基于一个支持poll和异步通知双机制的GPIO驱动框架&#xff0c;深入剖析以下核心内容&#xff1a; GPIO中断与防抖处理环形缓冲区设计Poll机制实现异步通知(SIGIO)实现应用层交互方式 …

【最新版】西陆健身系统源码全开源+uniapp前端

一.系统介绍 一款基于UniappThinkPHP开发健身系统&#xff0c;支持多城市、多门店&#xff0c;包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型&#xff0c;支持在线排课。私教可以通过上课获得收益&#xff0c;在线申请提现功能&#xff0c;无…

济南国网数字化培训班学习笔记-第二组-6-输电线路现场教学

输电线路现场教学 杆塔组装 角钢塔 角钢-连扳-螺栓 螺栓&#xff08;M&#xff09;&#xff1a; 脚钉-螺栓&#xff08;螺栓头-无扣长-螺纹-螺帽&#xff09;-垫片-螺帽/防盗帽/防松帽M20*45 表示直径20mm&#xff0c;长度45mm螺栓级别由一个类似浮点数表示&#xff0c;如…

抖音的逆向工程获取弹幕(websocket和protobuf解析)

目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…

反射,枚举,lambda表达式

目录 反射枚举的使用Lambda表达式函数式接口语法Lambda表达式语法精简 变量捕获Lambda在集合List中的使用 反射 作用&#xff1a;在Java代码中&#xff0c;让一个对象认识到自己 比如一个类的名字&#xff0c;里面的方法&#xff0c;属性等 让程序运行的过程&#xff0c;某个对…

鸿蒙移动应用开发--渲染控制实验

任务&#xff1a;使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识&#xff0c;实现生效抽奖卡案例。如图1所示&#xff1a; 图1 生肖抽奖卡实例图 图1(a)中有6张生肖卡可以抽奖&#xff0c;每抽中一张&#xff0c;会通过弹层显示出来&#xf…

webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化&#xff08;单独提取css代码&#xff09;7、优化&#xff08;压缩过程&#xff09;8、打包less代码9、打包图片10、搭建开发环境&#xff08;webpack-dev-server&#xf…

Java快速上手之实验4(接口回调)

1&#xff0e;编写接口程序RunTest.java&#xff0c;通过接口回调实现多态性。解释【代码4】和【代码6】的执行结果为何不同&#xff1f; interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("猫急上树.."…

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;的蓬勃发展&#xff0c;其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任务固有的复杂依…

Qwen2.5简要全流程以及QA

1 输入prompt 得到input id input id&#xff1a; [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 进入Transformer层 先通过linear层得到shape不变的 QKV 多头注意力 分割Dimension &#xff0c; kv变成 [B,H,L,head_dim] h是…

爬虫学习——Item封装数据与Item Pipeline处理数据

一、Item封装数据 对于有字段的数据&#xff0c;最好的数据结构维护方法为字典类型(dict)&#xff0c;但是由于字典不便于携带元数据和传递给其他组件使用&#xff0c;故可以使用Item类封装爬取到的数据。 这里涉及两个类&#xff1a;Item基类和Field类 两者的使用关系如下&…

【React】状态管理 Context API \ MobX \ Redux

Context APIMobXRedux React有自己状态管理&#xff0c;周边生态也有很多状态管理 Context API 直接从react中引入并调用即可&#xff0c;context包含两个东西&#xff1a; Provider&#xff1a;提供商&#xff08;翻译&#xff09;&#xff0c;提供数据&#xff1b;属性&…

RK3588上编译opencv 及基于c++实现图像的读入

参考博文&#xff1a; https://blog.csdn.net/qq_47432746/article/details/147203889 一、安装依赖包 sudo apt install build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpe…

MATLAB 训练CNN模型 yolo v4

学生对小车控制提出了更好的要求&#xff0c;能否加入深度学习模型。 考虑到小车用matlab来做&#xff0c;yolo v5及以上版本都需要在pytorch下训练&#xff0c;还是用早期版本来演示。 1 yolov4 调用 参考 trainYOLOv4ObjectDetector (mathworks.com) name "tiny-yo…

Windows下使用 VS Code + g++ 开发 Qt GUI 项目的完整指南

&#x1f680; 使用 VS Code g 开发 Qt GUI 项目的完整指南&#xff08;Windows MSYS2&#xff09; 本指南帮助你在 Windows 下使用 VS Code g CMake Qt6 快速搭建 Qt GUI 项目&#xff0c;适合熟悉 Visual Studio 的开发者向跨平台 VS Code 工具链迁移。 &#x1f6e0;️…