Linux入门学习:进程概念

news2024/11/16 15:34:59

文章目录

    • 1. 什么是进程?
      • 1.1 基本概念
      • 1.2 task_struct
    • 2. 组织进程
    • 3. 查看进程
      • 3.1 父进程与子进程
      • 3.2 fork创建子进程
      • 3.3 kill
      • 3.4 /proc

1. 什么是进程?

1.1 基本概念

在课本的概念中,进程程序的一个执行实例,正在执行的程序。其内核观点:担当分配系统资源(CPU时间,内存)的实体。但这些概念太笼统,并不能让我们更加清晰的知道进程是什么,实际上,进程是内核数据结构(pcb) + 程序的代码与数据。

pcb(process control block)进程控制块,进程信息被放在一个叫pcb的数据结构中,可以理解为进程属性的集合。在Linux入门学习:深刻理解计算机硬件与OS体系中,我们已经了解到操作系统对我们的硬件进行管理的基本思想----先描述,后组织,pcb就是操作系统用于描述进程的数据结构。

Linux操作系统下的PCB是: task_struct,也就是说Linux描述进程的结构体叫做task_struct,task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

1.2 task_struct

在Linux系统中,task_struct一般包含以下信息:

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

2. 组织进程

Linux描述完进程task_struct,在内存中,他是怎么将他们组织起来的?答案:是以链表的形式组织起来的!

进程与进程之间:
在这里插入图片描述
在内存中,程序文件一般在磁盘,我们要运行时,先在内存中拷贝一份exe文件,再进程管理的指针中,插入新的task_struct,这个新的task_struct会有成员管理内存中加载的exe,并加载这个exe对应的属性到进程之中。

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

在这里插入图片描述

由此,我们可以知道一个事实:我们在Windows双击一个exe文件,把他运行起来,实质上,就是在系统中创建了一个新的进程!在Linux中的,像ls , pwd指令,本质上也是运行了一个exe,创建了一个进程,只不过运行完就直接退出了,而在Windows上的很多软件是常驻进程,一般运行了之后就不会再退出了,没有"运行完"的说法,除非用户直接×掉,直接终止运行。

3. 查看进程

3.1 父进程与子进程

pid – 进程id
ppid – 父进程id

先要明白一个概念:在Linux操作系统中,创建新进程的时候,都是由自己的父进程创建的!!在C语言中,我们可以通过函数getpid与getppid,来查看当前启动的C语言程序的pid与ppid

我们先来观察一个现象:在Linux中写下这样的一段代码

#include <stdio.h>
#include <unistd.h>

int main()
{
	while(1)
	{
		printf("我是一个进程, 我的pid: %d, ppid, %d\n", getpid(), getppid());
	}
        
        return 0;
}

反复运行后:
在这里插入图片描述

我们发现反复运行后,每次的pid都不一样,但是他们的ppid,每次都是一样的!!为什么?

#查看对应进程的相关信息指令
ps axj | head -1 && ps ajx | grep 进程id

在这里插入图片描述

结论:这些进程的父进程都叫bash!!bash:命令行解释器。在命令行中,我们运行我们自己的可执行程序或者命令行指令本质是bash进程创建的子进程,由子进程 执行我们的代码! !

我们在登录的时候操作系统会自动为我们启动一个bash程序,bash前面有一个-,代表着我们是通过命令行终端进行登录的

3.2 fork创建子进程

在C语言中有一个函数fork,可以借用系统调用,来创建子进程,头文件是<unistd.h>,借此,我们在Linux写一个程序,来先看看现象:

#include <stdio.h>
#include <unistd.h>

int main()
{

    printf("父进程运行: pid: %d, ppid:%d\n", getpid(), getppid());
	
    pid_t id = fork();
    if (id == 0)
    {
        // 子进程
        while (1)
        {
            printf("我是子进程,我的pid: %d, ppid: %d,ret = %d\n", getpid(), getppid(),id);
            sleep(1);
        }
    }
    else
    {
        // 父进程
        while (1)
        {
            printf("我是父进程,我的pid: %d, ppid: %d,ret = %d\n", getpid(), getppid(),id);
            sleep(1);
        }
    }


    return 0;
}

运行之后
在这里插入图片描述

我们可以观察到一个奇怪的现象:为什么if和else的条件同时被满足了?!!竟然同时进行了两个循环?!!毫无疑问的,肯定是程序启动了两个进程,这其中的细节会衍生出很多问题:

Q1:代码中fork返回值是什么?

在这里插入图片描述

 pid_t id = fork();

如果fork成功创建进程,对于父进程的返回值为子进程的pid,子进程的返回值的0。如果创建失败,父进程的返回值为-1。由返回值的不同,满足if或else的不同条件,启动对应的循环。

——》父进程往往只有一个,而子进程往往有多个,给父进程返回子进程的id,是为了方便管理子进程。Linux进程的整体是一个树型结构!!



❓Q2:一个函数(fork)为什么能返回两次?两次的数据还不相同?!

