网站源码换模板/百度客服工作内容

网站源码换模板,百度客服工作内容,织梦培训机构网站模板,网站建设多少钱裤目录 前言 什么是进程 如何管理进程 描述进程 组织进程 如何查看进程 通过 ps 命令查看进程 通过 ls / proc 命令查看进程 通过系统调用 获取进程标示符 前言 在学习了【Linux系统编程】中的 ​ 操作系统 和 冯诺依曼体系结构 之后,我们已经对系统应该有…

目录

前言

什么是进程

如何管理进程

描述进程

组织进程

如何查看进程

通过 ps 命令查看进程 

通过 ls / proc 命令查看进程

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


前言

在学习了【Linux系统编程】中的 ​ 操作系统   冯·诺依曼体系结构  之后,我们已经对系统应该有了不错的了解,接下里我们将继续深入的了解操作系统最重要的的功能之一:进程

什么是进程

首先我们来看一个问题:

操作系统能不能一次运行多个程序呢?

答案是当然可以的!!因为运行的程序有很多,所以 OS 需要将这些运行的程序管理起来。
我们将这些正在运行的程序称之为进程。(注意:是正在运行的程序叫进程,而不是程序本身)

【课本概念】:程序的一个执行实例,正在执行的程序等

【内核观点】:担当分配系统资源(CPU时间,内存)的实体

对于课本中的观点大家可能会觉得难以理解,为何正在执行的程序就是一个进程呢。我们可以在Windows下按[Ctrl + shift + ESC]打开任务管理器查看一下:

这也就表明了在一个操作系统中不仅只能运行一个进程,还可以运行多个进程 

但是呢,进程不仅仅可以像上面这样去理解。我们来思考一个问题

程序是文件吗?

相信读者肯定很清楚,文件是存放在磁盘中的,磁盘呢则是属于外设。这一块我们在 冯·诺依曼体系结构 有讲得很清楚,对于CPU来说,它是只会和内存打交到的,所以磁盘中的数据需要先加载到内存中才可以被执行

那么,当可执行文件被加载到内存中时,该程序就成为了一个【进程】

总结:进程 = 程序(代码 + 数据) + 内核申请的与该进程对应的数据结构(PCB)

如何管理进程

你说正在运行的程序叫做进程,那进程可以同时进行吗?

  • 我们可以发现当你在听网易云的时候你也可以登录微信聊天,也可以刷抖音 所以进程是可以同时进行的。是因为操作系统把这些进程给管理起来了。也就是先描述再组织
  • 操作系统会创建一个描述和控制该进程的结构体。这个结构体称之为进程控制块(PCB,Processing Control Block),里面包含了该进程几乎所有的属性信息,同时通过进程控制块也可以找到该进程的代码和数据。
  • 在 Linux 中,进程控制块就是 struct task_struct 结构体。
  • 描述好所有进程了,还需要将所有进程的 PCB 给组织起来(通过双链表的方式),此时操作系统只需要拿到双链表的头指针,就可以找到所有进程的 PCB。
  • OS 把对进程的管理就转换成了,对数据结构中 PCB 的管理,即对双链表的增删查改操作。

假设这里有一个可执行程序 test它存储在磁盘上就是一个普通文件,当我们 ./test 运行此程序,操作系统会做以下事情:将该程序从磁盘加载到内存中,并为该程序创建对应的进程,申请进程控制块(PCB)。 

描述进程

先思考:人是如何辨别事物或者对象的??

比如你在放学路上见到一个女生一见钟情,于是你记住了他的样貌,开始像别人打听这个女生,因为你不认识这个女生,所以你会对他进行描述,比如说长得很漂亮、水灵的眼睛、瓜子脸……当你提供的特征越来越多的时候,认识她的人或许就能通过你的描述找到这个女生。而这个过程中,这个女生的各种特征其实就是他的属性,所以我们可以得出一个结论:人是通过属性去辨别事物和对象的,当属性足够多的时候,这一堆属性的集合,就是目标对象!!

