进程 映像

进程映像

程序就是存储在磁盘上的可执行文件,当程序运行时,系统会将可执行文件加载到内存中,从而在内存中形成进程(一个程序可以同时加载出多个进程)

进程在内存空间中的分布情况就是进程映像,从低地址到高地址依次分布为:
    text    代码段(只读段) 二进制指令、常量(字符串字面值、const修饰过的
    					原data段的数据),修改会产生段错误
    data    数据段      初始化过的全局变量和静态局部变量
    bss     静态数据段  未初始化过的全局变量和静态局部变量
                        该段内存开始前会被清理为0
    heap    堆  体量较大的数据,例如结构变量
                手动管理、释放时间可控,足够大,需要与指针配合使用
                使用麻烦,可能会产生内存碎片和内存泄漏
    stack   栈  局部、块变量
                自动分配、释放内存,不会产生内存碎片、内存泄漏
                大小很有限,释放时间不可控
    environ 环境变量表 环境变量
                每个进程都有一份,修改不会影响其他进程  
    argv    命令行参数 程序执行时附加的参数
变量的分类:
存储位置、生命周期、作用范围:

        全局变量:定义在函数外
            data或者bss
            从程序运行开始到程序结束
            任何位置都能使用
            
        局部变量:定义函数内
            stack
            从定义的位置开始到函数结束
            只能在函数内使用
            
        块变量:定义在if\for\while等语句块
            stack
            从定义的位置开始到函数结束
            只能在语句块内使用
        
        注意:全局变量、局部变量、块变量是可以同名的,局部变量会屏蔽全局变量,块变量会屏蔽全局变量、局部变量
        建议全局变量首字母大写
类型限定符
    auto    用于定义自动申请、释放内存的变量,不加就代表加
            不能在全局变量前使用,不能与static同时使用
            
    extern  声明外部的全局变量
            当a.c中定义一个全局变量,b.c中如果想要使用该全局变量,则需要用extern声明一下
            extern 声明只能暂时瞒过编译阶段,如果链接时找不到该变量的定义语句,依然还是会报错的
            
    static
        限制作用域
            改变全局变量、函数
        改变存储位置
            局部变量、块变量,由stack改为data或者bss
        延长生命周期
            局部变量、块变量,不会被自动销毁,它们的初始化语句只能是第一次使用时有效
            void func(void)
            {
                static int num = 0;
            }
            
    const  用于"保护"变量不被显示地修改
            初始化过的全局变量和静态局部变量被const修饰后,存储位置从data改成了text,就成为了常量,再强制修改会产生段错误
            
    volatile
            如果变量没有显示地修改,再使用变量时会继续使用上一次从内存中读取到的结果,
            而不会重新读取(编译器的取值优化)
            有些变量可能会被隐式地修改,要想随时正确地获取到该变量的值,则需要用volatile来修饰
            在硬件编程、多线程编程中使用       
                     
    register
            申请把变量的存储位置从内存改为寄存器,这样能够提高变量的读写速度,从而提高程序运行的速度
            由于寄存器稀少,申请不一定能成功
            注意:这种变量不能取地址 &
            
    typedef
            类型重定义,当定义变量时,使用typedef,变量名就变成了这种类型
            typedef int num;  num == int
            常用的size_t time_t uint8_t 都是类型重定义
            注意:不是替换
### 进程进程映像的区别和联系 #### 区别 1. **定义不同** - 进程是程序在处理机上的一次执行活动,具有动态性、并发性和独立性等特点[^1]。 - 进程映像是指某个时刻进程的内容,包括代码段、数据段、堆栈段以及进程控制块(PCB)等信息[^2]。 2. **存在形式不同** - 进程是一个动态的概念,表示程序的运行状态,其生命周期从创建到终止不断变化[^3]。 - 进程映像则是静态的,是对某一时刻进程内容的快照,记录了进程在该时刻的所有信息[^1]。 3. **功能不同** - 进程负责程序的实际执行,涉及资源分配、调度和通信等功能[^4]。 - 进程映像主要用于描述进程的状态,帮助调试、分析或恢复进程状态[^2]。 #### 联系 1. **进程映像进程的一部分** - 每个进程在运行过程中都会有一个对应的进程映像,它包含了进程的所有必要信息,如程序代码、数据、堆栈和寄存器值等。 2. **进程映像反映了进程的状态** - 通过查看进程映像,可以了解进程当前的执行情况,例如正在执行的指令、使用的数据以及内存分布等。 3. **进程进程映像同步更新** - 随着进程的执行,其内容会不断变化,进程映像也会随之更新以反映最新的状态[^1]。 ```python # 示例:简单模拟进程及其映像 class Process: def __init__(self, pid, code, data): self.pid = pid # 进程ID self.code = code # 程序代码 self.data = data # 数据段 self.stack = [] # 堆栈段 def get_process_image(self): return { "pid": self.pid, "code": self.code, "data": self.data, "stack": self.stack } # 创建一个进程 p = Process(pid=1, code="print('Hello World')", data={"message": "Hello World"}) # 获取进程映像 process_image = p.get_process_image() print(process_image) ``` #### 总结 进程是一个动态的概念,代表程序的执行过程,而进程映像则是静态的,用于描述进程在某一时刻的具体内容。两者相辅相成,共同构成了操作系统对程序执行的管理机制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值