【Chapter7*重点总结*】深入进程环境的三大重点:启动与终止、存储空间布局、存储空间分配、

本文探讨了进程启动(通过exec家族函数,C启动例程调用main函数)与终止(exit、_exit和_Exit函数)的过程,并详细解析了C程序的存储空间布局,包括代码段、数据段、bss段、堆和栈。同时,介绍了动态内存分配及其管理,如malloc和free函数的使用。
摘要由CSDN通过智能技术生成

写在前面
前两天刚从外面旅游回来,旅游之前已经把进程环境搞的差不多清楚了,这几天又往后理解了进程的几个控制原语。要想了解进程是如何执行的,进程环境必须搞清楚。接下来,将根据提出的问题深入的挖一挖。

一、四个问题

我们平时一直使用shell的./来运行一个程序,那大家有没有想过,这个程序到底怎么被运行的呢?有几个问题,总结一下:

1、一个进程如何运行,main函数怎么被调用,程序又如何终止?
2、进程如何得知命令行参数和当前环境变量?
3、典型的C程序存储空间布局是怎么样的?(虚拟地址空间)
4、用户能否申请分配存储空间?

接下来,我们就一个个的分析。

二、进程的启动和终止

废话不多说,先上图!
在这里插入图片描述

2.1 进程启动

程序启动只有一种方式,就是通过exec家族函数(7个),内核通过exec先调用一个特殊的启动例程,也就是C启动例程。C启动例程再调用main函数执行,main函数再可以调用用户函数。

这样就可以了吗?看问题2,命令行参数和环境变量又是如何传递过去的呢?答案很简单,exec函数中本身将这两个参数传递给C启动例程,这样,一个程序就可以通过exec在指定的环境中接收到命令行参数执行了,一个程序有一张对应的环境表,可以使执行该程序的环境,也可以是指定的环境变量,具体参见exec函数的用法。

2.2 进程终止

进程的终止至少有三种方式:exit、_exit和_Exit函数

_exit和_Exit直接返回给内核,exit先自动执行终止处理程序,在执行标准I/O清理程序,最后调用_exit/_Exit返回给内核。终止处理程序是由用户使用atexit函数登记的,登记的顺序和执行的顺序是相反的(栈结构)。

进程在运行时,C启动例程和main函数,main函数和用户函数之间均有调用和返回。也就是说,main函数和用户函数均可以终止程序,也可以交由C启动例程终止程序。

进程自愿终止的方式是显示或者隐式(exit)调用_exit/_Exit函数,也可由一个信号被迫终止运行。

三、C程序存储空间布局

典型的存储空间布局包括以下的几个段:代码段(正文段)、数据段、bss段、堆、栈、堆栈之间是共享库内存映射。
在这里插入图片描述

正文段:从磁盘读入,只读,共享的(频繁执行的程序如文本编辑器,C编译器和sheell等),在存储器中只有一个副本。
数据段:确切的说是初始化数据段,从磁盘读入,一般是有初值的全局变量或者静态变量
bss段:未初始化数据段,一般是未初始化的全局变量或者静态变量,exec函数将初始化为0或者空指针。
:保存自动变量,局部变量以及函数调用时需保存的信息(例如返回地址信息,调用者环境信息,某些寄存器的值),每调用一个函数,都会为其自动变量和临时变量分配一个栈帧。这样保证,不同栈帧之间的变量值没有影响。
:用于动态存储空间分配
共享库:使用共享库,程序中不需要包含公用的库函数,只需在所有进程都可引用的存储区中保存这种库例程的一个副本。程序第一次执行时,用动态链接的方法将程序与共享库函数链接。

四、动态内存分配

用户可在堆上申请分配动态空间,堆的大小<3G的。一共是4G内存,内核会占用1G多,所以用户可申请的空间是<3G的。

可使用malloc、calloc、realloc函数申请,但一定要使用free函数释放

泄露:一个进程使用malloc函数申请分配空间,但一直没有free掉,则进程所占存储空间在连续增加,这种情况称为泄露。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值