C++学习之系统I/O文件操作

您所在的位置:网站首页 安卓文件data文件访问限制 C++学习之系统I/O文件操作

C++学习之系统I/O文件操作

#C++学习之系统I/O文件操作| 来源: 网络整理| 查看: 265

一、进程映像     程序是存储在磁盘上的可执行文件(二进制文件、脚本文件)     当执行程序时,系统会自动将该文件加载到内存中,在内存中的分布情况称为进程映像     从低地址到高地址的分区:         text:代码段         data:数据段         bss:静态数据段         heap:堆         stack:栈,数组的话整体往下,成员往上         environ:环境变量表         argv:命令行参数 总结: 1、栈内存的增长方向受操作系统影响,大部分是从高地址向低地址增长,但也有些系统,例如Ubuntu就是从低地址向高地址增长* 2、如果是栈内存存储数据,数组元素的增长方向一定是从低地址向高地址         ps -aux 查看当前所有进程的详细信息,可以查看进程号,要程序一直运行,死循环

作业:打印出每个内存段中的数据所在的地址,然后与该进程的内存信息记录文件中的地址对比         /proc/进程号/maps

二、虚拟内存:     1、操作系统会为每个进程分配4G虚拟内存**8个1,4096MB     2、用户只能使用虚拟内存,不能直接使用物理内存     3、虚拟内存要与物理内存进行映射后才能被用户使用,虚拟内存经过内核到物理内存,如果使用了没有映射的虚拟内存(段错误)就会产生段错误     4、虚拟内存与物理内存的映射由操作系统(MMU)动态维护     arr[10],实际内存不一定连续     5、虚拟内存能让系统使用更安全,不会暴露真实的物理内存地址,另一方面,操作系统可以让进程使用比实际物理内存更大的地址空间     6、4G的虚拟内存地址分为两个部分        [0G~3G) 用户空间        [3G~4G) 内核空间     7、当进程/线程运行在用户空间时称进程处于用户态,当进程/线程运行在内核空间时称进程处于内核态     8、当进程处于内核态时,进程运行存储使用在内核空间,此时CPU可以发出任何指令,运行的代码不受任何限制,可以自由的访问任意有效的地址,也可以直接访问接口     9、当进程处于用户态时,进程运行存储在用户空间此时被执行的代码要受到CPU很多的检查,例如用户进程只能访问自己映射过的虚拟内存     10、所有进程的内核空间的代码数据都是映射在同一块物理内存中,由内核负责维护     11、用户空间的代码不能直接访问内核空间的代码和数据,可以通过系统调用(API调用系统接口函数)来切换到内核态间接的访问内核、与内核交换数据

映射虚拟内存与物理内存的函数:     sbrk/brk/mmap/munmap     关于malloc获区虚拟内存空间的底层实现,跟libc.so版本有关     大概逻辑:1、如果分配的内存小于128k时,调用sbrk、brk              2、如果大于128k时,调用mmap,munmap              注意:系统映射内存是以页(一页=4096字节)为最小单位的              注意:sbrk、brk底层共同维护一个映射位置指针,该指针指向映射过的内存的下一个位置,或者说是未映射的内存的第一个位置              sbrk:                        void *sbrk(intptr_t increment);              sbrk(4)/sbrk(-4)              功能:通过increment参数调整映射位置指针的位置,既可以映射内存也可以取消映射              increment:按字节为单位                  0  获取当前指针的位置                  >0 映射内存                  原来位置指针的位置  映射内存                



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3