文章目录
- 问题引入
- 操作系统宏观认识
- 操作系统与进程
- 程序地址空间
- 进程地址空间
- 问题解释
问题引入
在Linux操作系统中、vim编译器下,出现了变量同地址但不同值的现象。
下面以解释该现象产生的原因为主线,在过程中学习Linux操作系统的知识。
运行代码展示:
运行结果展示:
操作系统宏观认识
操作系统是什么?
操作系统是一个专注于“管理“功能的软件。
管理的对象是什么?
资源。
操作系统与进程
什么是进程?
课本概念:程序的一个执行实例,正在执行的程序等。
内核观点:担当分配系统资源(CPU时间,内存)的实体。
详细介绍
操作系统是如何管理进程的?
先描述再组织。
描述:用名为PCB(process control block)的struck结构体记录进程的基本信息,在Linux中描述进程的结构体叫做task_struct。
组织:用如链表的的数据结构组织起来。
操作系统创建系统的过程
- 分配进程控制块(PCB):操作系统为新进程分配一个独立的PCB,用于存储进程的相关信息。
- 分配地址空间:操作系统为新进程分配一段内存空间,用于存储进程的代码、数据和堆栈等信息。
- 加载程序:操作系统将进程的可执行文件从磁盘或其他存储设备中读入内存,并将其复制到进程的地址空间中。
- 初始化进程:操作系统为新进程初始化一些必要的数据结构和变量,如文件描述符表、信号处理表等。
- 设置进程优先级:操作系统为新进程设置一个优先级,用于决定进程在系统中的调度顺序。
- 将进程加入就绪队列:操作系统将新进程加入就绪队列,等待CPU分配资源并执行
程序地址空间
Linux验证地址空间分布图:
进程地址空间
什么是虚拟内存?
虚拟内存是一种计算机内存管理技术,它允许操作系统将物理内存和磁盘空间组合使用,从而扩展可用内存的大小。虚拟地址空间通过页表映射到物理内存或者磁盘上。当进程需要访问某个页面时,操作系统会从磁盘读取到物理内存中,然后将该程序地址空间的虚拟地址映射到物理地址,使得进程可以访问该页面。当物理内存不足时,操作系统会将一些不常用的空间,从物理内存中换出到磁盘上,从而腾出空间给其他进程使用。虚拟内存技术可以提高系统的内存利用率,使得多个进程可以同时运行,而不会因为内存不足而导致系统崩溃。
虚拟内存存在的意义?
- 扩大可用内存空间:虚拟内存可以将磁盘空间作为扩展内存使用,从而扩大了可用内存空间。这样,即使物理内存不足,也可以运行更多的程序。(因为页表可以映射外存)
- 提高程序运行效率:虚拟内存可以将不常用的内存数据暂时存储到磁盘上,从而释放物理内存空间,让更常用的数据可以被加载到内存中,提高程序的运行效率。(由于页表的存在,在进程视角,内存中分配的空间是有序的)(有些分配了内存也不会立刻使用,虚拟内存的存在就提高了实际内存的使用效率)
- 保护系统稳定性:虚拟内存可以将程序的内存空间隔离开来,防止程序之间相互干扰,从而保护系统的稳定性。(物理内存是一个硬件,既可以读也可以写(虚拟内存只可以读),在物理内存的设计下,如果进程1中出现野指针那么有可能实际访问到其他进程的内容,如果其他进程中存有密码类的东西,那么这样就是不安全的,直接使用物理内存缺点很多,可以查查。)
- 实现内存共享:虚拟内存可以实现内存共享,多个进程可以共享同一块内存空间,从而减少内存的使用量,提高系统的效率。
什么是写时拷贝?
写时拷贝(Copy-on-write,简称COW)是一种内存管理技术,它允许多个进程共享同一块内存,但只有在进程试图修改该内存时才会进行实际的拷贝操作。这种技术可以减少内存的使用量,提高系统的性能。
在写时拷贝的实现中,当一个进程试图修改共享内存中的某个数据时,操作系统会先检查该内存块是否已经被其他进程共享。如果是,则操作系统会为该进程分配一块新的内存,将原始内存块中需要修改的数据拷贝到新的内存块中,然后让该进程修改新的内存块。其他进程仍然共享原始内存块,直到它们也试图修改该内存块中的数据。
在C语言中malloc的是什么地址?
虚拟地址,malloc的空间被写入时,才会在物理空间上有实际的空间。
相关知识:操作系统在第一次构建页表时,并不会为进程分配实际的物理内存,而是只是为进程分配了虚拟地址空间。当进程第一次访问某个虚拟地址时,操作系统才会为该虚拟地址分配实际的物理内存。
地址空间在编译中也生效,编译时地址空间是指程序在编译时所使用的虚拟地址空间。
问题解释
frok创建进程时,再父进程中返回所创建的子进程的值,在子进程中返回了0,也就是说此时发生了写时拷贝(在子进程中写入了 = 0 )发生了写时拷贝,物理内存会重新分配一块地方作为新的虚拟内存,也就是说,这里两个地址相同的变量,只是虚拟内存的地址相同,实际物理地址并不相同。