所以我们推断出任何一个进程加载到内存时,OS需要创建一个描述进程的结构体对象——PCB(process ctrl block进程控制块) ,而他的本质就是对进程属性集合的描述!

  • 课本中的叫法是:PCB(Process Control Block)
  • Linux操作系统下的PCB是:task_struct

这个结构体呢就是组织了各种各样的属性,才可以去很好地描述一个进程

task_struct的内容:

标示符: 描述本进程的唯一标示符,用来区别其他进程。(有点类似学校里每个学生的学号,是一个唯一标识,方便我们通过标示符来管理进程)

状态: 任务状态,退出代码,退出信号等。(OS中同时存在多个进程,所以可能有的进程正在运行、有的正在休眠、有的在正在待定、有的即将销毁……也就是说每个进程当前可能都处于某一种状态)

优先级: 相对于其他进程的优先级。(OS中有多个进程,所以先执行谁肯定是要有一个标准的,所以进程之间可能存在对应的优先级关系)

程序计数器: 程序中即将被执行的下一条指令的地址。(以前我们在学习函数栈帧的时候,我们知道代码是从上往下运行的,但是这个过程中可能会遇到出现某个函数需要我们进行跳转,这个时候当前的栈帧会暂时保存着,然后当跳转过去的相关代码执行结束后再返回之前栈帧的位置继续运行。但是由于OS中不仅仅只有一个进程,所有有可能这个进程在执行的时候可能会被一些切换给中断,转而去执行别的进程,然后该进程可能会进入休眠模式,而后期我们可能还会去唤醒这个进程,这个时候由于之间的栈帧被销毁了,所以已经不记得执行到哪句代码了,因此程序计数器存在的意义就是帮助没我们记住即将被执行的下一条指令的地址!举个更好理解的例子就是,比方说你正在数一堆书,当你数到50的时候,这个时候突然一个电话告诉你外卖到了,为了不让外卖员等太久,你需要暂停当前的工作马上下去,但是你又怕你数过的数字忘记了,所以你就把他记在本子上,当你取完外卖后,你就可以通过从本子上的数字继续往下数!)

内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针(我们一个可执行程序要运行还需要有对应的数据和代码,所以PCB对象必然需要有一个指针指向这块空间,当进程响应的时候能够及时找到,另一方面可能会存在多种数据类型的指针,为了满足不同场景下的需求——通过数据结构和算法)

上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

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

记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。(可能会包含进程的一些运行时间,其实对进程的调度来说是有作用的,因为在多个进程的情况下,只有一个CPU,所以先将哪个进程放到CPU里其实是由调度器决定的,而调度器除了考虑进程状态和一些优先级之外,他会尽可能秉持着公平的原则,比如说有尽可能地优先让执行时间短的进程优先去调度。)

其他信息

转换为代码形式的话就可以是下面这样

struct PCB{进程的编号进程的状态进程的优先级...相关的指针信息
};

既然知道了如何去描述一个PCB结构体,我们就要来知道操作系统对一个进程总共会做哪些事情

  • 为该进程创建对应的PCB对象
  • 将该进程的代码和数据加载到内存中

所以,很多教科书在介绍进程的时候只会说它在计算机内部是一个PCB对象,其实对于一个进程来说:应该是由操作系统为其创建出来的 PCB对象 + 其数据代码 组成的

组织进程

我们知道 进程=内核PCB数据结构对象+你自己的代码和数据。

  • 但是OS本质上是对PCB做管理,他并不关心你的代码和数据因为他只要能找到PCB,就可以通过他里面的一个相关的指针去找到对应的代码和数据,然后再交给CPU去运行!!
  • 举个例子就比如HR对人才的管理本质上就是对简历进行管理,然后安排面试的时候再通过简历来找到你的相关信息。

