【Linux】进程 | 控制块pcb | task_struct | 创建子进程fork

news2024/10/10 8:19:34

目录

Ⅰ. 进程的概念(Process)

1. 什么是进程?

2. 多进程管理

3. 进程控制块(PCB)

task_struct 的结构

Ⅱ. 进程查看与管理

1. 使用指令查看进程

2. /proc 查看进程信息

3. 获取进程 ID

4. 创建子进程

原因:fork()的 机制

总结

文章手稿:


 内容:理解“进程”的概念及其在操作系统中的管理,并探讨进程控制块 (PCB) 的重要性及其结构。本文还将介绍如何查看和管理进程,以及如何通过系统调用创建进程。

文章手稿可见文末

Ⅰ. 进程的概念(Process)

1. 什么是进程?

进程是一个运行中的程序。当可执行文件被加载到内存中时,该程序就成为了一个进程。

2. 多进程管理

操作系统中可能同时存在大量的进程吗?of course

操作系统需要管理这些进程,以确保系统资源(如CPU时间、内存等)合理分配。管理进程的本质是对进程数据的管理。

我们需要 先描述再组织。(上一章我们讲过)

所以,当一个程序加载到内存时,操作系统做的不仅仅只是把代码和数据加入到内存,

还要管理进程,创建对应的数据结构。

Linux 操作系统的内核是 C 语言写的,描述时就用到struct啦

3. 进程控制块(PCB)

在操作系统中,用于描述进程的结构体称为进程控制块(PCB)。在Linux中,这种结构体称为 task_struct

task_struct 的结构
struct task_struct {
    volatile long state;
    void *stack;
    atomic_t usage;
    unsigned int flags;     
    unsigned int ptrace;
    unsigned long ptrace_message;
    siginfo_t *last_siginfo; 
    int lock_depth;         
    // ... 其他属性
};

task_struct 包含进程的所有属性数据,如进程状态、优先级、程序计数器、内存指针、上下文数据、I/O状态信息和记账信息等。

操作系统对进程的管理,最终变成了对链表的增删查改。

什么是进程?目前为止我们可以总结成:进程 = 可执行程序 + 该进程对应的内核数据结构

操作系统不相信任何人的,不会直接暴露自己的任何数据结构,代码逻辑,其他数据相关的细节。

想做系统是通过 系统调用 的方式,对外提供接口服务的。

下面我们将来学习一些系统接口


Ⅱ. 进程查看与管理

1. 使用指令查看进程

 运行

通过下面这些命令,可以方便地查看和管理系统中的进程。

指令含义
ps a显示现行终端机下的所有程序,包括其他用户的程序
ps -A显示所有程序
ps c列出程序时,显示每个程序真正的指令名称
ps -e显示所有程序
ps e列出程序时,显示每个程序所使用的环境变量
ps f用ASCII字符显示树状结构,表达程序间的相互关系
ps -H显示树状结构,表示程序间的相互关系
ps -N显示所有的程序,除了执行ps指令终端机下的程序之外
ps s采用程序信号的格式显示程序状况
ps S列出程序时,包括已中断的子程序资料
ps -t <终端机编号>指定终端机编号,并列出该终端机的程序状况
ps u以用户为主的格式来显示程序状况
ps x显示所有程序,不以终端机来区分
ps -l显示详细PID信息

通过指令如 ps 和 top 可以查看系统中的进程信息。例如,使用 ps aux 可以显示系统中所有的进程:

$ ps aux

若需查看特定进程,可以使用 grep 过滤:

$ ps aux | grep 'mytest' | grep -v grep

相当于Windows 下的任务管理器:

2. /proc 查看进程信息

/proc 是一个虚拟文件系统,包含当前系统的实时进程信息。

$ ls /proc

左边蓝色的就是pid

3. 获取进程 ID

每一个进程在系统中,都会存在一个惟一的标识符--pid

我们可以尝试在proc 目录下找到这个 pid ,发现这个18705 目录

ctrl+c 可以发现进程具有实时性

 接下来我们重启来继续研究一下文件的创建和存储

 对代码进行一些改写

#include <stdio.h>
#include <unistd.h>
 
int main(void) {
    FILE* fp = fopen("log.txt", "w");  // 若不存在就创建之
    while (1) {
        printf("I am m a process!\n");
        sleep(1);
    }
}

 

C语言专栏中讲到过,fopen 后面如果不带路径,那么会默认在当前路径。

所谓的当前路径,其本质 —— 当前进程所在的路径

进程会自己维护,进程会知道自己的工作路径在哪里

  • exe:指出进程对应的可执行程序的磁盘文件
  • cwd:指出进程当前的工作路径

 

