【lesson9】进程

news2024/10/5 14:21:38

文章目录

  • 什么是进程
  • 如何管理进程
  • 查看进程
  • 创建子进程

什么是进程

在这里插入图片描述
我们用一张Windows下的任务管理器图来辅助我们观看,我们一个可以看到应用在运行的时候就是一个个进程
所以我们启动了一个软件本质上就是启动了一个进程
在Linux下运行一条命令,./XXX运行的时候其实就是在系统层面创建了一个进程!!!
我们知道代码会生成可执行程序,而可执行程序是不能被OS(操作系统调度的),只有在可执行程序被运行变成进程的时候才会被调度,因为OS(操作系统)只能对进程进行调度

如何管理进程

我们知道Windows下存在大量的exe文件,类比到Linux所以Linux下肯定存在大量的exe文件。所以我们可以理解Linux是可以同时加载多个程序的,Linux是同时存在大量的进程在系统的内存中的。
单个可执行程序被加载到内存,并且被CPU调度过程:
在这里插入图片描述
多个可执行程序被加载到内存变成进程:
那么Linux系统要不要管理这些进程呢?
答案:肯定是要的。

在这里插入图片描述
当多个可执行程序被加载到内存变成进程,CPU该如何调度呢?所以Linux操作系统必须对这些进程进行管理。
那么Linux系统是如何管理大量进程的呢?
答案:先描述,再组织

我们先定义一个对象来描述单个进程的核心信息比如进程被调度的时间、进程的优先级、进程的上下文数据等等。然后再用数据结构对这些进程进行管理。
描述进程的对象叫做进程PCB结构体。PCB包含了所有进程属性。
如何理解对象或者类呢?
人们认识世界是通过“属性”来认识世界的。
比如:有一种动物它是人类的朋友,高兴的时候会摇尾巴,遇到陌生人会汪汪叫。我们立马会想到这是狗。
再比如:有一种动物体型很大,额头上会写一个王字,是食肉动物。我们会立马想到这是老虎。

那么属性是数据吗?
答案:是的,属性也是数据。
属性和程序内的代码和数据有关系吗?
答案:没有关系,它们是两套概念没有任何联系。

那么Linux是用什么数据结构管理这些进程PCB的呢?
在这里插入图片描述
我们可以看到Linux用链表的结构来管理这些进程PCB。
这样我们对进程的管理,变成了对进程PCB结构体链表的增删查改。

从这里我们可以知道 进程 = 对应代码和数据 + 进程对应的PCB结构体

PCB是什么?
例子:假如要表明你是清华的学生,是你人在清华就表明你就是清华的学生吗?这样清华的保安,社管阿姨,食堂阿姨等等这些人也是清华的学生。
在这里插入图片描述
可想而知要表明自己试清华的学生不仅仅是如此,还必须各种信息被录入到清华的教务管理系统中。
在这里插入图片描述
那么清华校长如果要开除某个学生仅仅是让学生离开清华而已吗?
不仅仅是如此,还必须在教务系统中删除这个学生的信息。

在这里插入图片描述
上面的清华的这一套管理体系就是PCB的管理体系。

那么进程PCB具体保存哪些数据呢?
如图所示:
在这里插入图片描述

查看进程

