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

进程学习--02

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

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

http://www.lryc.cn/news/319767.html

相关文章:

  • 简易版 RPC 框架实现 1.0 -http实现
  • 欧科云链做客Google Cloud与WhalerDAO专题论坛,畅谈Web3数据机遇
  • 计算机网络 TCP协议的流量控制
  • 【基于HTML5的网页设计及应用】——改变文字和背景颜色
  • 面向对象编程第三式: 多态 (Java篇)
  • [数据集][目标检测]草莓成熟度检测数据集VOC+YOLO格式412张3类别
  • 浅谈HTTP 和 HTTPS (中间人问题)
  • JAVA八股文面经问题整理第3弹
  • python 爬取人民新闻
  • 蓝桥杯刷题(九)
  • 【NTN 卫星通信】 车辆物联网设备通过NTN和TN切换的应用场景
  • html5cssjs代码 014 布局框架
  • [EFI]Lenovo Ideapad 530S-14IKB电脑 Hackintosh 黑苹果efi引导文件
  • FFmpeg-aac、h264封装flv及时间转换
  • TCP并发模型 || select || poll || epoll
  • 【开源】SpringBoot框架开发房屋出售出租系统
  • STM32的简单介绍
  • 浏览器同源策略及跨域问题
  • 【读书笔记】知识图谱概述
  • 用尾插的思路实现 “合并两个有序链表”
  • 大数据 - Spark系列《十四》- spark集群部署模式
  • 考研C语言复习进阶(2)
  • 设计模式学习笔记 - 设计原则与思想总结:1.总结回顾面向对象、设计原则、编程规范、重构技巧等知识点
  • WPF图表库LiveCharts的使用
  • 第十三届蓝桥杯省赛C++ C组《全题目+题解》
  • Linux——线程池
  • Linux:搭建ntp服务器
  • unity学习(57)——选择角色界面--删除角色2
  • Flutter:构建美观应用的跨平台方案
  • 【深度学习模型移植】用torch普通算子组合替代torch.einsum方法