可以通过 getpid() 和 getppid() 系统调用获取当前进程和父进程的 ID。

 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void) {
    printf("PID: %d, PPID: %d\n", getpid(), getppid());
    return 0;
}

运行可以看到:

 除了ctrl+c ,我们还可以这么终止进程

$ kill -9 [pid]   # 给这个进程发送9号信号

 

上面看到的ppid 我们也可以来测试一下

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
 
int main(void) {
    while (1) {
        printf("I am m a process! , pid: %d, ppid: %d\n",getpid(), getppid());
        sleep(1);
    }
}

4. 创建子进程

通过 fork() 系统调用可以创建子进程。fork() 有两个返回值:父进程返回子进程的 PID,子进程返回 0。

为什么可以返回两个值呢? 

我们可以来测试一下 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void) {
    pid_t id = fork();

    if (id == 0) {
        // 子进程
        while (1) {
            printf("我是子进程,我的pid: %d,我的父进程是 %d\n", getpid(), getppid());
            sleep(1);
        }
    } else {
        // 父进程
        while (1) {
            printf("我是父进程,我的pid: %d,我的父进程是 %d\n", getpid(), getppid());
            sleep(1);
        }
    }
}
原因:fork()的 机制

fork() 后,父进程和子进程会共享代码,数据则各自独立。通过不同的返回值,可以让父进程和子进程区分不同的执行流,执行不同的代码块。

具体是怎么区分的可见文末手稿中的图解~ 

总结

进程是操作系统中非常重要的概念。通过进程控制块(PCB)对进程进行描述和管理是操作系统的一项重要职责。通过使用各种工具和系统调用,我们可以方便地查看和管理进程,从而确保系统资源的有效利用。

文章手稿:

 

 

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

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

相关文章

在Ubuntu22.04 使用stable-diffusion-webui 秋叶整合包

背景 众所周知&#xff0c;赛博菩萨已经发布了windows下的整合包&#xff0c;开箱即用&#xff0c;且集成度较高。 那我为啥非要在Ubuntu下使用呢&#xff1f; 当然是因为主力机就是Ubuntu系统啦。而且涉及到sd webui API 的调用&#xff0c;在Ubuntu 下调试更加方便一点。 那…

PG实践|内置函数之GENERATE_SERIES之深入理解

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

2024年第十五届蓝桥杯青少组大赛8月24日开启

据蓝桥杯青少组官网显示&#xff0c;2024年第十五届蓝桥杯青少组大赛8月24日开启。 蓝桥杯青少组历届题库地址&#xff1a;http://www.6547.cn/question/cat/2 蓝桥杯青少组历届真题下载&#xff1a;http://www.6547.cn/wenku/list/10

【神经网络】CNN网络:深入理解卷积神经网络

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&#xff01; CNN网络&#xff1a;深入理解…

VideoLLaMA 2:多模态视频理解新突破,音频理解能力再升级,挑战 GPT-4V

前言 近年来&#xff0c;人工智能技术飞速发展&#xff0c;尤其是大模型的出现&#xff0c;为视频理解和生成领域带来了前所未有的机遇。然而&#xff0c;现有的视频大模型&#xff08;Video-LLM&#xff09;在处理视频中复杂的时空信息和音频信息方面仍存在不足&#xff0c;例…

【C++11(二)】lambda表达式和可变参数模板

一、可变参数模板 C11的新特性可变参数模板 能够让您创建可以接受 可变参数的函数模板和类模板 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Arg…

笔记101:OSQP求解器的底层算法 -- ADMM算法

前言1&#xff1a;这篇博客仅限于介绍拉格朗日乘子法&#xff0c;KKT条件&#xff0c;ALM算法&#xff0c;ADMM算法等最优化方法的使用以及简版代码实现&#xff0c;但不会涉及具体的数学推导&#xff1b;不过在下面我会给出具体数学推导的相关文章和截图&#xff0c;供学有余力…

Elasticsearch:使用 Llamaindex 的 RAG 与 Elastic 和 Llama3

这篇文章是对之前的文章 “使用 Llama 3 开源和 Elastic 构建 RAG” 的一个补充。我们可以在本地部署 Elasticsearch&#xff0c;并进行展示。我们将一步一步地来进行配置并展示。你还可以参考我之前的另外一篇文章 “Elasticsearch&#xff1a;使用在本地计算机上运行的 LLM 以…

在线epub阅读器epub;在线图书阅读器;专门为epub定制的阅读器;免费在线电子图书epub阅读器

