
进程控制块(PCB)详解一、PCB的概念进程由内核数据结构和代码数据两部分组成。其中内核数据结构就是PCB(进程控制块)在代码中体现为task_struct结构体。该控制块存储了进程的关键控制信息。1.2 PCB的内容PCB主要包含以下信息标识符唯一标识进程的PID(进程ID)可通过getpid()函数获取(需包含sys/types.h头文件)状态记录进程当前状态包括运行态(代码正在CPU执行)阻塞态(等待硬件I/O完成)挂起态退出代码和信号优先级相对于其他进程的执行优先级程序计数器存储下一条待执行指令地址的寄存器内存指针指向程序代码、进程数据和共享内存区域的指针上下文数据进程运行时处理器寄存器中的数据。当时间片用完时未执行完的进程状态会被保存到寄存器中I/O状态信息包括I/O请求、分配的I/O设备和使用的文件列表记账信息处理器时间、时钟数、时间限制等统计信息进程调度采用时间片轮转机制。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是这个进程的可执行程序在哪里这个工作的目录可以自己改用fopenfile.txt或用fork创建新的文件进程时会自动在当前文件夹创立会自动以当前进程二进制文件的工作路径中创建如何更改进程的工作路径系统调用int chdirconst 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分别存储在不同地址空间最终会进行转换映射。