前面我们说了这么多那么我们该如何在Linux操作系统中查看进程呢?
首先我们写一个死循环程序,这样进程就可以一直存在便于我们查看。
在这里插入图片描述
生成可执行程序,然后运行可执行程序变成进程。
在这里插入图片描述
创建一个新的会话然后在新的会话中查看进程。
在这里插入图片描述
我们看到用查看进程的命令确实看到了进程,如果我们把进程Ctrl c掉还会存在进程吗?
在这里插入图片描述
在这里插入图片描述
我们可以看到进程确实消失了。而图里的进程我们可以理解为,grep也是一个进程所以当我们查看的时候,grep进程也会存在。
在这里插入图片描述
我们还有一种查看进程的方法。
Linux下有一个专门保存进程的proc文件。
在这里插入图片描述
我们可以看到确实查到了该进程。
我们查看该进程文件内部。
在这里插入图片描述
我们会看到关于进程的各种信息
其中的cwd而cwd就是当前进程工作目录。也就是可执行程序当前存在的位置。
在这里插入图片描述
每一个进程都会保存自己的工作路径。
proc下的目录时动态的当进程被删除时Linux会自动删除保存进程的目录。
在这里插入图片描述
我们如何用代码获取进程的pid呢?
Linux操作系统给我们提供了一个接口,getpid()可以帮助我们获取当前进程pid。
在这里插入图片描述
其中pid_t是一个整形。
在这里插入图片描述
在这里插入图片描述
我们可以看到确实获得了进程的pid,那么该pid是这个进程的吗?我们用kill发送9号信号来杀掉进程,看进程会被会被kill。
在这里插入图片描述
我们可以看到,用该进程pid发送kill信号确实把该进程杀掉了。
我们之前查看进程的时候应该看到了ppid那么ppid是什么呢?
ppid是该进程的父进程ID,那么我们如何获取呢?
Linux也给我们提供了getppid()接口,可以获得父进程ID。
在这里插入图片描述
在这里插入图片描述
那么看到了父进程那么该父进程是谁呢?
在这里插入图片描述
我们可以看到父进程就是bash我们之前在shell的运行原理中也学过bash这里就不过多介绍。
这里的bash也是可以被kill掉的,这里就不过多演示,大家有兴趣可以自己试验。

创建子进程

我们学习了进程,也学了父进程那么我们该如何自己创建一个进程呢?
Linux也给我们提供了接口fork()。
在这里插入图片描述
在这里插入图片描述
我们可以从英文中知道返回值:
在这里插入图片描述
具体如何使用fork,下次博客在介绍。

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

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

相关文章

探究Vcenter虚拟化方案中,VirtualMachine庞大结构体中各字段的含义

SDK中mo.VirtualMachine结构体定义如下: type VirtualMachine struct { ManagedEntity Capability types.VirtualMachineCapability mo:"capability" Config *types.VirtualMachineConfigInfo mo:"config" Layout …

十二、流程控制-循环

流程控制-循环 1.while循环语句★2.do...while语句★3.for循环语句 —————————————————————————————————————————————————— 1.while循环语句★ while语句也称条件判断语句,它的循环方式是利用一个条件来控制是否…

Spring实例化源码解析之ConfigurationClassPostProcessor(二)

ConfigurationClassPostProcessor源码 解析 书接上回,在第一次调用invokeBeanDefinitionRegistryPostProcessors方法的时候参数currentRegistryProcessors为ConfigurationClassPostProcessor,本章主要深入这个类的postProcessBeanDefinitionRegistry方法…

linux部署页面内容

/bin:该目录包含了常用的二进制可执行文件,如ls、cp、mv、rm等等。 /boot:该目录包含了启动Linux系统所需的文件,如内核文件和引导加载程序。 /dev:该目录包含了所有设备文件,如硬盘、光驱、鼠标、键盘等等…

LeetCode 刷题记录——从零开始记录自己一些不会的(二)

20. 替换后的最长重复字符 题意 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后,返回包含相同字母的最长子字符串的长度。 思路 代码 class Solution…

学习MLPERF

测试基准与标准 | BenchCouncil 其中涉及AI的有如下: AI (1) AIBench Training AIBench 培训采用平衡的 AI 基准测试方法,考虑全面性、代表性、可负担性和可移植性。该方法广泛调查人工智能任务和模型,并在最大程度上涵盖了算法级、系统级…

玩转YAML配置文件占位符 ,同事纷纷直呼大佬

配置文件占位符 Spring Boot配置文件支持占位符,一些用法如下: 为server.port设置一个随机端口 server: port: ${random.int} 其他随机占位符 // 随机数占位符${random.value} - 类似uuid的随机数,没有"-"连接${random.int} - 随…

【李沐深度学习笔记】矩阵计算(5)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记,可能会对李沐老师上课没讲到的进行补充。 本节是第五篇,由于CSDN限制,只能被迫拆分 矩阵计算 多元函数的等高线 此处参考视频:熟肉)多元…

