进程的基本概念、查看、创建

1. 进程的概念

概念:加载到内存的程序/正在运行的程序称为内存
我们在玩电脑的时候是可以启动多个程序的,比如边听歌边写博客,根据上篇文章我们知道肯定要将多个.exe文件加载到内存中,作为操作系统肯定是要管理这多个加载到内存的程序。如何管理呢?六个大字,先描述再组织。

2. 进程的描述

进程的信息被放在一个叫进程控制块(process control block)PCB,可以理解成一个进程属性的集合。
linux描述一个进程的结构体叫task_struct(PCB的一种)。该结构体有非常多的字段,我们挑几个常见的字段。

struct task_struct
{标识符:唯一标识符,用于区别其他进程状态:任务状态、退出代码、退出信号优先级:相对于其他进程的优先级程序计算器:程序中即将被执行的指令的地址上下文数据:进程执行时处理器的寄存器中的数据I/O状态:包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等....
}

3. 进程的组织

将多个进程描述成多个PCB结构体,再将各个PCB链接起来,所以对进程的管理就转化成对PCB结构体的管理。
在这里插入图片描述

所以一个进程等于:可执行程序(.exe)+内核数据结构(PCB)

4. 查看一个进程

使用ps指令来查看一个指令,下面是一个程序的代码,用于测试

int main()
{while(1){printf("I am a process!!!\n");sleep(1);}return 0;
}
ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep

在这里插入图片描述

PID就是上面说的标识符,可以使用系统函数getpid()获得,PPID则是父进程的标识符,可以使用getppid()。

