如何理解进程?

news2024/9/21 10:32:56

前言:

        我们在前面的对操作系统的学习,目的是为了让我们加深操作系统对“管理”的描述。我们在上一节了解到操作系统存在许多管理,今天我们就来初次了解一下——进程管理。

进程概念:

        课本概念:程序的一个执行实例,正在执行的程序等
        内核观点:担当分配系统资源(CPU时间,内存)的实体

         一个任务就是一个进程,而一个程序可能含有多个进程。

Windows的任务管理器就监控着你电脑正在运行的各个进程以及他们所占用资源的百分比。通过上图不难看出,Windows操作系统含有非常多的进程,那么既然存在那么多的进程,那就需要对进程进行管理。

OS该如何管理进程?

        我在我的任务管理器里发现我正在执行Chrome的进程,Chrome的可执行程序在不运行的时候是存放在硬盘中的,那么当运行Chrome时,OS就会将Chrome可执行程序 + 代码存放至内存中。

         但是这也并不是管理呀,之前在讲解冯诺依曼体系的时候就了解过,所谓的将数据和代码存放至内存,不过是拷贝而已,但是没错仅仅是拷贝而已,实在是不知道怎么构成管理。

        现在让我们来回顾一下,我们在上一篇文章还谈及过管理二字,提及管理永远是六个字——“先描述,再组织”。想想上一篇文章举的例子,转换成链表的增删查改。

        其实在计算机还未开机的时候,操作系统的相关熟悉还没有运转起来,还是以二进制的方式存入在磁盘之中,而开机之后,操作系统则会加载至内存之中,这时候如果有一个进程需要执行,此时操作系统内部就会创建一个结构体,这个结构体就叫做——“进程控制块”,我们简称PCB(process control block)。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。而不同的操作系统有不同的PCB名称,Windows叫作EPROCESS,而Linux的则叫task_struck,是一个结构体类型。

        先描述:task_struct存有当前进程的所以属性,并且存在内存指针,方便查找该内存的代码 + 数据。

        再描述:task_struct存有next指针,可以指向下一个task_struct形成链表,所以OS对于进程的管理,可以简化为对链表的增删查改。

         进程 = 自己的PCB + 自己的代码和数据

如何理解进程动态运行?

         对于我们吃力多个task_struct我们进行调度运行进程,本质就是让进程控制块task_struct进行排队。只要我们进程的task_struct,将来在不同队列中,进程就可以访问不同的资源。

进程的task_struct本身属性都有哪些?

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

        1、以前我们使用./来运行可执行程序,本质就是让系统创建进程并运行。我们自己写的代码 == 系统命令 == 可执行文件。在Linux中运行的大部分执行操作,本质都是运行进程。 

         2、给个进程都有自己的标识符,叫“进程pid”,具体方法我们可以通过指令查看当前运行的进程,输入指令:ps ajx

         3、一个进程若是想要知道自己的pid,我们就可以输入指令:ps ajx | head -1 && ps ajx | grep process   这样通过管道和grep的方式直接定位你要查询的进程的信息。

        下面我先写一个简单的C语言程序。 

        现在编译运行可执行程序然后通过ps ajx | head -1 && ps ajx | grep process 查询当前进程的pid:

        当然你也可以在写入新的程序中使用getpid(),这是我们第一次使用系统调用!!!

        而getpid()函数需要:头文件<unistd.h>,返回值pid_t getpid();

 

        可以看到系统调用出来的该进程的pid和我们监察窗口的pid内容一致。当然你还可以通过ppid()查看父进程的pid。 

        用户想要知道pid,则需要去内核中查找,因此就需要接口层提供接口,这个接口就是getpid()函数。 

        4、ctrl + c 就是在用户层面终止进程,我们也可以使用指令 kill -9 XXX(这里代表pid),直接杀掉进程。

进程创建的代码的方式——重操作,轻原理

        我们在前面提到了pid_t ppid(),是获取当前进程父进程的pid。我们可以通过代码来写一写:

 

        这时候却发现两次进程的pid是不一样的,但是ppid父进程的却是一样。
        其实,进程每次启动,对应的pid都不一样这是正常的,只要父进程的pid(ppid)是一样的,那这个父进程是谁呢? 

        输入指令:ps ajx | head -1 && ps ajx XXX (这里输入ppid的值)

 

        最终我们发现,这个父进程原来是bash 

        这不就是之前讲解Linux权限,所提到的“王婆”吗?不就是个命令行解释器嘛。。。