我们的程序在fork之后,毫无疑问,会启动两个程序,这两个程序的关系是父子关系,一般而言,这两个程序的代码是共享的!但是数据是自己保有一份的!!
在这里插入图片描述

——》进程与进程之间是相互独立的! 多个进程之间,运行的时候,即使他们是父子,也不会相互影响,即使其中一个挂了,另一个也能正常运行。对于代码而言,任何进程对代码的权限只是可读的,所以不同的进程使用同一份代码就能得到安全型的保证。但是数据一定是独立的,对于父子进程,fork各自返回了一次,他们得到了各自的数据,各自对自己的数据进行处理,从而启动了不同的循环。

数据是独立的还有一个验证:

	int cnt = 0;
    if (id == 0)
    {
        // 子进程
        while (1)
        {
            printf("我是子进程,我的pid: %d, ppid: %d,cnt = %d\n,", getpid(), getppid(),cnt);
            sleep(1);
            cnt++;
        }
    }
    else
    {
        // 父进程
        while (1)
        {
            printf("我是父进程,我的pid: %d, ppid: %d,cnt = %d\n", getpid(), getppid(),cnt);
            sleep(1);
        }
    }

在这里插入图片描述

——》观察现象,父进程与子进程的cnt值各不相同。

3.3 kill

对于没有结束的进程,可以用kill指令将其杀掉

 kill -9 进程标示符

在这里插入图片描述

3.4 /proc

/proc目录里面存储文件不在磁盘上,里面的文件都是内存级的,在关机时会消失,开机时又会出现,它是对动态运行的所有进程的一个可视化信息
在这里插入图片描述
蓝色表示的是目录文件,因为一个进程里面可能会存在很多信息,进去看看
在这里插入图片描述
1、其中exe说明当前的进程是可以找到自己要执行的代码的(可视化出来了)。

2、cwd表示的是当前进程的工作目录(current work dir),所以为什么你fopen出来的新文件会被默认放在当前目录,这其实是由该进程的cwd决定的!!

本文就到这里,感谢你看到这里❤️❤️! 我知道一些人看文章喜欢静静看,不评论🤔,但是他会点赞😍,这样的人,帅气低调有内涵😎,美丽大方很优雅😊,明人不说暗话,要你手上的一个点赞😘!

希望你能从我的文章学到一点点的东西❤️❤️

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

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

相关文章

『功能项目』3D模型动态UI显示【76】

本章项目成果展示 我们打开上一篇75主角属性值显示的项目&#xff0c; 本章要做的事情是将3D模型动态显示在主角属性展示界面 首先创建RawImage 调整尺寸 创建文件夹&#xff1a;RenderTexture 创建 Render Texture 创建Camera 在场景中放置一个主角预制体删除所有组件 清空标…

LVGL第一篇-了解lvgl显示原理以及使用C++移植

一、引言 在当今嵌入式系统与图形界面开发的广阔领域中&#xff0c;轻量级图形库 LVGL&#xff08;Light and Versatile Graphics Library&#xff09;恰似一颗璀璨耀眼的明星&#xff0c;正日益受到开发者们的热烈推崇与追逐。它以小巧精致之姿、高效卓越之能以及丰富多元之功…