但是PCB特别多,所以我们需要想办法管理起来。

其实在我们的Linux中task_struct主要是以双链表的形式组织起来。

  

 你可能会疑惑,使用一个顺序表来存储不是更好吗??其实在OS内部对于进程的管理方式并没有像我们以前学的数据结构那么纯粹,他的场景会更加复杂,也就是说该进程可能会需要根据不同的需求被存储在队列中、双链表中、二叉树中、栈中……

所以将进程按照节点的方式链接起来其实会更方便我们将这个进程放在不同的数据结构中,然后我们可以通过对应的指针信息来讲他们更好地管理起来。

举个例子,比如说我在当前进程中有一个队列指针。因为在OS中可能会有一些存储进程指针的运行队列和等待队列,如果你想让这个进程去哪个队列,你就可以通过修改队列指针的链接队形做到,从而实现更加灵活的管理。 

所以对进程管理工作取决于你把他放入哪个正在被组织的数据结构中,因为不同的数据结构有不同的特点,所以背后对应的就是不同的算法,而不同的算法对应的就是不同的应用场景。

如何查看进程

现在我们明白了操作系统如何去描述并组织进程,接下去我们就切身地来看一看进程长什么样吧

下面呢是我们要进行测试的代码:

#include <stdio.h>2 #include <stdlib.h>3 #include <unistd.h>4 #include <sys/types.h>5 int main()6 {7   // 死循环8   while(1)9   {10     pid_t id = getpid();11     //pid_t fid = getppid();12     //printf("I am a process! pid : %d, ppid : %d\n",id,fid);13     printf("I am a process! pid : %d\n",id);//程序停留一秒在输出                                                                     14     sleep(1);15   }16 17   return 0;18  }

通过 ps 命令查看进程 

  

查看当前我们正在运行的进程

  

此时我们来查看以下当前运行程序的进程

ps ajx | head -1 && ps ajx | grep mytest
  •  ps ajx —— 查看当前系统中所有进程
  • head -1 —— 获取第一行
  • grep mytest —— 过滤只带【mytest】的进程 

  

那有同学可能会问:为什么在过滤进程的时候会有 grep --color=auto mytest 这个东西呢?

grep在进行过滤的时候自己也要变成一个进程,也可以看到他们使用grep命令的时候也带【mytest】关键字的,所以在过滤的时候把自己也过滤出来了。

这也侧面证明了所有指令在运行的时候都是进程

但如果我们不想看到这个也是有办法的,那就是在 grep 命令后面加个-v grep把其过滤掉即可

ps ajx | head -1 && ps ajx | grep mytest | grep -v grep

通过 ls / proc 命令查看进程

我们都清楚根目录下有很多的路径

注意上面的proc目录,它是一个内存文件系统,里面放的是当前系统实时的进程信息。我们进入此目录看看:

但是呢,上面这些呢是全部的进程,若我们只是想要查看某个进程的话就要根据其PID值去进行对应的查找。这个PID呢就是我们在上面在介绍task_struct这个Linux下的PCB结构体的时候所讲到的【标识符】这个东西,它是 描述本进程的唯一标示符,用来区别其他进程

但是这么看不够清晰,我们以列表的形式来进行查看。这里我们主要关注两个:一个是cwd目录,另一个则是exe

首先我们来看到的是这个【exe】,很明显它是一个可执行文件,那就是我们在当前目录下的mytest这个可执行文件
接下去的话就是这个【cwd】了,其意思为current work directory当前进程的工作目录

接下来,我们来详细说一这个  cwd

看以下的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(){printf("我的PID:%d\n",getpid()); FILE* fp = fopen("log.txt","w");                                                                                                                                if(fp==NULL){return 1;}fclose(fp);printf("新建文件完成\n");sleep(50);return 0;}

在当前的 proc.c 程序中,创建一个log.txt 的文件,创建好后,大家觉得这个文件会出现在哪里呢? 我们运行以下看看

