进程学习--02

在C语言中,一般使用fork函数开辟进程,这个函数开辟进程后会返回一个进程号,在子进程中会返回0,在父进程中会返回子进程的进程号。

cpp 复制代码
int main(){
    int ret = fork();
    if(ret<0){
        fprintf(stderr, "pid error");
        exit(-1);
    }
    else if(ret == 0){
        printf("this is son\n");
    }
    else if(ret>0){
        printf("this is father, son's pid is %d\n", ret);
    }
    return 0;
}
bash 复制代码
this is father, son's pid is 2700
this is son

因为父进程为原始进程,而子线程需要新开辟,所以一般情况下父进程总是先进行下一步。

fork() 被调用时,父进程和子进程共享相同的物理内存页,直到其中一个进程尝试修改这些页。当修改发生时,操作系统会为该页创建一个新的物理内存副本,并更新相应的页表,以确保每个进程都有自己的私有内存空间。这种技术大大减少了 fork() 的开销,因为大多数时候,子进程会立即执行 exec() 替换其内存映像,而无需修改父进程的内存。

有开始就有退出,程序除了自然退出还可以使用exit和_exit函数退出。_exit直接使进程终止,清除其使用的内存空间,并清除其在内核中的各种数据结构。exit是在_exit上进行的封装,在此之上还增加了清理IO缓存等功能。

在进程结束后往往需要回收进程,如果不回收进程,可能会导致一系列问题。在操作系统中,每个进程都会占用一定的系统资源,包括内存、CPU时间片等。当进程结束时,如果不进行回收,这些资源可能不会被正确释放,导致资源泄漏。资源泄漏会逐渐耗尽系统资源,影响系统的稳定性和性能。

在Linux操作系统中,当进程结束时,操作系统会自动回收其占用的资源,确保系统资源的有效利用和管理的有效性。当一个进程正常或异常终止时,它会关闭所有打开的文件描述符,并释放其在用户空间分配的内存。这是进程在退出时自动完成的操作。然而,此时进程的进程控制块(PCB)仍然存在于内核中,其中保存了进程的状态信息,如退出状态、终止信号等。为了彻底清除进程并释放其占用的所有资源,需要其父进程进行回收操作。通过调用这些函数,父进程可以获取子进程的PCB信息,并进行清理工作,包括释放PCB占用的内存等。

PCB是操作系统为管理进程而设置的一个专门的数据结构,用于记录进程的外部特征并描述其运动变化过程。它是系统感知进程存在的唯一标志,进程与PCB是一一对应的。PCB的大小取决于操作系统的实现和支持的功能,不同的操作系统和不同的进程可能有不同的PCB大小。PCB中主要包括以下信息:pid(进程标识符),进程状态,程序计数器(PC,用于记录下一条要执行的指令地址),寄存器值(保存进程在执行过程中的寄存器值),内存管理信息(记录进程的内存分配情况,包括代码段、数据段、堆栈等),文件描述符表,优先级,父进程标识符(PPID),子进程列表,信号处理器。此外,PCB还可能包含进程的控制信息,如进程当前状态、程序的外存地址、运行统计信息、进程间同步和通信等。以及资源管理信息,如占用内存的大小、输入/输出设备的设备号、缓冲区地址等。

如果父进程没有回收子进程,子进程将成为僵尸进程。僵尸进程是一个已经终止但尚未被父进程回收的进程,它仍然占用进程表中的一个条目。为了避免僵尸进程的产生,通常建议在父进程中正确处理子进程的退出,并及时回收它们。当然如果父进程在子进程之前退出,子进程将成为孤儿进程。孤儿进程会被init进程(PID为1的进程)接管,并由init进程负责回收其资源。这是Linux系统的一种保护机制,确保即使父进程异常退出,子进程也能得到正确的处理。

在Linux系统中我们可以使用ps来方便的查看进程的相关信息,ps -aux:

在C程序中一般使用wait和waitpid等回收进程,前者是阻塞等待任意子进程结束,后者可以设定等待对应子进程已经等待方式。

相关推荐
星火开发设计14 小时前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
Gorgous—l14 小时前
数据结构算法学习:LeetCode热题100-多维动态规划篇(不同路径、最小路径和、最长回文子串、最长公共子序列、编辑距离)
数据结构·学习·算法
Hello_Embed15 小时前
libmodbus 移植 STM32(基础篇)
笔记·stm32·单片机·学习·modbus
●VON16 小时前
Flutter for OpenHarmony 21天训练营 Day03 总结:从学习到输出,迈出原创第一步
学习·flutter·openharmony·布局·技术
香芋Yu16 小时前
【大模型教程——第四部分:大模型应用开发】第1章:提示工程与上下文学习 (Prompt Engineering & ICL)
学习·prompt
LYS_061816 小时前
寒假学习10(HAL库1+模数电10)
学习
runningshark16 小时前
【项目】示波器学习与制作
学习
€81116 小时前
Java入门级教程24——Vert.x的学习
java·开发语言·学习·thymeleaf·数据库操作·vert.x的路由处理机制·datadex实战
自可乐17 小时前
n8n全面学习教程:从入门到精通的自动化工作流引擎实践指南
运维·人工智能·学习·自动化