计算机毕业设计之:宠物互助平台的微信小程序系统(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

读构建可扩展分布式系统:方法与实践14流处理系统

1. 流处理系统 1.1. 时间就是金钱 1.1.1. 从数据中提取有价值的知识和获得洞见的速度越快&#xff0c;就能越快地响应系统所观察的世界的变化 1.1.2. 信用卡欺诈检测 1.1.3. 网络安全中异常网络流量的捕获 1.1.4. 在支持GPS的驾驶应用程序中进行的实时路线规划 1.1.5. 社交…

函数计算 FC:首发 GPU 极速模式,更弹性、更降本

函数计算 FC 作为轻量灵活、事件驱动的全托管计算服务&#xff0c;一直以来以弹得更快、粒度更细、成本更低为广大开发者与企业客户所青睐。 2024 云栖大会上&#xff0c;函数计算 FC 为 AI 加码&#xff0c;首发 GPU 极速模式&#xff0c; 让 GPU 可以更弹性、更便宜。 阿里云…

【车联网安全】车端知识调研

一、CAN总线&#xff1a; 1、定义&#xff1a; CAN 总线相当于汽车的神经网络&#xff0c;连接车内各控制系统,其通信采用广播机制&#xff0c;各连接部件均可收发控制消息&#xff0c;通信效率高&#xff0c;可确保通信实时性。当前市场上的汽车至少拥有一个CAN网络&#xff0…

Java集合(下)

Map&#xff08;重要&#xff09; HashMap和Hashtable的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMap …

也遇到过 PIL Image “image file is truncated“的问题

背景前言 属于活久见系列&#xff0c;最近工作上遇了该问题&#xff01; 背景&#xff1a;前端 APP使用 Android CameraX 的接口&#xff0c;拍摄并上传图片&#xff0c;然后 Python后端服务对图片裁剪与压缩处理。后端服务处理图片时有遇到image file is truncated的情况。还…

Spring AOP实现原理-动态代理

目录 代理的基础概念 示例1&#xff1a;静态代理&#xff08;场景&#xff1a;客户通过中介租房东的房子&#xff09; 示例2&#xff1a;JDK动态代理实现房东、中介出租房屋 示例3&#xff1a;CGLib动态代理实现房东出租房屋 示例4&#xff1a;观察Spring IOC容器中代理对象…

One-Class Classification: A Survey

I. INTRODUCTION 1.定义 OCC 是一种特殊的多类分类&#xff0c;训练数据仅来自单个正类。目标是学习表示和/或分类器&#xff0c;以便在推理过程中识别正类查询。 2.应用 异常图像检测、异常事件检测、生物识别&#xff08;活体检测、反诈骗&#xff09; 3.与其他领域的比…

Python连接Kafka收发数据等操作

目录 一、Kafka 二、发送端&#xff08;生产者&#xff09; 三、接收端&#xff08;消费者&#xff09; 四、其他操作 一、Kafka Apache Kafka 是一个开源流处理平台&#xff0c;由 LinkedIn 开发&#xff0c;并于 2011 年成为 Apache 软件基金会的一部分。Kafka 广泛用于构…

在Java中,关于final、static关键字与方法的重写和继承【易错点】

在Java中&#xff0c;关于final、static关键字与方法的重写和继承【易错点】 1.final方法不能被重写2.static方法不是重写&#xff0c;而是遮蔽3.final与static的组合4.final与继承5.static与继承 1.final方法不能被重写 如果父类中的方法被声明为final&#xff0c;那么这个方法…

开源音频处理项目推荐【持续更新】

Audacity 介绍&#xff1a;Audacity是一款功能强大的开源音频编辑软件&#xff0c;适用于多种操作系统&#xff0c;包括Windows、macOS和Linux。它支持多轨音频编辑、录制&#xff0c;并且提供了丰富的音频处理功能&#xff0c;如剪切、复制、粘贴、混音、降噪等 。Audacity的…

基于Python+flask+MySQL+HTML的全国范围水质分析预测系统,可视化用echarts,预测算法随机森林

1绪论 近年来&#xff0c;水质监测系统的进步显著&#xff0c;这在全球环保意识不断提升的背景下尤为明显。大量资源被投入到水质监测技术的研发和应用中&#xff0c;以不断优化监测效能。水资源的保护及健康环境的维护&#xff0c;这种趋势旨在提升人们生活质量&#xff0c;确…

微软宣称其新工具可纠正人工智能幻觉 但专家依然对此表示怀疑

人工智能经常胡言乱语&#xff0c;微软现在说它有办法解决这个问题&#xff0c;但我们有理由对此持怀疑态度。微软今天发布了一项名为"更正"&#xff08;Correction&#xff09;的服务&#xff0c;它可以自动修改人工智能生成的与事实不符的文本。Correction 首先会标…

华为认证HCIA篇--网络通信基础

大家好呀&#xff01;我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分&#xff0c;偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过&#xff0c;如果是新手或小白的话建议还是看一看&#xff0c;先有个印象&#xff0c;好为后续的…

8.隐私与安全 - 使用ChatGPT时的注意事项【8/10】

引言 在数字时代&#xff0c;隐私和安全已成为全球关注的焦点。随着技术的发展&#xff0c;个人信息和数据的收集、存储、处理和传输变得越来越普遍&#xff0c;这既带来了便利&#xff0c;也带来了风险。保护个人隐私和数据安全不仅是法律的要求&#xff0c;也是维护公众信任…

solidwork中查看装配体螺丝或零件

假设我的PETG打印件到了&#xff0c;想知道这个螺丝的型号&#xff0c;怎么办 解决办法&#xff1a; 第一步先看看有没有固定的字样 如果固定的话是不行的。需要这样做&#xff1a; 把这里给关了 接下来第二步&#xff0c;点击你想查看的螺丝 然后就会跳到零件图 可以看到直径…

Cloudflare为网站添加AI审计 可检查AI爬虫何时抓取和抓取频次以及直接屏蔽爬虫

网络服务提供商 Cloudflare 宣布即日起为所有网站 (包括免费托管的网站) 带来 AI 审计功能&#xff0c;该功能目前处于测试阶段&#xff0c;可以分析 AI 公司的爬虫和抓爬数据。新的 AI 审计工具 (Cloudflare AI Audit) 主要提供 AI 公司的爬虫何时到网站来抓取数据、抓取的数据…

Unity 热更新(HybridCLR+Addressable)-资源更新

七、资源更新 创建一个叫Aot的文件夹&#xff0c;用来存放不会热更新的资源 这个修改为第三个 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b8be5e6465184ad5ad6173c6870bfa06.png 这个是更新 在更新或者打包时遇到端口被占的报错&#xff0c;不用理会&#xf…