【Linux】进程的初步认识(一)

进程的初步认识

  • 基本概念
    • 描述进程
      • task_struct-PCB的一种
      • task_stuct内容分类
  • 查看进程
  • 通过系统调用获取进程标识符

基本概念

  要了解进程,首先我们要知道两点

  1. 我们可以同时启动多个程序,也就意味着我们可以将多个.exe文件加载到内存
  2. 操作系统如何去管理这些进程?操作系统实际上是不认识这些可执行程序的,它能控制进程实际上是遵循了“先组织,后描述”的设计理念(即先将这些可执行程序的基本属性,如名称、状态、调用接口等定义成一个结构体,然后通过链表或者其他数据结构对其进行管理)
    大致可以将该结构体理解成以下形式
struct xxx
{//状态//优先级//内存指针字段(为了运行这个程序,应该去哪里找对应程序的代码)//标识符//......(包含所有进程几乎所有的属性字段)//struct xxx*next;
};

描述进程

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的结合
  • 一般我们称进程控制块为PCB(process control block),Linux操作系统下的PCB是:task_struct

task_struct-PCB的一种

  • 在Linux中描述进程的结构体就叫做task_struct
  • task_struct是Linux内核的一种数据结构,它会被装载到PAM(内存)里并且包含着进程的信息

  那么什么是进程呢?进程 = 内核pcb对象(内核数据结构) + 可执行程序
  在了解以上知识后,我们就不难理解:假设可执行程序的大小为1M,加载到内存时,实际上操作系统为了在内存中为了管理这个进程,实际开辟的空间是要大于1M,多出来的空间就为结构体对象pcb。
  一个可执行程序加载到内存中还不够,系统还会建立对应的pcb对象,并将这些对象放到一个整个系统层面的链表当中,系统拿到pcb的链表,对进程的管理就变成了对整个pcb链表的管理,未来所有对进程的管理工作就只和进程的PCB有关而与可执行程序无关
  另外,可以将PCB对象放到放入到任何数据结构中,比如:当一个可执行程序需要被CPU进行调用时,操作系统就会将PCB对象放到CPU的运行队列中等待CPU进行调用。所以,我们又可以得出一个结论:进程排队本质上是让PCB对象排队

task_stuct内容分类

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。 I/O状态信息:
  • 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。(比如当执行到C语言的printf函数的时候,操作系统就需要暂时将屏幕的使用权给该程序,当执行完之后不需要用到屏幕,就将屏幕的使用权归还给操作系统)
  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

  这里简单介绍一下程序计数器,CPU中有一个寄存器叫做PC指针或者叫做eip寄存器,这里面存的是当前正在被执行指令的下一行指令的地址,通过对程序计数器的初步了解,我们可以知道以下两点

  1. 编程语言语法中的判断、循环和函数跳转的本质其实就是修改PC指针
  2. PC指针指向哪个进程代码就表示哪个程序正在被调度执行

查看进程

查看进程信息可以使用ps axj指令
在这里插入图片描述
当我们运行一个程序,比如编译好的代码
在这里插入图片描述
然后我们要去查看可执行程序为mybin的进程
在这里插入图片描述
  几乎所有的指令,就是程序,运行起来也要编程进程

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

  在Linux中,普通进程都会有它的父进程

  • 进程id(PID)
  • 父进程(PPID)

  在Linux中获取进程id和父进程id的方式就是getpid和getppid两个函数,为了了解这两个函数,现在man手册中查一下它们的信息
在这里插入图片描述

现在再将之前的代码做一些修改
在这里插入图片描述
发现每次的子进程id都会改变,但是父进程id不变
在这里插入图片描述

通过父进程id找到这个进程,发现这个进程是bash,所以我们在命令行当中启动的程序最终转化成进程都是bash的子进程,而bash就是命令行解释器

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

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

相关文章

Open CASCADE学习|布尔运算后消除内部拓扑

在CAD建模中,布尔运算是一种逻辑运算方法,通过这种方法,可以创建、修改或组合几何对象。布尔运算主要包括并集(UNION)、交集(INTERSECT)和差集(SUBTRACT)三种运算。 并集…

【Java前端技术栈】ES6-ECMAScript6.0

一、ES6基本介绍 1. ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准, 2015 年 6 月发布。 2. ES6 设计目标:达到 JavaScript 语言可以用来编写复杂的大型程序,成为企业级开发语 言 3. ECMAScript 和 JavaScript 的关系&…

Java多线程系列——概述

简介 在计算机编程中,多线程是一种重要的概念,允许程序同时执行多个任务,提高程序的效率和性能。Java作为一门广泛应用于软件开发的编程语言,也提供了丰富的多线程支持。本文将简要介绍Java多线程的基本概念、使用方法以及相关特…

71从零开始学Java之Properties配置类怎么用?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的几篇文章中,壹哥给大家讲解了Java里的List、Set和Map等集合。所以现在我们知道,Map集合作为一个双列集合,有key和value两个值,这两个值共同组成…

数据所在,计算随行:Databend 的 2023 年度总结

2023 年是 Databend 为用户和客户全面交付 Data Cloud 数据云平台的一年,真正实现了「数据所在,计算随行」的理念,即将计算力带至数据之处,致力于为用户交付更澎湃的算力。 Databend 自 2021 年开始研发,「三年之期已…

