菜鸟笔记
提升您的技术认知

菜鸟教程

rapidjson 构造数组将函数实现放在头文件中RapidJSON解析和生成Json绝对路径和相对路径gcc 优化选项 -O1 -O2 -O3 -Os 优先级Python求一个整数位数的方法python中判断数字位数的几种方法python计算分位数查看hive的版本如何查看hadoop的版本elasticsearch查看所有indexsublime 列模式 列编辑shell遍历目录下所有文件http-parser解析http报文详解supervisor守护工具配置lnmp为已有站点手动更新ssl证书记录java 最长回文、最长回文子串ssh免密码登录为Linux内核开启BBR加速frp服务开机自启x86架构下,页面大小为什么是4K?如何限制对象只能建立在堆上或者栈上进程间通信的方式SyntaxError: Non-ASCII character '\xe5'TCP 连接半关闭问题ucontext 协程库代码分析python中yield的用法详解为PHP7.0安装redis扩展ucontext 简单协程库ImportError: No module named cv2的完美解决方法HashMap扩容全过程关于HashMap常见面试考点(底层原理+扩容机制)DOS批处理中的字符串处理详解(字符串截取)Linux下如何查找.sh后缀的文件core文件出现“is not a core dump: File format not recognized”的原因和解决方法(看/proc/pid/limits)记一次docker问题定位(perf,iostat等性能分析)Protocol Buffers 2.5.0 安装python 使用thrift序列化与反序列化对象PHP的base64_decode乱码linux中后台运行 java -jarLinux常用命令--文件搜索Linux常用命令--文件基础操作与文件权限变更Linux常用命令--软件包管理之(RPM包管理)Linux常用命令--文件编辑与查看Linux常用命令--文件压缩与挂载Linux常用命令--系统管理Linux常用命令--系统管理之(用户管理、用户组管理)Linux常用命令--系统管理之(进程管理、定时任务、系统监控)Linux常用命令--软件包管理之(服务管理)Linux常用命令--软件包管理之(yum与源码包安装)Linux初窥:Linux下SSH免密码登录配置如何查看CentOS7的版本信息Linux环境变量文件介绍Linux下Tomcat的安装与配置CentOS解决-bash: vim: command not found10 个提高效率的 Linux 命令别名shell比较浮点数和整数crontab 30秒执行一次Python中字典合并的四种方法shell查看CPU 硬盘 内存使用率Python 四大主流 Web 编程框架python:web后台框架简单实现如何使用 BRPC Dummy Serverlist、vector使用erase()时需要注意的地方——迭代器失效容器删除元素后迭代器失效_STL源码剖析——vector容器STL的erase()陷阱-迭代器失效总结.bashrc中定义实用的别名和函数

x86架构下,页面大小为什么是4K?

阅读 : 181

前提:32位逻辑空间的计算机OS,两级页表,每个页中每个条目占4bytes,即32位的数据
以上前提是目前X86架构的32为系统的真实情况;

设页大小为X(byte),则X/4为每个页可以存取的条目的个数,两级页表的地址转换关系如下图所示:

假设在一个32位的条目中存放此内存的地址,则2*log2(X/4)就是图1中,p1+p2的位数;

2^(p1 + p2):系统可以寻址多少个页面
(X / 4)^2:前两级页表共可以选择多少entry,因为第一级页表entry个数为4,第二级相同;

系统可以寻址的页面数目 = 前两级页表共可以选择多少entry,即2^(p1 + p2) = (X / 4)^2====>2*log2(X / 4) = p1 + p2;

此外:如果页大小为X,那么为了偏移量能够寻址所有的X位,需要:2的d次方 = X,即log2(X) = d;

由图可知p1 + p2 + d = 32,即2*log2(X / 4) + log2(X) = 32====>X = 4096,即页的大小为4096bit = 4K;

以上只是硬件在最充分利用资源情况下的方式,有人说为什么其他大小的页面(如8k)不行?不是不行,是这么做就是傻x,为什么?解释如下:

前提如上面所述,如果页面大小是8k,d就必须等于13(2^13=8k),p1+p2=19;
此时每个entry还是4B,则每个页面共有entry=8K/4B=2048个;
假设用p2寻址2048个entry,则p2=11,此时p1=8;
问题来了,p1=8,则第一级页表只能寻址2^8=256个entry,此时第一级页表就有2048-256=1792个entry不能使用,这是多大的资源浪费???!!!

当然系统其他地方开销是需要平衡的,所以4K是一个综合评价后的结果,但是以后的大型系统,内存可能上升到T级别,到那时再用4K页就是傻X,目前ARM v8 64位的Linux中,大内存情况下2M是比较合理的,而且OS中对其支持的很完美;