我们发现在 proc.c  程序中创建的 log.txt  文件出现在当前目录下,这是为什么呢?

我们来根据程序中的进程标识符来检查一个这个进程

此时我们发现进程中的存有cwd---当前工作目录,所以导致在此程序中创建的任何文件,在没有指定放在哪里的时候,常见的文件会默认放在进程指定的cwd----当前工作目录下

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

上面我们有讲到了这个PID进程标示符,是通过ps这个命令来查看的,那我们能否直接获取这个PID呢?

  • 在上面我们使用ps ajx查看到了当前进程所对应的 PID,但是呢这相当于是遍历操作,如果我没有加grep mytest的话出来的进程数就会很多了
  • 那现在我们所要做到的就是对一个单独的进程去获取其 PID,此时我们能想到的就是通过库函数来实现。在之前的文章中我们又说到过对于操作系统而言它是不会相信任何人的,所以会提供给用户一些系统调用(库函数),那我们只需要通过这个系统调用即可获取到当前进程的 PID 值

  • 那首先呢,我们先要去查询一下这个getpid()怎么使用,那还是使用到我们的老朋友man
man 2 getpid

 进去之后看到,有两个库函数,那如果要使用这两个库函数的话就需要引入对应的头文件

下面我给出一段命令,它可以实时监控当前系统的进程

while :;do ps ajx | head -1 && ps ajx | grep mytest | grep -v grep; echo "------------------------------------------------------------"; sleep 1; done; 
  • 然后就让我们来观察一下其是否真的可以获取到当前进程的PID,首先运行上面的这段指令,我们看到了当前系统中并不存在有关mytest的进程,但是呢在我们把mytest这个可执行程序运行起来的时候,右侧就突然就多出了一条进程的相关信息
  • 后一核对相关的PID值就发现确实是当前运行起来的这个进程

  • 但是呢当我在将当前这个进程给结束之后再去把它起起来的时候,就发现当前这个进程的PID值发生了变化

 其实的话,这个现象是很正常的每次重新启动进程其 PID 值是会出现不同的情况

举个很简单的例子来说吧,小王在高考结束完后上了一所不是很理想的大学🏫,在开学前两天时学习为其分配了对应的学号。但是呢小王却并不满意自己所待的这个学校,所以就退了学继续参加高考,在又一次的高考结束后他还是被原来的这所学校给录取。但是呢我们可以知道,即使你进了一个学校两次,但是学号却不一定是一样的

这也就是为什么一个进程在启动两次后会出现不同PID值的原因

 刚才我们在通过【man】手册查看getpid()这个函数的时候,还看到了getppid()这个函数,它是获取当前进程的父进程的 PID

  • 这个PPID呢就在PID的左边

下面是改进的测试代码