fork创建子进程 

         运行上述代码

明明有只有一行printf,却打印了两行,而且各自的pid和ret都不一样,这是啥情况?

  • 其实是fork函数具有多个返回值。fork函数目前我们可以理解为,创建了一个子进程,fork函数之后的代码,父子共享。
  • 创建了一个进程,本质是系统中多了一个内核task_struct + 代码和数据。
  • 父进程的代码和数据是从磁盘加载出来的,子进程的代码和数据,默认继承父进程的代码和数据。  

        所以对于fork返回值等于0时才会进入子进程,因此fork 之后通常要用 if 进行分流操作:


 

        这不难看出子进程的ppid就是父进程的pid,而父进程的ppid上面也验证过了,就是bash的pid。

 

两个问题

为什么要创建子进程?       

        目前我们只是初学阶段,对日后的知识概念还并不熟悉,将来肯定会有需要我们让子进程和父进程执行不一样的代码。到了那个时候就会运用到了!

同一个变量为什么会有两个值?

        对于这一段代码,我们不难发现最后的运行结果竟然又是打印了两次,你说是返回了两次而且还是返回了两个不同的返回值,对于该部分的理解,我们需要讲解到虚拟地址 + 地址空间那一部分我们才能理解清楚。
        目前我们只需要知道,fork之后,父子进程一起执行剩下的代码就好了。

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

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

相关文章

cube studio 修改logo 水印,标题,图标等信息。

修改logo 修改后需重新打包前端镜像 修改登录界面标题 修改配置文件config.py中的app_name变量&#xff0c;线上需要重启后端pod 修改水印 修改后需重新打包前端镜像 修改标题 修改后需重新打包前端镜像 修改个性化图标 修改后需重新打包后端镜像 修改后需重新打包前端镜…

Elasticsearch:使用 API 密钥验证添加远程集群

API 密钥身份验证使本地集群能够通过跨集群 API 密钥&#xff08;cross-cluster API key&#xff09;向远程集群进行身份验证。API 密钥需要由远程集群的管理员创建。本地集群配置为在向远程集群发出每个请求时提供此 API 密钥。远程集群将根据 API 密钥的权限验证 API 密钥并授…

JVM—CMS收集器

参考资料&#xff1a;深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09;周志明 CMS收集器&#xff08;Concurrent Mark Sweep&#xff09;是一种以获取最短回收停顿时间为目标的收集器。低并发收集、低停顿。 CMS收集器是基于标记—清除算法实…

数据库相关概念大全!

一、什么是数据库&#xff1f; 1.数据库 数据库是一种更易于访问、更高效且更有条理的长期存储和处理信息的方式。 2. 优点&#xff0c;作用 数据库存储数据的规范性和系统性以及其检索数据的便捷性使其成为基于 Web 的应用程序中重要的部分。 数据库几乎可以用于所有应用程…

谷粒商城实战笔记-110~114-全文检索-ElasticSearch-查询

文章目录 一&#xff0c;110-全文检索-ElasticSearch-进阶-两种查询方式二&#xff0c;111-全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all三&#xff0c;112-全文检索-ElasticSearch-进阶-match全文检索四&#xff0c;113-全文检索-ElasticSearch-进阶-match_ph…

HarmonyOS 用List组件实现组合列表项

界面分析&#xff1a; 由于整体UX设计图符合从上至下的布局&#xff0c;所以可以采用Column组件作为外层容器 简介&#xff1a; 最上方的标题可以使用Text组件进行加载渲染中间的Banner图和简介分别可以使用Image组件和Text组件进行加载最后一部分可以看作是一个列表&#xf…

在PAI-DSW中连接Neo4J,并批量创建知识图谱

我在 阿里云DSW实例中安装并运行Neo4J 中提到过&#xff0c;由于PAI-DSW的专有网络配置不能确保百分之百成功&#xff0c;因而很难实现通过本地的浏览器登录在PAI-DSW中启动的Neo4J图数据库。 我当时想出的一个解决办法是使用./cypher-shell语句在命令行登录neo4j&#xff0c;…

工业5G路由器赋能户外组网远程监控及预警

随着物联网、大数据、云计算等技术的快速发展&#xff0c;工业领域对于远程监控、实时预警和数据传输的需求日益增长。特别是在户外复杂环境下&#xff0c;传统的有线网络组网方式面临着布线难度大、成本高、维护困难等问题。 工业5G路由器在户外组网远程监控预警应用基于高速…