c语言-实用调试技巧

什么是bug? 程序中出现的问题 调试是什么?有多重要? 测试的基本步骤:发现程序错误的存在 以隔离、消除等方式对错误进行定位,确定错误产生的原因,提出纠正错误的解决办法,对程序错误予以改正…

【Servlet】第一个 Servlet 项目

第一个 Servlet 项目 一. Servlet 是什么二. Servlet 主要做的工作三. 第一个 Servlet 程序1. 创建项目2. 引入依赖3. 创建目录4. 编写代码5. 打包程序6. 部署程序7. 验证程序 四. 更方便的部署方式1. 安装 Smart Tomcat 插件2. 配置 Smart Tomcat 插件 一. Servlet 是什么 Se…

2023华为杯数学建模研赛思路分享——最全版本E题技术文档深度解析已出

2023华为杯数学建模研赛E题最新完整版技术文档已出 更多内容加群了解咨询【云顶数模科研交流群】: 正在跳转​qm.qq.com/cgi-bin/qm/qr?_wv1027&kzZ9YYiFSIhMwasovgcr-Fq6wp_ZF2-To&authKeyIDnk4VjKwk4FWcwTKW1ye8qfCOZjKbx%2FeLQVSFeD%2BrrUNJnhWAYwC%2…

OceanBase再获OSCAR两项大奖,坚定开源开放

2023 年 9 月 21 日,由中国信息通信研究院(简称“中国信通院”)、中国通信标准化协会联合主办的“OSCAR 开源产业大会”在京召开。本次发布了 2023 年可信开源评估结果,OceanBase 通过 可信开源 社区评估,荣获 “OSCAR…

【打开新世界大门】看测试老鸟如何把API 测试玩弄在鼓掌之间

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 一、API 测试的基本步骤 我介绍过当今互联网产品的测试策略往往会采用菱形结构,即重量级 AP…

蜣螂优化(DBO)算法的5种最新变体(含MATLAB代码)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

spark Structured报错解决

报错,不想看原因的直接去解决方案试试 Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/Administrator/AppData/Local/Temp/1/temporary-611514af-8dc5-4b20-9237-e5f2d21fdf88/metadata from hdfs://master:8020/C…

C/C++连接数据库,包含完整代码。

C/C连接数据库 本篇文章意在简洁明了的在linux环境下使用C/C连接远程数据库,并对数据库进行增删查改等操作。我所使用的环境是centos7,不要环境除环境配置外,代码是大同小异的。完整代码在最底部!!! 1.前…

[极客大挑战 2019]RCE ME 取反绕过正则匹配 绕过disable_function设置

目录 取反 1.蚁剑插件绕过 2.baypass disable_function open_dir/disable_function putenv()/LD_PRELOAD 来绕过限制 利用条件 利用思路 有意思。。。。 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("Th…

redis的安装、基础命令及常用数据结构

文章目录 前言一、Redis安装1.Ubuntu下安装&#xff08;1&#xff09;切换到root用户下&#xff08;2&#xff09;使用apt安装redis5&#xff08;3&#xff09;为了使redis支持远程连接&#xff0c;修改以下地方&#xff08;4&#xff09;验证安装是否成功 2.Centos7下安装&…

【C++】STL简介 | string类的常用接口

目录 STL简介 学string类前的铺垫 概念 为什么要学string类 string类的底层&#xff08;了解&#xff09; 编码表的故事 string类的常用接口与应用 3个必掌握的构造 赋值 访问字符operator[] 初识迭代器&#xff08;iterator&#xff09; 反向迭代器 用范围for遍历…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码&#xff0c;可以获取当前日期和星期几&#xff0c;并输出在一周内的每天早上和晚上&#xff1a; // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…