printf("I am a process, my id is: %d, parent is: %d\n", getpid(), getppid());
  • 马上来看一下是否真的可以获取到

  • 接下去我们再来观察一下现象:通过3次结束子进程,我们观察到了子进程确实每次都会发生变化,但是呢对于父进程而言却不会发生任何的变化,这是为什么呢?

  • 我们可以先去查看一下这个父进程到底是什么鬼…(((m -__-)m
ps ajx | head -1 && ps ajx | grep 18866

原因解析:
每次在登录XShell的时候,系统会为我们单独再创建一个Bash进程,即命令行解释的进程,帮我们在显示器中打印出对话框终端

[XAS@iZf8z3lh8un7rc5rk1ney3Z lesson13]$  -----  【父进程----ppid】

我们在命令行中输入的所有指令都是Bash进程的子进程Bash进程只负责命令行的解释,具体执行出问题的时候只会影响它的子进程

ls /proc/18866	-- 子进程【PID】

上面这样解释可能还是比较抽象,一样来举个例子

  • 还记得,我们在讲解shell运行原理的时候曾经说到过王婆是一位资本家,她为了不损坏自己的名声呢,在别人找她说媒的时候会派遣一些实习生去,即使实习生出了问题她的名誉也不会受到影响

 这就可以对照到父进程与多个子进程,可以有多个子进程在这个父进程上面运行,即使某一个子进程突然出问题终止了,还有其他子进程在运行,此时父进程也是有保障的,所以子进程每次都会发生变化,但是父进程永远都不会变化

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

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

相关文章

股指期货贴水波动,影响哪些投资策略?

先来说说“贴水”。简单来说&#xff0c;贴水就是股指期货的价格比现货价格低。比如&#xff0c;沪深300指数现在是4000点&#xff0c;但股指期货合约的价格只有3950点&#xff0c;这就叫贴水。贴水的大小会影响很多投资策略的收益&#xff0c;接下来我们就来看看具体的影响。 …

在刀刃上发力:如何精准把握计划关键节点

关键路径分析是项目管理中的一种重要方法&#xff0c;它通过在甘特图中识别出项目中最长、最关键的路径&#xff0c;来确定项目的最短完成时间。 关键路径上的任务都是项目成功的关键因素&#xff0c;任何延误都可能导致整个项目的延期。关键路径分析对于项目管理者来说至关重要…

浔川社团官方联合会维权成功

在2025.3.2日&#xff0c;我社团检测文章侵权中&#xff0c;检测出3篇文章疑似遭侵权&#xff0c;随后&#xff0c;总社团联合会立即联系CSDN版权&#xff0c;经过17天的维权&#xff0c;至今日晚&#xff0c;我社团维权成功&#xff01;侵权文章全部被设置为转载。 在此&…

介绍一个测试boostrap表格插件的好网站!

最近在开发一个物业管理系统。用到bootstrap的表格插件bootstrap table&#xff0c;官方地址&#xff1a; https://bootstrap-table.com/ 因为是英文界面&#xff0c;对国人不是很友好。后来发现了小书童网站 IT小书童 - 为程序员提供优质教程和文档 网站&#xff1a; IT小…

钉钉机器人

准备 参考官方文档 已经完成成为钉钉开发者流程。已经完成创建应用流程。已经完成添加应用能力流程 企业内部需要企业管理员开通权限&#xff0c;我自己创建了一个组织&#xff0c;用自己的组织创建机器人就方便很多&#xff0c;很多权限无需单独去申请了。 创建机器人 进…

Androidstudio实现引导页文字动画

文章目录 1. 功能需求2. 代码实现过程1. 编写布局文件2. 实现引导页GuideActivity 3. 总结4. 效果演示5. 关于作者其它项目视频教程介绍 1. 功能需求 1、引导页具有两行文字&#xff08;“疫情在前”和“共克时艰”&#xff09;&#xff0c;和向上的 图标。 2、进入【引导页】…

在线生成自定义二维码

在线生成自定义二维码 1. 引言 二维码已成为现代互联网的重要工具&#xff0c;广泛应用于链接分享、支付、身份认证等场景。然而&#xff0c;很多在线二维码生成工具功能有限&#xff0c;难以满足个性化需求。如果你需要 自定义颜色、Logo、不同形状的二维码&#xff0c;那么…

蓝桥杯 之 第27场月赛总结

文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题&#xff0c;是一个二维dp的问题&#xff0c;转化为对应的动态规划求解 力扣的相似题目 可以关注灵神…

C 语 言 --- 扫 雷 游 戏(初 阶 版)

C 语 言 --- 扫 雷 游 戏 初 阶 版 代 码 全 貌 与 功 能 介 绍扫雷游戏的功能说明游 戏 效 果 展 示游 戏 代 码 详 解game.htest.cgame.c 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &#x1f4a1;个 人 主…

车载以太网网络测试-21【传输层-DOIP协议-4】

目录 1 摘要2 DoIP entity status request/response&#xff08;0x4001、0x4002&#xff09;2.1 使用场景2.2 报文结构2.2.1 0x4001&#xff1a;DoIP entity status request2.2.2 0x4002&#xff1a;DoIP entity status response 3 Diagnostic power mode information request/…

CH347使用笔记:CH347结合STM32CubeIDE实现单片机下载与调试

目录 基于 STM32CubeIDE的 CH347 JTAG/SWD调试器使用说明1. CH347驱动安装与配置2. STM32CubeIDE调试器配置2.1 打开相关工程后&#xff0c;进行以下操作2.2 openocd.exe替换2.3 脚本添加2.4 更改调试器选择 3. 下载程序4. 使用过程中可能遇到的问题4.1 CH347未插入4.2 Openocd…

LVGL常用功能备忘

概述 本文选用LVGL 8.3版本 8.3版本实测帧率比起9版本高,多个GUI工具支持 相关链接 LVGL官网 https://lvgl.io/ LVGL 文档 https://docs.lvgl.io/8.3/ LVGL仓库 https://github.com/lvgl LVGL移植 获取源码 https://github.com/lvgl/lvgl/tree/release/v8.3 下载文件即可 文件…

k8s搭建kube-prometheus

后续再补一个k8s集群搭建的博客&#xff0c;从0开始搭建k8s集群。使用kube-prometheus非常方便&#xff0c;主要问题只在于拉取镜像。除了拉取镜像外其他时间5分钟即可。耐心等待拉取镜像。 一.kube-prometheus简介 kube-prometheus 是一个专为 Kubernetes 设计的开源监控解决…

vue3:十一、主页面布局(优化页面跳转方式)

:router"true" 一、参考文章 vue3:十一、主页面布局(实现基本左侧菜单右侧内容效果)-CSDN博客 参考上述文章可知&#xff0c;页面跳转是通过在js中定义的菜单中携带的path&#xff0c;然后通过菜单的点击事件完成的跳转&#xff0c;现在可以进行优化&#xff0c;直…

Etcd 服务搭建

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…

EmbodiedSAM:在线实时3D实例分割,利用视觉基础模型实现高效场景理解

2025-02-12&#xff0c;由清华大学和南洋理工大学的研究团队开发 一种名为 EmbodiedSAM&#xff08;ESAM&#xff09;的在线3D实例分割框架。该框架利用2D视觉基础模型辅助实时3D场景理解&#xff0c;解决了高质量3D数据稀缺的难题&#xff0c;为机器人导航、操作等任务提供了高…

信创-人大金仓数据库创建

一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址&#xff1a;https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 ‌ 实例结构 ‌&#xff1a;由数据库文件和 KingbaseES 实例组成。数据…

HCIA-AI人工智能笔记3:数据预处理

统讲解数据预处理的核心技术体系&#xff0c;通过Python/Pandas与华为MindSpore双视角代码演示&#xff0c;结合特征工程优化实验&#xff0c;深入解析数据清洗、标准化、增强等关键环节。 一、数据预处理技术全景图 graph TD A[原始数据] --> B{数据清洗} B --> B1[缺…

G-Star 校园开发者计划·黑科大|开源第一课之 Git 入门

万事开源先修 Git。Git 是当下主流的分布式版本控制工具&#xff0c;在软件开发、文档管理等方面用处极大。它能自动记录文件改动&#xff0c;简化合并流程&#xff0c;还特别适合多人协作开发。学会 Git&#xff0c;就相当于掌握了一把通往开源世界的钥匙&#xff0c;以后参与…

WEB攻防-PHP反序列化-字符串逃逸

目录 前置知识 字符串逃逸-减少 字符串逃逸-增多 前置知识 1.PHP 在反序列化时&#xff0c;语法是以 ; 作为字段的分隔&#xff0c;以 } 作为结尾&#xff0c;在结束符}之后的任何内容不会影响反序列化的后的结果 class people{ public $namelili; public $age20; } var_du…