int main()
{while(1){printf("I am a process!!! pid:%d ppid:%d\n",getpid(),getppid()");sleep(1);}return 0;
}

在这里插入图片描述

除了用ps指令查看一个进程,linux还将进程的信息存放在了一个叫proc的文件夹中。

在这里插入图片描述
我们来单独查看一个进程(PID为4630)是什么样的

在这里插入图片描述

5. 创建一个进程

运行一个程序就相当于创建一个进程,那么能用代码的形式创建一个进程吗?fork()函数就可以解决这个问题。
我们先来看一段代码:

  1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 5 int main()6 {7     printf("before fork:pid: %d ppid: %d\n",getpid(),getppid());8     fork();9     printf("after  fork:pid: %d ppid: %d\n",getpid(),getppid());                                                                                                   10     return 0;11 }

在这里插入图片描述
可以看到fork之后有两个进程了,且它们是父子关系,fork()之后的代码共享。我们在来看看这个函数的原型。
在这里插入图片描述

再来看一段代码

 1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 5 int main()6 {7     printf("before fork:pid: %d ppid: %d\n",getpid(),getppid());8     pid_t id = fork();9     printf("after  fork:pid: %d ppid: %d\n returnid: %d",getpid(),getppid(),id);                                                                                   10                                                                                                                                              11     sleep(2);                                                                                                                                12     return 0;                                                                                                                                13 }   

在这里插入图片描述
从结果可以看出,如果是父进程fork的返回值是子进程的pid,而子进程的fork返回值是0,我们可以通过这个特性很好的分流执行代码。

  1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 5 int main()6 {7     printf("before fork:pid: %d ppid: %d\n",getpid(),getppid());8     pid_t id = fork();9     if(id < 0)10         return -1;11     if(id == 0)12     {13         while(1)14         {15          printf("after  fork, 我是子进程:pid: %d ppid: %d returnid: %d\n",getpid(),getppid(),id);16              sleep(2);17         }18     }19     else20     {21         while(1)22         {23          printf("after  fork,我是父进程:pid: %d ppid: %d returnid: %d\n",getpid(),getppid(),id);24          sleep(2);                                                                                                                                                  25         }26     }27 28     sleep(2);29     return 0;30 }

在这里插入图片描述

看完简单的使用之后,我们再来思考三个问题?

fork为什么给父进程返回子进程的pid,而给子进程返回0?因为父进程有很多子进程,难以找到某个子进程,所以返回子进程的pid,但是子进程只有一个父进程,使用getppid就能得到父进程的pid了。

为什么一个函数会返回两个值?因为在fork这个函数内部,return语句之前的代码执行完之后,已经创建了子进程,所以会共享代码,return语句就执行了两遍。

为什么一个变量会有两个值?这个问题与进程地址空间有关,后面才会理解。

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

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

相关文章

开源大数据集群部署(十)Ranger usersync部署

作者&#xff1a;櫰木 ranger usersync部署 解压包 [roothd1.dtstack.com ranger]# pwd /opt/ranger [roothd1.dtstack.com ranger]# tar -zxvf ranger-2.3.0-usersync.tar.gz -C /opt/ [roothd1.dtstack.com ranger]# cd ranger-2.3.0-usersync修改配置install.properties…

小白Linux学习笔记-Linux开机启动流程

Linux 开机启动流程 文章目录 Linux 开机启动流程启动流程概览详细讲解开机软件 —— BIOS、Grub名词解释流程解释BIOS 开机文档 —— menu.lst、grub.confGrub 配置文档流程解释 init 程序流程解释init 执行的相关文件 run-level(启动等级) 相关的命令实验rhel6 单用户模式修改…

改变终端安全的革命性新兴技术:自动移动目标防御技术AMTD

自动移动目标防御技术通过启用终端配置的自适应防御来改变终端检测和响应能力。产品领导者可以实施AMTD来确保实时威胁响应&#xff0c;并减少检测和响应安全威胁所需的时间。 主要发现 通过动态修改系统配置、软件堆栈或网络特征&#xff0c;自动移动目标防御&#xff08;AMTD…

Unity 开发注意事项

1. 空Unity消息 Unity消息被运行时事件调用&#xff0c;即使消息体为空也会被调用。因此&#xff0c;删除空消息避免不必要的处理。 例如&#xff1a; using UnityEngine;class Camera : MonoBehaviour {private void FixedUpdate(){}private void Foo(){} } 应该删除未使用…

MQ,RabbitMQ,SpringAMQP的原理与实操

MQ 同步通信 异步通信 事件驱动优势&#xff1a; 服务解耦 性能提升&#xff0c;吞吐量提高 服务没有强依赖&#xff0c;不担心级联失败问题 流量消峰 ​ 小结: 大多情况对时效性要求较高&#xff0c;所有大多数时间用同步。而如果不需要对方的结果&#xff0c;且吞吐…

性能实测:分布式存储 ZBS 与集中式存储 HDS 在 Oracle 数据库场景表现如何

作者&#xff1a;深耕行业的 SmartX 金融团队 金鑫 在金融客户的基础架构环境中&#xff0c;HDS 是一种被广泛使用的存储解决方案。作为集中式存储的代表之一&#xff0c;HDS 拥有高性能、高可用性和可扩展性的企业级存储特点&#xff0c;适用于实时数据处理、虚拟化和灾难备份…

Python 潮流周刊#38:Django + Next.js 构建全栈项目

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。本周刊开源&#xff0c;欢迎投稿[1]。另有电报频道[2]作为副刊&#xff0c;补充发布更加丰富的资讯&#xff0c;…

开源软件全景解析:驱动技术创新与行业革新的力量

目录 什么是开源 开源的核心 开源软件的特点 为什么程序员应该拥抱开源 1.学习机会&#xff1a; 2.社区支持&#xff1a; 3.提高职业竞争力&#xff1a; 4.加速开发过程&#xff1a; 5.贡献和回馈&#xff1a; 开源软件的影响力 开源软件多元分析&#xff1a; 开源…

蓝桥杯刷题day06——平均

1、题目描述 有一个长度为n 的数组&#xff08;n 是 10 的倍数&#xff09;&#xff0c;每个数ai都是区间 [0,9] 中的整数。 小明发现数组里每种数出现的次数不太平均&#xff0c;而更改第i 个数的代价为bi&#xff0c; 他想更改若干个数的值使得这10 种数出现的次数相等&…

YOLOv8改进 | 检测头篇 | 重参数化检测头RepHead解决困难样本检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是RepHead,该检测头为我独家全网首发,该检测头由重参数化模块组成,加大对于特征学习的能力,却可以不增加GFLOPs(仅仅略微提升)从而不影响模型的推理速度和性能,保持较高的FPS能力,牺牲了少量GFLOPs的情况下确提高了模型的特征提…

LeetCode--代码详解 292.Nim游戏

292.Nim游戏 题目 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c; 你作为先手 。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写…

(2)(2.13) Rockblock Satellite Modem

文章目录 前言 1 支持的MAVLink命令信息 2 设置 3 使用方法 4 数据成本 5 参数 前言 &#xff01;Note 该功能仅适用于 ArduPilot 4.4 或更高版本&#xff0c;并且要求飞行控制器支持 LUA 脚本(LUA Scripts)。 RockBLOCK 卫星调制解调器可实现与 ArduPilot 飞行器的全球…

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式 基础(持续更新~)

具体操作&#xff1a; day2: 作用&#xff1a; 出现跨域问题 配相对应进行配置即可解决&#xff1a; IDEA连接的&#xff0c;在url最后加参数?useSSLfalse注意链接密码是123&#xff08;docker中mysql密码&#xff09; 注意&#xff0c;虚拟机中设置的密码和ip要和主机上…

专业排版设计软件:QuarkXPress 2024 for mac中文激活版

QuarkXPress 2024 for Mac是一款功能强大、易于使用、高质量输出的专业排版软件。无论您是出版业的专家还是初学者&#xff0c;都可以通过QuarkXPress 2024轻松创建出令人惊叹的出版物。 软件下载&#xff1a;QuarkXPress 2024 for mac中文激活版下载 QuarkXPress 2023 for Mac…

Unity3d Cinemachine篇(完)— TargetGroup

文章目录 前言使用TargetGroup追随多个模型1. 创建二个游戏物体2. 创建TargetGroup相机3. 设置相机4. 完成 前言 上一期我们简单的使用了ClearShot相机&#xff0c;这次我们来使用一下TargetGroup 使用TargetGroup追随多个模型 1. 创建二个游戏物体 2. 创建TargetGroup相机 3…

vue 下载二进制文件

文章目录 概要技术细节 概要 vue 下载后端返回的二进制文件流 技术细节 import axios from "axios"; const baseUrl process.env.VUE_APP_BASE_API; //downLoadPdf("/pdf/download?pdfName" res .pdf, res); export function downLoadPdf(str, fil…

react-virtualized实现行元素不等高的虚拟列表滚动

前言&#xff1a; 当一个页面中需要接受接口返回的全部数据进行页面渲染时间&#xff0c;如果数据量比较庞大&#xff0c;前端在渲染dom的过程中需要花费时间&#xff0c;造成页面经常出现卡顿现象。 需求&#xff1a;通过虚拟加载&#xff0c;优化页面渲染速度 优点&#xff1…

rust嵌入式开发之RTICvsEmbassy

RTIC和Embassy是目前rust嵌入式开发中比较热门的两个框架。本来呢&#xff0c;针对RTIC的移植已经完成了一小半&#xff0c;但在移植过程中感受到了RTIC的不足&#xff0c;正好跳出来全面考察下embassy&#xff0c;本文就是根据目前的尝试结果做个对比总结。 RTIC和Embassy是两…

Codeforces Round 651 (Div. 2)C. Number Game 博弈 奇偶数 偶数的表示

Submission #244500083 - Codeforces 题目&#xff1a; 思路&#xff1a; 此题要从奇偶性上入手。&#xff08;注意除的是奇因数&#xff0c;即一个奇数。我想成质数了&#xff09; 1.当A选手开局是1时&#xff0c;A败。 2.当A选手开局是2和奇数时&#xff0c;A必胜。&…

Golang context 万字解析实现原理

Golang&#xff1a;context基于go1.21版本 Context 是什么Context 的功能应用场景源码分析1.10 Context核心结构1.1Err错误2 .1 emptyCtx 3.1 Background() 和 TODO()4.1.1 cancelCtx4.1.2 Deadline 方法4.1.2 Done 方法4.1.2 Err 方法4.1.2 Value 方法 4.2 WithCancel() 和 Wi…