程序员的自我修养 学习笔记(4)

news/2024/7/20 12:41:06 标签: 操作系统, 数据结构与算法, 内存管理

        可执行文件只有装载到内存以后才能被CPU执行。程序就将是菜谱,CPU就像是厨师,计算机的其他硬件就像是厨具,整个炒菜的过程就是一个进程。同样的一份菜谱,不同人可以做出来不同的味道。这个类比真是巧妙。

    Linux下面,进程最大使用3G的虚拟空间

    Windows下面,进程最大使用2G的虚拟空间

 

现在计算机,配置超过4G的内存的电脑已经不是不可能了,在这种情况下,32位CPU能够访问到大于4G的空间吗?如果此空间指的是虚拟地址空间,由于32位CPU的指针只能是32位,最大寻址范围是0~4GB。如果此空间指的是实际内存空间,Intel的Pentium Pro CPU采用36位物理地址,可以访问高达64G的物理内存,这种机制叫做PAE(Physical Address Extension)。

    覆盖装入(Overlay):程序员必须手工将程序分割成若干块,然后编写一个小的辅助代码来管理这些模块何时应该驻留内存、何时应该被替换掉。

    页映射(Paging):是虚拟存储机制的一部分。

 

创建一个进程:

1. 创建一个独立的虚拟地址空间

2. 读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系

3. 将CPU的指令寄存器设置成可执行文件的入口地址,启动运行

 

 

静态链接存在空间浪费和更新困难两个因素。

1. 如果每个程序都静态链接,那么在多个程序执行时,就会存在很多冗余的副本

2 如果静态链接库中有某一个模块更新了,那么所有基于此库的程序都要重新编译、下载更新一次,对用户来说非常不方便。

解决这个问题的方法,是动态链接。要做到动态链接,就要把程序的模块相互分割开来,形成相互之间较独立的文件,而不再将它们静态地链接在一起,简单的讲,在程序编译时,不进行链接,在实际运行时,才进行链接。

       共享对象在编译时,不能假设自己在进程虚拟地址空间中的位置,可执行文件基本可以确定自己在进程虚拟空间地址中的起始位置,因为可执行文件往往是第一个被加载的文件,它可以选择一个固定空闲的地址,比如Linux下,一般是0x8040_0000,WIndows下面一般是0x0040_0000

    malloc申请的内存位于堆空间内。malloc是怎么实现的呢?从简单的思路来想,把进程的内存管理全部交给操作系统内核来处理,操作系统提供系统调用,供程序申请堆内存使用。简单是简单,考虑到堆申请操作比较频繁,系统调用开销较大,效率不高,因此,需要改进。怎么改进呢?

      书中给出了一个很好的类比,程序向操作系统”批发”一块较大的堆空间,由运行库来管理“批发来的”堆空间,对于同一个商品,只能暂时借给一个客人,存放商品的货柜是一一对应的,哪儿借出的商品,归还时,就还到哪里去(从1号仓库中借出的商品,归还时要还到1号仓库中去),一个借出对应一个归还,不能乱套,不能有借无换。

     Linux下的堆管理,系统提供了两个系统调用接口,brk和mmap。

brk的原型为: int brk(void* end_data_segment)

       实际作用是设置进程数据段的结束地址(可以扩大和缩小数据段),增大结束地址,增大的那部分空间就可以被我们作为堆空间来使用。

mmap,向操作系统申请一段虚拟地址空间,这段空间可以映射到某个文件,此时,称为文件映射。如果映射到其他地方,则称为匿名空间,可以作为堆使用。

mmap原型:void *mmap(

void* start,                     //申请空间的起始地址(设为0,则自动选择)

size_t length,                 //申请空间的长度

int prot..                       //申请空间的权限

int flags,                      //映射类型(文件映射、匿名空间等)

int fd,                          //用于文件映射的指定文件描述符和文件偏移

off_t offset);

 

Windows的进程,将地址空间分配给了各种EXE、DLL文件、堆、栈。每个线程的栈都是独立的,一个进程中有多少个线程,就应该有多少个对应的栈。对于WIndows来说,每个线程默认的栈大小是1MB。

堆管理算法:空闲链表、位图分配,对象池(假设每次请求的都是一个固定的大小)。在很多现实应用行,堆分配算法往往是采取多种算法复合而成的。比如,对于glibc来说,小于64个字节的空间,采用的类似于对象池的方法,对大于512字节的空间申请,采用的最佳适配算法,对于大于64个字节而小于512个字节的,它会根据情况采取最佳折中策略。对于大于128K的申请,会使用mmap机制向操作系统来申请。

转载于:https://www.cnblogs.com/cherishui/p/3784702.html


http://www.niftyadmin.cn/n/1477270.html

相关文章

企业级部署(目录)

docker docker的基础命令与用镜像快速搭建小游戏、nginx和交互式ubuntu 制作一个docker镜像并且优化镜像大小 docker创建远程连接的私有仓库 docker-compose实现nginx负载均衡 docker的swarm高可用集群的搭建 docker的Kubernetes(k8s)集群搭建 zabbix监…

编程的理论深度

学校教算法分析和设计么?教计算理论么?教数理逻辑么?教信息理论么?教编程语言么?所谓的编程语言课,不是Java类库大全,Struts/JSF /Spring速成一类的职业培训,而是深入编程原理的基础…

mysql union 分区_MySQL:union all与union区别详解

union 是对数据进行并集操作,不包括重复行,同时进行默认排序Union all 是对数据进行并集操作,包括重复行,不进行排序举例说明:创建数据库表:CREATE TABLE t_demo (idint(32) NOT NULL,name varchar(255) DE…

复选框操作

<script>$(function () {//查找idtab的表格&#xff0c;下面所有的tr&#xff0c;下面的所有td&#xff0c;第一个td下面复习框的点击事件。$("#tab tr>td:nth-child(1)").find("input[typecheckbox]").bind("click", function () {if …

xampp不能启动mysql_xampp无法启动mysql的问题

请问&#xff0c;xampp, mysql无法启动还可能有什么原因&#xff1f;已排除&#xff1a;1.端口被占用问题&#xff1b;2.默认3306端口并没有被占用&#xff1b;3.删除xampp\mysql\data\下的ibdata1再重启&#xff1b;4.没装其他mysql。多谢。log如下&#xff1a;2015-12-04 12:…

FireMonkey 源码学习(1)

FireMonkey采用了与VCL不同的机制&#xff0c;很多基础类已经重新编写了&#xff0c;好在一如既往地提供了源代码&#xff0c;故此有机会学习一下。 一、图形引擎 FireMonkey采用了纯图形化技术解决可视化控件&#xff0c;而不是使用Windows控件作为基础。FireMonkey所使用的图…

vscode 跳转对应的js_还以为 VSCode 是程序员专属的工具?那你可太小看它了

如果你知道 VSCode&#xff0c;一说起它&#xff0c;你可能第一个想到的就是把它当做一个代码编辑器&#xff0c;而它的界面应该可能大概率是这样的&#xff1a;如果你恰好又是个程序员&#xff0c;那你可能经常会用到它&#xff0c;不管是 Python、JS 还是 C 等各种语言对应的…

[2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !

n a^o7 !题目&#xff1a;http://acm.sdut.edu.cn/sdutoj/problem.php?actionshowproblem&problemid2413 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述All brave and intelligent fighters, next you will step into a distinctive battleground which is full …