初识Linux · 进程(2)

news2024/9/25 3:23:26

目录

前言:

有关进程的相关理解


前言:

本文会开始慢慢切入进程了,当然,切入进程之前,我们需要再次复习一下操作系统,后面接着是介绍什么是进程,如何查看进程,在Linux中对应的文件是哪个等相关的问题,进程大概会持续更新多节,所以说进程的知识点还是相当杂乱的,就更需要同学们予以注意了。


有关进程的相关理解

首先,我们需要知道,为什么需要操作系统?

操作系统的工作是执行软硬件资源的管理,如何管理硬件上文提及的是通过驱动程序,使得硬件的相关数据组织成为一个链表,操作系统可以直接对链表的信息进行修改,驱动程序再对硬件实施管理,这是先描述再组织,从而实现了管理硬件,那么这是操作系统的一个手段,也就是管理硬件的一个手段而已,它本质上还是要为用户提供良好的,稳定的,高效的,安全的服务,所以需要对相关的资源使用相应的手段进行管理。这是操作系统的目的和手段。

由上文的操作系统的结构图我们可以知道,操作系统里面有进程管理以及各种管理,那么操作系统管理进程的时候,肯定是允许多进程存在的,比如:

这些,都是进程,想看你的电脑里面存在哪些进程,你只需要esc + shift + ctrl打开任务管理器即可,所以现在可以证明,进程是可以存在多个的

那么,什么是进程呢?

这里提问,如果将某个工程的数据和代码加载到内存里面,代码是否会跑起来呢?当然是不会的,因为cpu并没有从里面读取数据,当代码跑起来的时候,就存在了一个进程,难道进程是对应的,已经跑起来的程序吗?当然不是,这是不废话,进程 = PCB + 自己的代码和数据

那么什么是PCB呢?这就有意思了,类比硬件,操作系统管理硬件的时候,需要硬件的信息,从而构建一个链表,再对链表的相关信息增删查改,从而实现管理硬件,那么必然存在一个结构体吧?因为只有结构体可以用来存储多个不同的数据类型。

从而,推理出PCB是对应数据集合的结构体,那么PCB的全称是:process control block 。也就是进程控制块,这就有意思了,进程控制块?不就是结构体吗,那为什么取个进程控制块呢?就是因为操作系统可以直接对PCB进行修改删除等操作,达到对进程控制的效果。

得出结论:进程 = PCB + 自己的代码和数据

那么为什么要有PCB的概念呢?

因为:先描述再组织

所以可以在内存块里面,多个进程之间以链表的形式进行连接,每个PCB里面都有下一个PCB的指针,那么操作系统可就轻松了,原本那么多不着头脑的进程,这下可以直接通过管理链表来实现管理进程了。

那么具体的PCB的名字是什么呢?是task_struct

叫做task是因为外国人认为这是个任务嘛,所以就取名为task了。

进程都是动态运行的,我们如何理解动态运行这个概念呢?

是这样的,在内存块里面,OS占有一席之地,在里面实现对各种软硬件的管理,现在不同的进程进来了,总得有个先后队列吧?

所以存在task_queue的东西,也就是进程队列,不同的进程需要排队的,动态实际上就是多个PCB排队的过程

具体的会放在后面介绍。

现在再来谈谈task_struct的内部属性

首先认识一个点,我们不管是运行指令也好,运行自己编写的代码也好,本质上都是直接创建一个进程,不过指令是一瞬间就运行完成的,我们看不到相关的东西而已,那么什么进程那么多,我们如何区分不同的进程呢?像学校那样,我们每个人都有自己独一无二的学号,进程是同理的,存在一个东西叫做pid,即process id,进程的id,类比学生的学号即可。

说了那么多,我们应该如何看到pid呢?

在此之前,我们应该回想上篇文章介绍的系统调用接口:

我们知道系统调用是操作系统给我们的函数,我们目前从未调用过它,现在,就是调用我们人生中第一个系统调用接口的时候了,我们使用man手册查询可知:

从手册的说明书我们就知道2号接口是系统库函数调用,也就是我们即将学习的getpid:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <unistd.h>
  4 
  5 int main()
  6 {
  7   printf("I am a process\nMy pid is %d\n",getpid());                                                                                                                                                          
  8   return 0;
  9 }

有意思的还有getpid()函数居然需要两个头文件一起才能使用。

欸,打印结果也是正常,打印的进程id每次都是不一样的,我们的初步目的已经达成了,但是进程肯定是不止就这么点东西的,所以我们应该输入ps -xaj 来看,这里先记着,xaj的顺序无所谓:

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <unistd.h>
  4 
  5 int main()
  6 {
  7   while(1)
  8   {
  9   printf("I am a process\nMy pid is %d\n",getpid());
 10   sleep(1);
 11   }                                                                                                
 12   return 0;
 13 }

首先改一下代码,死循环方便我们观察:

我们使用管道来筛选出包含test的进程,前两个我们是可以理解的,但是为什么grep也有呢?因为ps -xaj打开了进程,通过管道筛选,筛选也是一个进程,那么我们想要不看它,就可以:

