进程学习--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等回收进程,前者是阻塞等待任意子进程结束,后者可以设定等待对应子进程已经等待方式。

相关推荐
thesky1234561 分钟前
活着就好20241225
学习·算法
职业考试资料墙1 小时前
水利水电安全员考试题库及答案
学习·考试·题库
MUTA️1 小时前
RT-DETR学习笔记(2)
人工智能·笔记·深度学习·学习·机器学习·计算机视觉
炭烤玛卡巴卡2 小时前
初学elasticsearch
大数据·学习·elasticsearch·搜索引擎
oneouto2 小时前
selenium学习笔记(一)
笔记·学习·selenium
张铁铁是个小胖子2 小时前
MyBatis学习
java·学习·mybatis
我曾经是个程序员2 小时前
鸿蒙学习记录之http网络请求
服务器·学习·http
m0_748232392 小时前
WebRTC学习二:WebRTC音视频数据采集
学习·音视频·webrtc
虾球xz4 小时前
游戏引擎学习第55天
学习·游戏引擎
oneouto4 小时前
selenium学习笔记(二)
笔记·学习·selenium