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

目录

Ⅰ. 进程的概念(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)对进程进行描述和管理是操作系统的一项重要职责。通过使用各种工具和系统调用,我们可以方便地查看和管理进程,从而确保系统资源的有效利用。

文章手稿:

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2-表单与v-model

1.Vue表单使用 表单输入绑定&#xff1a;表单输入绑定 — Vue.js #v-model双向数据绑定new Vue({template: <div>/* 用户修改 , vue-data数据同步修改(内存) */<input v-model"message" placeholder"edit..."><p>message: {{message}}&…

2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024,8月2日-4)

2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;将于2024年8月2-4日在中国厦门召开。ICVISP 2024将围绕“虚拟现实、图像和信号处理”的最新研究领域&#xff0c; 为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提…

Python 参数类型

一 理解Python中的Parameters & Arguments Parameters&#xff1a;形参 Arguments&#xff1a;实参 二 Python的实参&#xff08;Arguments&#xff09;类型 实参类型总结 位置参数&#xff08;Positional Arguments&#xff09; &#xff1a;函数调用时通过入参的顺序来…

Younger 数据集:人工智能生成神经网络

设计和优化神经网络架构通常需要广泛的专业知识&#xff0c;从手工设计开始&#xff0c;然后进行手动或自动化的精细化改进。这种依赖性成为快速创新的重要障碍。认识到从头开始自动生成神经网络架构的复杂性&#xff0c;本文引入了Younger&#xff0c;这是一个开创性的数据集&…

【Unity】RPG2D龙城纷争(五)关卡编辑器之地图编辑

更新日期&#xff1a;2024年6月25日。 项目源码&#xff1a;本章发布 索引 简介关卡编辑器窗口类&#xff08;LevelEditor&#xff09;一、定义关卡编辑器窗口类二、两种编辑模式三、地块编辑模式1.关卡模板2.打开编辑窗口3.编辑器基本属性4.地块模板5.重新生成地图6.地图刷子7…

基于优化包络相关的Loran-C(罗兰C)信号天地波识别算法及MATLAB仿真代码和实测信号处理

引言 Loran-C接收信号处理中&#xff0c;完成信号的捕获后需要进行信号的跟踪&#xff0c;Loran-C信号的跟踪按照信号处理流程分为天地波识别、周期识别和正向过零点跟踪三个步骤。Loran-C信号通过天波和地波两种方式到达接收点&#xff0c;导致接收到信号为地波和天波的合成信…

YOLOv5改进(八)--引入Soft-NMS非极大值抑制

文章目录 1、前言2、各类NMS代码实现2.1、general.py 3、各类NMS实现3.1、Soft-NMS3.2、GIoU-NMS3.3、DIoU-NMS3.4、CIoU-NMS3.5、EIoU-NMS 4、目标检测系列文章 1、前言 目前yolov5使用的是NMS进行极大值抑制&#xff0c;本篇文章是要将各类NMS添加到yolov5中&#xff0c;同时…

性能优化-布局优化

性能优化-布局优化 屏幕的UI刷新机制 布局的选择 优化控件的使用 原生View的优化 1、屏幕的UI刷新机制 超过16ms会感觉卡顿&#xff0c; 刷新率&#xff08;Refresh Rate&#xff09;&#xff1a;指一秒内刷新屏幕的次数&#xff0c;例如60HZ&#xff1b; 帧率&#xff08;F…

菲律宾媒体PR发稿:谷歌SEO优化.关键词排名.谷歌收录

1. 引言 在菲律宾&#xff0c;媒体行业的发展日新月异&#xff0c;尤其是在线媒体。为了在这个竞争激烈的市场中脱颖而出&#xff0c;各家媒体纷纷寻求谷歌SEO优化、提升关键词排名和增加谷歌收录的方法。本文将围绕菲律宾的几大主要在线媒体&#xff0c;如菲律宾在线日志Jour…

优化系统小工具

一款利用VB6编写的系统优化小工具&#xff0c;系统优化、桌面优化、清理垃圾、查找文件等功能。 下载:https://download.csdn.net/download/ty5858/89432367

WPS复制后转置粘贴

1. WPS复制后转置粘贴 复制-》右键-》顶部第一行-》粘贴行列转置&#xff0c;如下图&#xff1a; 2. Excel office365 本地版 2. Excel office365 在线版

孙子兵法的笔记

系列文章目录 孙子兵法的笔记 三十六计的笔记 文章目录 系列文章目录1、始计第一【原文】【译文】 1、始计第一 用兵始于计谋&#xff0c;善善策出自“庙算”&#xff0c;而精确的“庙算”又来自对各种因素的侦测考察。 孙子在第一章中非常具体地提出了“五事”“七计”的考察标…

缓冲池管理器

开发环境搭建 克隆 git clone https://github.com/cmu-db/bustub.git cd bustub/ 切换分支 git checkout -b branchname v20221128-2022fall 创建docker镜像 docker build . -t bustub_img 创建容器 docker create -it --name bustub_container -v “E:/cmu/bustub”:“/bustu…

自然语言处理课程论文:《Attention is all you need》复现与解读

目录 1.背景介绍 1.1 文献介绍 1.2 研究背景 1.3 知识概述 1.3.1 机器翻译 1.3.2 attention机制与self-attention机制 2.数据来源与处理 2.1 数据集描述 2.2 数据处理 3. 模型架构 ​​​​​​​3.1 Positional Embedding ​​​​​​​3.2 Multi-Head Attention ​​​​​…

[UE虚幻引擎] DTSpeechVoice 文字转语音播放 插件说明

本插件可以在UE中使用蓝图把文本转成语音播放&#xff0c;播放的声音引擎是使用Windows自带的语音引擎&#xff0c;支持Win10&#xff0c;Win11。 系统设置 首先确认电脑是否有语音系统&#xff0c;一般正常安装的电脑都是自带的。 如果要播放多语言的&#xff0c;请自己下载其…

突发!OpenAI停止不支持国家API,7月9日开始执行

6月25日凌晨&#xff0c;有部分开发者收到了OpenAI的信&#xff0c;“根据数据显示&#xff0c;你的组织有来自OpenAl目前不支持的地区的API流量。从7月9日起&#xff0c;将采取额外措施&#xff0c;停止来自不在OpenAI支持的国家、地区名单上的API使用。” 但这位网友表示&am…

【宠粉赠书】SQLServer2022:从入门到精通

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据库学习的必备书籍——《SQL Server 2022从入门到精通》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《SQL Server 2022从入门到精通》系统全面地介绍SQL Server 2022数据库应用与开…

文献阅读:通过双线性建模来破译神经元类型连接的遗传密码

文献介绍 文献题目 Deciphering the genetic code of neuronal type connectivity through bilinear modeling 研究团队 Mu Qiao&#xff08;美国加州理工学院&#xff09; 发表时间 2024-06-10 发表期刊 eLife 影响因子 7.7 DOI 10.7554/eLife.91532.3 摘要 了解不同神经元…

【C++STL】Vector扩容机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

“Hello, World!“ —— 初学者进入编程世界的第一步

布莱恩W.克尼汉&#xff08;Brian W. Kernighan&#xff09;—— Unix 和 C 语言背后的巨人 布莱恩W.克尼汉 布莱恩W.克尼汉在 1942 年出生在加拿大多伦多&#xff0c;他在普林斯顿大学取得了电气工程的博士学位&#xff0c;2000 年之后取得普林斯顿大学计算机科学的教授教职。…