grep -v grep反向筛选出不含grep的即可:

当然了,直接ps -xaj就相当于windows里面的任务管理器,查看所有进程。

我们可以看到,打印出来的pid是14191,在打印出来的head -1中也有pid,也是14191,所以pid打印出来是没问题的。

现在我们再来查看,ppid是个什么东西?ppid全程就是parent process id,也就是父进程的id,有人就有问题了,父进程?这个东西还带有继承的?我们是可以在一个进程中创建多个进程的,用到的函数是fork():

这里有个很有意思很有意思的点,会颠覆你的编程三观的,即这个返回值pid_t,类型本质上是unsigned int,这里就先留个伏笔。

我们先来看一段有意思的代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{ 
    printf("I am a father process!\n");
    fork();
    printf("I am a child process\n");
    return 0;
}

试问这段代码的运行结果是什么?

直接看结果:

可以发现打印了两遍第二次的printf,我们可以这样理解,我是一个公司老板,我在没有招员工之前一直再做相同的事,找了员工之后,员工和我做相同的事,但是我之前做的所以工作员工还需要做吗?不需要,所以第一行的printf是不会执行的,父进程原本的代码就是要执行printf的,所以会打印两次child process。

  7   while(1)
  8   {
  9     printf("This is parent process:%d\nThis is child process:%d\n",getppid(),getpid());
 10     sleep(1);                                                                                      
 11   }

打印出来,对应的父进程的id是22252,子进程id是22239,在ppid 和 pid 下面也得到了验证。

更多的请看后面!!!


感谢阅读!

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

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

相关文章

你真的了解电阻吗

电阻通常有下面几种表示符号。 我们用的最多的还是定值电阻。 ESP32参考设计原理图用的是折线。 GD32中参考设计原理图用的是小方框。 包括我们画原理图的时候用的基本也是小方框。 折线符号属于ANSI&#xff08;美国标准&#xff09;矩形符号属于DIN标准&#xff08;德国工业…

Linux基本

一、安装 &#xff08;一&#xff09;bios basic input / output system cpu虚拟化技术需要开启 intel amd 不同品牌进入bios快捷键不一样 &#xff08;二&#xff09;vmware 新建 配置硬件 硬盘 建议单个虚拟硬盘文件&#xff0c;比较好管理 r如果有转移的需求&#xff…

freertos 任务调度—抢占式, 时间片

FreeRTOS 操作系统支持三种调度方式&#xff1a; 抢占式调度&#xff0c;时间片调度和合作式调度。 实际应用主要是抢占式调度和时间片调度&#xff0c;合作式调度用到的很少. 1,抢占式调度 每个任务都有不同的优先级&#xff0c; 任务会一直运行直到被高优先级任务抢占或者遇到…

使用 ShuffleNet 模型在 CIFAR-100 数据集上的图像分类

简介 在深度学习领域&#xff0c;图像分类任务是衡量算法性能的重要基准。本文将介绍我们如何使用一种高效的卷积神经网络架构——ShuffleNet&#xff0c;来处理 CIFAR-100 数据集上的图像分类问题。 CIFAR-100 数据集简介 CIFAR-100 数据集是一个广泛使用的图像分类数据集&…

使用了@Bean启动成功还能注入失败?秒级解决 定位分析

文章目录 Bean 断点跟不进去为什么需要多个同类型bean怎么友好处理同类型bean【任选一种】彩蛋 Bean 断点跟不进去 结论&#xff1a;你的其他代码 或者底层依赖&#xff0c;一定有改类型的自动注入代码&#xff0c;在Spring 机制中&#xff0c;默认拒绝Bean重写&#xff0c;你…

2024年一区SCI-极光优化算法 Polar Lights Optimization-附Matlab免费代码

引言 本期介绍了一种名为极光优化算法 Polar Lights Optimization (PLO)的元启发式算法。极光是一种独特的自然奇观&#xff0c;当来自太阳风的高能粒子在地磁场和地球大气层的影响下汇聚在地球两极时&#xff0c;就会发生极光。该成果于2024年8月最新发表在国际顶级JCR 1区、…

python画图|3D直方图基础教程

前述已经完成了直方图和3D图的基本学习&#xff0c;链接如下&#xff1a; 直方图&#xff1a;python画图|水平直方图绘制-CSDN博客 3D图&#xff1a;python画图|水平直方图绘制-CSDN博客 现在我们尝试把二者结合&#xff0c;画3D直方图。 【1】官网教程 首先&#xff0c;依…

微信开放标签【wx-open-launch-weapp】使用方法,亲测好用

如果你按照微信开放标签的文档来集成&#xff0c;那么恭喜你&#xff0c;绝对&#xff08;99%&#xff09;报错&#xff0c;今天在这里给大家演示一下在vue3中正确使用wx-open-launch-weapp的方法。 第一步&#xff1a; 配置wx.config&#xff0c;这个就不过多介绍了&#xff…

上海宝钢阿赛洛引领“绿能革命”:二期屋顶光伏项目赋能“双碳”目标新篇章