背景&#xff1a;不记得某时某刻了&#xff0c;就是当时想要使用电脑阅读epub图书&#xff0c;也找了好些个在线epub阅读器&#xff0c;但总有一些不如意的地方&#xff0c;如某些功能需要会员之类的&#xff0c;突发临想的就想到自己开发一个&#xff0c;就此&#xff0c;一个…

大模型RAG技术:构建高效、可信赖的知识检索系统

前言 LLM 问题 幻觉&#xff1a;在没有答案的情况下提供虚假信息。 过时&#xff1a;当用户需要特定的当前响应时&#xff0c;提供过时或通用的信息。 来源&#xff1a;从非权威来源创建响应。由于术语混淆&#xff0c;不同的培训来源使用相同的术语来谈论不同的事情&#…

C# Onnx Yolov8-OBB 旋转目标检测 行驶证副页条码+编号 检测,后续裁剪出图片并摆正显示

C# Onnx Yolov8-OBB 旋转目标检测 行驶证副页条码编号 检测&#xff0c;后续裁剪出图片并摆正显示 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-06-25T10:59:15.206586 description&#xff1a;…

第一课:SSH协议、SSHD守护进程、Openssh软件包

第一节课 6月12日 ssh协议 关键问题 一、ssh、sshd、openssh的概念和区别&#xff1f; 二、ssh是基于什么架构&#xff1f;B/S还是C/S&#xff1f; 三、用户远程连接服务器经历哪些过程&#xff1f; 四、如何查看openssh软件包是否安装&#xff1f; 五、rpm和yum的区别&#xf…

node带参数命令

不带参数命令示例&#xff1a; node /www/wwwroot/server 带参数命令示例&#xff1a; node /www/wwwroot/server arg1 arg2 arg3 在启动页进行参数处理&#xff1a; // 获取启动参数(除去前2个默认参数&#xff0c;示例&#xff1a;node /www/wwwroot/server arg1 arg2 …

SAP ABAP 之容器

文章目录 前言一、案例介绍/笔者需求二、自定义容器 a.实例化对象 b.自定义容器效果演示 c.Copy Code 三、自适应容器 a.常用 必须 参数理解 b.METRIC 度量单位 c.RATIO 百分比尺寸 d.STYLE 容器…

WMV 视频格式怎么转换?WMV 视频为什么不流行了?

目前有越来越多的视频格式类型&#xff0c;如常见的 MP4、FLV、AVI 等等&#xff0c;而技术的演变也逐渐让一些常见的视频格式变的越来越少了。 今天我们一起来聊下 WMV 这个视频格式&#xff0c;让我们看看它的发展以及为什么现在越来越少人使用了。 什么是 WMV 视频格式&…

微信营销自动化(朋友圈自动点赞工具):UIAutomation的解决方案

文章不用看, 是AI生成的, 请直接查看下载地址 http://www.aisisoft.top . 微信朋友圈自动点赞工具, 自动群发工具 在当今的数字化营销领域&#xff0c;自动化工具成为了提升工作效率、增强客户互动的关键。本文将详细介绍一款基于UIAutomation框架与Python语言构建的微信营销自…

数据容器(四)

目录 一、dict&#xff08;字典、映射&#xff09; 1.字典的定义 2.字典数据的获取 3.字典的嵌套 一、dict&#xff08;字典、映射&#xff09; 1.字典的定义 使用{}&#xff0c;不过存储的元素是一个个的&#xff1a;键值对。 2.字典数据的获取 字典同集合一样&#xff…

PointCloudLib-滤波模块(Filtering)-使用统计异常值移除过滤器移除异常值

在本教程中,我们将学习如何消除噪声测量值,例如异常值, 使用统计分析技术的点云数据集。 背景 激光扫描通常会生成不同点密度的点云数据集。 此外,测量误差会导致稀疏异常值,从而破坏 结果更多。这使得本地点云的估计变得复杂 表面法线或曲率变化等特征,导致 错误的值,…

【WEB】关于react的WEB应用中使用React Developer Tools便捷快速查看元素数据

1、往扩展工具中添加React Developer Tools的扩展包 2、检查是否生效&#xff0c;如下图&#xff1a; 可以看到右上角多出来一个Components的tab选项&#xff0c;就是成功了

转运机器人:智能物流的得力助手

在物流行业&#xff0c;转运机器人已经成为提高转运效率、降低成本的重要工具。而富唯智能转运机器人凭借其出色的性能和智能化的设计&#xff0c;成为了众多企业的得力助手。 富唯智能转运机器人采用了先进的AMR控制系统&#xff0c;可以一体化控制移动机器人并实现与产线设备…