Redis篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、redis的过期策略以及内存淘汰机制二、Redis 常见性能问题和解决方案?三、为什么Redis的操作是原子性的,怎么保证原子性的?四、Redis事务前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家…

每日OJ题_二叉树dfs①_力扣2331. 计算布尔二叉树的值

目录 力扣2331. 计算布尔二叉树的值 解析代码 力扣2331. 计算布尔二叉树的值 2331. 计算布尔二叉树的值 难度 简单 给你一棵 完整二叉树 的根,这棵树有以下特征: 叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示…

京东电商API接口|Python爬虫实战 | 批量爬取网页信息

爬虫爬取网页有时需要模拟网页行为,比如京东、淘宝详情页面,图片加载随着滚动自动加载的。这种情况我们就要进行浏览器模拟操作才能获取要爬取的数据。 Selenium 是一个用于自动化浏览器操作的开源框架,主要用于网页测试,支持多种…

C++ STL:deque使用及源码剖析

Deque是一种双向开口的连续线性空间。能在头尾两端分别做元素的插入和删除,而且是在常数的时间内完成。虽然Vector也可以在首端进行元素的插入和删除(利用insert和erase),但效率差(涉及到整个数组的移动)&a…

JS进阶——JS闭包

JavaScript 闭包 (w3school.com.cn) JavaScript中的闭包(Closure)是一个非常重要的概念,它涉及到函数作用域和变量引用的深入理解。 闭包的形成主要依赖于两个特性:函数嵌套和函数内部的变量引用。当一个内部函数引用了其外部函…

【Day44】代码随想录之动态规划完全背包_518. 零钱兑换 II_377. 组合总和 Ⅳ

文章目录 动态规划理论基础动规五部曲:出现结果不正确: 518. 零钱兑换 II377. 组合总和 Ⅳ 动态规划理论基础 动规五部曲: 确定dp数组 下标及dp[i] 的含义。递推公式:比如斐波那契数列 dp[i] dp[i-1] dp[i-2]。初始化dp数组。…

代码随想录 Leetcode56. 合并区间

题目&#xff1a; 代码(首刷自解 2024年2月18日&#xff09;&#xff1a; 这题与气球扎针&#xff0c;删除重复的大体逻辑相似。需要额外定义些变量来存储头尾 class Solution { private:const static bool cmp(vector<int>& a, vector<int>& b) {return …

001 QGIS介绍

Quantum GIS&#xff08;QGIS&#xff09;是开源地理信息系统桌面软件&#xff0c;使用GNU&#xff08;General Public License&#xff09;授权&#xff0c; 属于 Open Source eospatial Foundation&#xff08;OSGeo&#xff09;的官方计划。在 GNU 授权下&#xff0c;开发者…

Postman路径修改

默认安装好Postman之后&#xff0c;默认路径在&#xff1a;C:\Users\用户名\AppData\Local\Postman。 修改路径只需要将整个文件夹拷贝到需要移动的位置即可&#xff0c;然后重新创建一个快捷方式。再删除原来路径的文件夹。

使用消息中间件实现系统间的异步通信和解耦

​​​​​​​目录 引言 一. 选择合适的消息中间件 二. 定义消息格式和通信协议 1. 定义消息格式 消息头 消息体 2. 定义通信协议 发送消息 接收消息 消息处理 3. 示例代码 定义消息格式 发送消息 接收消息 三、发布-订阅模式 1. 定义发布-订阅模式 2. 示例代…

C++ //练习 7.29 修改你的Screen类,令move、set和display函数返回Screen并检查程序的运行结果,在上一个练习中你的推测正确吗?

C Primer&#xff08;第5版&#xff09; 练习 7.29 练习 7.29 修改你的Screen类&#xff0c;令move、set和display函数返回Screen并检查程序的运行结果&#xff0c;在上一个练习中你的推测正确吗&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; …

RIP协议详解

​RIP是最早的动态路由协议&#xff0c;虽然已经过时并且很少使用&#xff0c;但是可以通过学习RIP并且和ospf等现在正在使用的路由协议对比&#xff0c;了解其工作原理和过时原因&#xff0c;具有很强的学习性。 一、RIP协议简介 RIP&#xff08;Routing Information Protoc…

(OpenCV)图片拼接

前言 图片拼接在许多领域都有广泛的应用&#xff0c;包括但不限于以下几个方面&#xff1a; 全景摄影&#xff1a;在摄影中&#xff0c;通过将多张照片拼接在一起可以实现全景照片的效果。这在旅游景点、房地产展示等领域有着广泛的应用&#xff0c;能够提供更加生动、真实的视…

Bpmn-js 属性控制

我们可以通过bpmn-js来访问对应的BPMN图例的属性信息。对应的流程图中的每个图例元素&#xff08;如开始、结束、中间/边界事件等都通过businessObject属性存储对基础BPMN元素的引用。业务对象是从BPMN 2.0 XML导入并在导出过程中序列化的实际元素。使用业务对象来读取和写入BP…

如何减少HTTP请求次数

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 如何减少HTTP请求次数? 减少 HTTP 请求次数自然也就提升了 HTTP 性能&#xff0c;可以从这 3 个方面入手: 减少重定向请求次数合并请求延迟发送请求 减少重定向请求次数 我们先来看看什么是重定向请…