在“双碳”战略的宏伟蓝图下&#xff0c;一场能源革命的浪潮正席卷而来&#xff0c;分布式光伏以其独特的魅力成为这场变革中的璀璨明星。上海宝钢阿赛洛激光拼焊有限公司积极响应国家号召&#xff0c;携手上海宝钢节能环保技术有限公司&#xff0c;于近日宣布其屋顶光伏发电项…

SpringSecurity原理解析(五):HttpSecurity 类处理流程

1、SpringSecurity 在spring boot中与SSM项目中基于配置文件的区别 通过前边的笔记我们可以知道&#xff0c;在传统的SSM项目中 SpringSecurity的使用是基于配置文件 的&#xff0c;然后spring 容器初始化的时候将 SpringSecurity 中的各种标签解析成对应的Bean对象&#xff0c…

Cortex-M3架构学习:

异常类型 Cortex-M3 在内核水平上搭载了一个异常响应系统&#xff0c;支持为数众多的系统异常和外部中断。其 中&#xff0c;编号为 1 &#xff0d; 15 的对应系统异常&#xff0c;大于等于 16 的则全是外部中断。 Cortex-M3支持的中断源数目为 240 个&#xff0c;做成芯片后…

TensorFlow深度学习框架改进K-means、SOM自组织映射聚类算法及上海招生政策影响分析研究|附代码数据

全文链接&#xff1a;https://tecdat.cn/?p37652 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Chen Zhang 在教育政策研究领域&#xff0c;准确评估政策对不同区域和学生群体的影响至关重要。2021 年上海市出台的《上海市初中学业水平考试实施办法》对招生…

PDF转Excel小达人养成记

在现代职场&#xff0c;数据管理与格式转换可谓是日常任务的重头戏&#xff1b;有时我们手头有一份PDF文件&#xff0c;但需要将其中的数据整理成Excel表格&#xff0c;这该如何是好&#xff1f;别急&#xff0c;今天我就来给大家介绍几款好用的PDF转Excel工具&#xff0c;以及…

使用您自己的图像微调 FLUX.1 LORA 并使用 Azure 机器学习进行部署

目录 介绍 了解 Flux.1 模型系列 什么是 Dreambooth&#xff1f; 先决条件 使用 Dreambooth 微调 Flux 的步骤 步骤 1&#xff1a;设置环境 第 2 步&#xff1a;加载库 步骤 3&#xff1a;准备数据集 3.1 通过 AML 数据资产&#xff08;URI 文件夹&#xff09;将图像上传到…

minio集群

1 集群部署 minio集群的搭建并不复杂&#xff0c;别人也有很多的例子&#xff0c;这里只是先把自己的集群搭建记录下来&#xff0c;重点是后面的章节&#xff0c;遇到问题如何解决。 1.1 修改主机名 hostnamectl set-hostname minio1 hostnamectl set-hostname minio2 hostna…

【深度学习】训练过程中一个OOM的问题,太难查了

现象&#xff1a; 各位大佬又遇到过ubuntu的这个问题么&#xff1f; 现象是在训练过程中&#xff0c;ssh 上不去了&#xff0c;能ping通&#xff0c;没死机&#xff0c;但是ubunutu 的pc侧的显示器&#xff0c;鼠标啥都不好用了。只能重启。 问题原因&#xff1a; OOM了95G&a…

【C++】C++11-基础

目录 1、统一的列表初始化 1.1 {}初始化 1.2 std::initializer_list 2、声明 2.1 auto 2.2 decltype 2.3 nullptr 3、范围for 4、智能指针 5、STL中的一些变化 5.1 新容器 5.2 新方法 1、统一的列表初始化 1.1 {}初始化 在C98中&#xff0c;标准允许使用花括号{}…

光伏发电量如何计算?

真实光伏发电情况&#xff0c;需要根据几十种复杂因素&#xff0c;再通过鹧鸪云算法&#xff0c;快速计算出实际发电量情况。 1、自研算法&#xff0c;技术创新引领未来 鹧鸪云光伏发电量自研算法&#xff0c;是研发团队历经8个月&#xff0c;基于深度学习、大数据分析等前沿技…

Aqara澳门体验店开业 品牌实力与市场前景备受瞩目

在全球经济持续波动的背景下&#xff0c;许多品牌选择采取保守策略。然而&#xff0c;Aqara却还能稳步前行&#xff0c;展现出了强劲的发展势头。7月20日&#xff0c;Aqara在澳门市场迈出了重要一步&#xff0c;开设了该地区首家标准4S智能家居体验馆。这一战略性的布局不仅凸显…

跟《经济学人》学英文:2024年09月07日这期 Can IKEA disrupt the furniture business again?

Can IKEA disrupt the furniture business again? It wants to help you sell your Billy bookcase disrupt&#xff1a; 颠覆&#xff0c;彻底改变 这里的 “disrupt” 是指“颠覆”或“彻底改变”某个行业或市场的现有运作方式&#xff0c;通常通过引入创新的做法或技术来…