当前位置: 首页 > news >正文

进程:pcb

进程控制块(PCB)详解

一、PCB的概念

进程由内核数据结构和代码数据两部分组成。其中内核数据结构就是PCB(进程控制块),在代码中体现为task_struct结构体。该控制块存储了进程的关键控制信息。

1.2 PCB的内容

PCB主要包含以下信息:

  1. 标识符:唯一标识进程的PID(进程ID),可通过getpid()函数获取(需包含<sys/types.h>头文件)
  2. 状态:记录进程当前状态,包括:
    • 运行态(代码正在CPU执行)
    • 阻塞态(等待硬件I/O完成)
    • 挂起态
    • 退出代码和信号
  3. 优先级:相对于其他进程的执行优先级
  4. 程序计数器:存储下一条待执行指令地址的寄存器
  5. 内存指针:指向程序代码、进程数据和共享内存区域的指针
  6. 上下文数据:进程运行时处理器寄存器中的数据。当时间片用完时,未执行完的进程状态会被保存到寄存器中
  7. I/O状态信息:包括I/O请求、分配的I/O设备和使用的文件列表
  8. 记账信息:处理器时间、时钟数、时间限制等统计信息

进程调度采用时间片轮转机制。Linux系统为每个进程分配特定时间片,当前进程用完时间片后即切换至下一进程。

二、进程标识符PID详解

在Linux系统中,每个进程都有唯一的PID标识。可通过以下命令查看进程信息:

  • ps axj:列出所有进程信息(包括PID)
  • ps axj | head -1:显示首行信息类型
  • ps axj | grep 32713:筛选PID为32713的进程信息


我们找到了pid为32713的进程:pross同时他是我们自己建立的进程,但是当我结束进程再次调用./pross运行它是我们会发现:

他的进程pid变化了:

得出当一个进程启动时他的pid也会进行更新;但有没有发现此进程的PPID不会发生变化一直是32440这个是他的父进程;我们不妨看看他的父进程是谁:

bash 是我们操作系统自带的命令行解释器。当创建新进程时,它会先解析命令,然后通过 fork() 系统调用来创建新进程。

在进程创建并且运行的时候会自动在proc目录中生成对应pid进程的所有文件

cwd是进程当前正在工作的目录,exe是这个进程的可执行程序在哪里;

这个工作的目录可以自己改,用fopen(file.txt)或用fork()创建新的文件进程时会自动在当前文件夹创立;会自动以当前进程(二进制文件)的工作路径中创建;

如何更改进程的工作路径

系统调用:

int chdir(const char*path );在path里面写路径;

如何创建子进程?

通过代码创建子进程:使用fork()系统调用生成新进程。

函数名称 fork

功能说明 创建子进程

头文件与函数原型

#include <unistd.h> pid_t fork(void);

fork()的简单使用和其结果

我们发现为什么我只用了一次fork会输入两遍第二个printf指令呢?而且明显最后一个才是创建的子进程;我们不妨在看一个代码:

这时候父子进程就分开了,为啥呢?我们要先知道

关于 fork() 函数的返回值

fork()函数的返回值有三种情况:

  • 返回0:表示当前代码在子进程中执行。
  • 返回正数(子进程的 PID):表示当前代码在父进程中执行。
  • 返回-1:表示fork()调用失败。

    为什么fork会返回两个值?

  • 答:因为在fork()函数中,代码会执行两次返回操作。

    为什么父进程返回正整数而子进程返回0?

  • 答:因为一个父进程可能有多个子进程,创建子进程时父进程需要保存子进程ID,而子进程不需要保存父进程ID。

    一个变量id怎么会有两个值?

  • 答:通过虚拟地址机制,父子进程的ID分别存储在不同地址空间,最终会进行转换映射。

http://www.cnnetsun.cn/news/1400849.html

相关文章:

  • 党政机关如何正确使用 OpenClaw LOGO|含下载
  • 美胸-年美-造相Z-Turbo入门秘籍:写好描述词,让AI听懂你的想法
  • 2025年OpenRouter免费模型大盘点:53个零成本AI工具全解析(含Grok-4 Fast/Nemotron Nano 9B V2)
  • Java方法重载
  • DeepSeek-OCR-2部署案例:K8s集群中水平扩展OCR微服务实践
  • 深度学习从入门到实践:零基础也能掌握 AI 核心技术
  • 大数据学习指南:Linux + Hadoop + Spark + Flink 全生态实战手册
  • yz-bijini-cosplay实际生成:LoRA自动标注+种子值嵌入确保结果可复现
  • 如何使用 Gherkin 解析器:Behat 测试的终极指南
  • 商品列表item UI设计
  • 腾讯混元翻译模型应用:用HY-MT1.8B实现字幕文件批量翻译
  • 用Python和NumPy手搓神经网络:从激活函数到前向传播的完整实现
  • 终极指南:如何快速掌握Scenic - JAX计算机视觉研究库的完整使用教程
  • Qwen3-0.6B-FP8服务器端集成:高并发API服务设计与实现
  • 语音识别新选择:Qwen3-ASR-1.7B快速部署与实战体验
  • 【亲测】2026年3月OpenClaw(Clawdbot)京东云6分钟喂奶级安装指南
  • Nitro服务器推送技术:提升页面加载速度的新方法
  • ComfyUI电商应用实战:快速生成商品主图与营销海报
  • 单细胞研究避坑指南:如何用scIB正确处理批次效应(附真实数据集案例)
  • Android Safety 系列专题【总篇:安全机制汇总】
  • oapi-codegen合规性:生成SOC2/ISO27001审计代码
  • RPA-Python与Netlify集成:现代网站托管自动化终极指南
  • ParadeDB与C集成:使用Npgsql实现搜索功能的完整指南
  • BioLogic_STM32:面向Blue Pill的裸机I/O控制库
  • FileZilla Server安装避坑指南:从NAT穿透到被动模式设置
  • 云容笔谈在自媒体落地:日更国风头像/壁纸/配图,提效300%内容生产
  • 专利分析必备!用Selenium自动化下载国家知识产权局年报Excel(2008-2023完整数据集)
  • BootstrapBlazor水波纹按钮:打造令人惊艳的点击交互效果
  • DeepSeek-V3.1 FP8量化技术解析:UE8M0数据格式应用
  • Splitflap串行通信协议详解:从文本模式到Protobuf二进制协议