Golang 并发控制模型

文章目录 Golang 并发控制模型一、使用 channel 通知实现并发控制1、无缓冲通道2、有缓冲通道 二、使用 sync 包中的 WaitGroup 实现并发控制1、sync.WaitGroup2、sync.Once 三、使用 Context 上下文实现并发控制1、简介2、context 包3、继承 context4、context 例子5、context…

基于springMVC的图书管理系统

进度终于来到了springMVC&#xff0c;下次估计就是springboot了&#xff0c;感觉每次开始新框架&#xff0c;环境都是大问题&#xff0c;项目一共敲四天&#xff0c;环境卡三天。总结一下这次碰到的问题和解决方法吧。 问题和解决方法 1、controller中return无法跳转到界面&a…

【安装】Linux Centos 或 Debian 离线安装指定版本MariaDB

【安装】Linux Centos 或 Debian 离线安装指定版本MariaDB 下载地址 https://mariadb.com/downloads/community/community-server/https://mirrors.aliyun.com/mariadb/yum/https://mariadb.com/downloads/community/community-server/ Download MariaDB Server - MariaDB.or…

NineData云原生智能数据管理平台新功能发布|2024年7月版

本月发布 12 项更新&#xff0c;其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式&#xff0c;让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…

数据库原理之多表查询——使用Mysql进行内连接和外连接

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Idea 目录 1.内连接 1.1隐式内连接 1.1.1定义 1.1.2举例 1.1.3优缺点 1.2显式内连接 1.2.1定义 1.2.2举例 1.2.3优缺点 2.外连接 2.1左外连接 2.1.1定义 2.1.2举例 2.…

Creomagic 推出认知通信功能以应对电子战 (EW) 威胁

新时代的软件定义无线电 (SDR) 技术可以在电子战和竞争频谱环境中自主维护可靠的网络。 最近的全球冲突凸显了现代战场上战术通信面临的严峻挑战。随着自主部队的日益普及&#xff0c;战场感知变得比以往任何时候都更加先进&#xff0c;需要大量信息传输和同步。在战场上传输关…

【OpenCV C++20 学习笔记】腐蚀和膨胀

腐蚀和膨胀 形态学原理膨胀腐蚀 代码实现膨胀函数腐蚀函数运行结果 形态学原理 腐蚀和膨胀通常有以下用途&#xff1a; 去除噪音分离或合并图像中的元素找出图片上的强度的极大值区域和极小值区域 以下图作为原始图片&#xff1a; 膨胀 用核 B B B来扫描图像 A A A&#xff…

Python数值计算(12)——线性插值

1. 概述 插值是根据已知的数据序列&#xff08;可以理解为你坐标中一系列离散的点&#xff09;&#xff0c;找到其中的规律&#xff0c;然后根据找到的这个规律&#xff0c;来对其中尚未有数据记录的点进行数值估计的方法。最简单直观的一种插值方式是线性插值&#xff0c;它是…

MuseTalk - 数字人唇部同步

文章目录 一、关于 MuseTalk概览新闻模型案例待办事项&#xff1a;第三方集成 二、安装构建环境mmlab 软件包下载 ffmpeg-static下载权重 三、快速入门推理使用 bbox_shift 以获得可调整的结果结合 MuseV 和 MuseTalk&#x1f195;实时推理实时推理注意事项 四、其它致谢限制引…

Taro学习记录

一、安装taro-cli 二、项目文件 三、项目搭建 1、Eslint配置 在项目生成的 .eslintrc 中进行配置 {"extends": ["taro/react"], //一个配置文件&#xff0c;可以被基础配置中的已启用的规则继承"parser": "babel/eslint-parser…

1688中国站获得工厂档案信息 API

公共参数 名称类型必须描述keyString是免费申请调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…

【动态规划-最大子段和】力扣1191. K 次串联后最大子数组之和

给定一个整数数组 arr 和一个整数 k &#xff0c;通过重复 k 次来修改数组。 例如&#xff0c;如果 arr [1, 2] &#xff0c; k 3 &#xff0c;那么修改后的数组将是 [1, 2, 1, 2, 1, 2] 。 返回修改后的数组中的最大的子数组之和。注意&#xff0c;子数组长度可以是 0&…