关于CPU位数,OS位数以及内存大小关系的一点总结
(这个学期做助教,说来好惭愧啊,虽然我也是考研进来的,但是就在两年前复习的资料居然全部都忘光了。对大二的孩子们提问的问题多半都解决不了!!!越来越觉得自己的学习方法有问题了,总是想着一些知识能够根据自己多看几遍印象就深刻了,或者说每次记忆知识时总是想下次再记在脑海里吧!这样导致很多东西必须看资料才能想起来:啊原来是这样的,我看过啊,我知道的啊!这样的陋习一定要赶紧改正了,每次学习一个新的知识,都要记在脑海里,深刻地理解一下!!!)
1. CPU位数:一个时钟周期内处理器处理的二进制位数。
CPU位数 = CPU中寄存器的位数 = CPU一次并行处理的数据宽度
CPU为了实现其功能一般设计了指令集,即是CPU的全部指令,这就是机器语言。计算机的所有功能都是基于CPU的指令集。
如Intel 8086 CPU 是16位,其指令集也是16位。如Intel 80386DX CPU 是32位,其指令集也是32位,但它也保持原16位指令集,这是为了向上兼容。
2. 操作系统位数
操作系统位数 = 其所依赖的指令集位数 <= CPU位数
操作系统位数对CPU位数有向上兼容,如32位CPU上运行16操作系统,64位CPU上运行32位操作系统等情况。
3. 内存容量与操作系统位数的关系。(有种说法是:32位操作系统最大只能支持4G内存)
在使用计算机时,其支持的最大内存是由操作系统和硬件两方面决定的。
在早期的PC机中,采用的是三总线结构:数据总线,地址总线和控制总线。分别来实现不同的功能:数据总线用来传输数据,地址总线用来传输地址,控制总线用来传输一些控制信号。但在现在的PC机中,一般使用了总线复用功能。如在PCI总线中,地址总线和数据总线总是分时复用的(也就是说假如PCI总线有32为数据总线,这32位数据总线在某个时刻传输数据,在下一个时刻却用来充当地址总线的作用)。
回顾了关于总线的一点知识后,先来说硬件方面对内存容量的控制作用。
在计算机中地址总线的数目决定了CPU的寻址范围,这种由地址总线对应的地址称为 物理地址。
先说一下硬件方面的因素,在上面已经提到了地址总线,在计算机中 CPU的地址总线数目 决定了CPU 的寻址范围,这种由地址总线对应的地址称作为物理地址。假如CPU有32根地址总线(一般情况下32位的CPU的地址总线是32位,也有部分32位的CPU地址总线是36位的,比如用做服务器的CPU),那么提供的可寻址物理地址范围 为 232=4GB(在这里要注意一点,我们平常所说的32位CPU和64位CPU指的是CPU一次能够处理的数据宽度,即位宽,不是地址总线的数目)。自从64位CPU出现之后,一次便能够处理64位的数据了,其地址总线一般采用的是36位或者40位(即CPU能够寻址的物理地址空间为64GB或者1T)。CPU访问任何存储单元必须知道其物理地址。
再说说物理地址,线性地址,逻辑地址的关系:
1) 物理地址(Physical Address): 刚刚讲过了,由CPU地址总线的位数决定。
2) 线性地址(Linear Address): 如果没有开启分页机制,线性地址就等于物理地址。如果开启了分页机制,线性地址到物理地址需要经过二级地址转换。线性地址可以很大,但最终要运行在物理地址上,而缺页机制和进程挂起等,就是为了让远比物理内存大的程序,运行在如此小的物理内存中。在网上看到一个例子,生动又形象:好比公交车上让座,假设座位是内存,其他站立空间是硬盘,刚上车的时候你很高兴,你和你女朋友(进程A,B)都有座位(进入内存),如果此时,有个孕妇上车了,售票员大姐(操作系统)发现了,"孕妇优先",于是开始问"谁给孕妇让个座啊"(进程调度),不过很不幸,这个系统是非抢占式的,孕妇(进程S)只好等待,作为一个有理想有道德的程序猿(优先级低),当仁不让,自己站了起来了(进程挂起),操作系统一看,有个家伙把座椅(内存)释放出来了,于是排队等候的孕妇就坐到了你原来的位置,你切换到公交地板上(硬盘)。车到某站,孕妇下车了,于是你重新坐上座位(内存占有),在公家车的整个运营过程中,座位(内存)是有限的,而人不不断上下,所以人上来首先站在车厢内,然后根据各种成文的,不成文的规矩,占有或者释放内存(座位)。座位是有限的,而人相对来说是无限的,怎么利用有限的资源,服务更多的进程,这或许是操作系统应该考虑的。
3) 逻辑地址(Logical Address): 指分段机制提供的地址,由段部分和一个便宜部分构成。段机制是虚拟地址到线性地址的基础。线性地址 = 段基址 + 偏移地址。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。
这三种地址关系为,逻辑地址经过段式映射(Segmentation Translation)到线性地址。线性地址经过页面映射(Page Translation)后,得到物理地址。
言归正传,再说说操作系统对内存容量的控制作用。
在上面中有提到,用户使用计算机时,直接操纵的只能是逻辑地址,要经过操作系统的转换后才能变换为物理地址。如对于32位的操作系统而言,其逻辑地址编码采用的地址位数是32位,那么操作系统所提供的逻辑地址寻址范围为:232 = 22 * 230 = 4GB(所以在32位CPU和32位的操作系统中,最大支持的内存为4G)。但是理论上是4G的内存,在我们真正使用时并不到4G,大约只有3.2G左右。这是因为在intel x86架构下,采用的是内存映射技术(Memory-Mapped I/O, MMIO),也就说将4GB逻辑地址中一部分要划分出来与BIOS ROM、CPU寄存器、I/O设备这些部件的物理地址进行映射,那么逻辑地址中能够与内存条的物理地址进行映射的空间肯定没有4GB了。
参考文献:
【1】http://blog.csdn.net/ray_zhang_3/article/details/5447140
【2】http://www.cnblogs.com/dolphin0520/archive/2013/05/31/3110555.html
【3】http://bbs.51cto.com/thread-1089741-1.html
【4】http://blog.csdn.net/macrossdzh/article/details/5954763
【5】http://laoxu.blog.51cto.com/4120547/1166661
【6】http://ilinuxkernel.com/?p=414
【7】http://blog.csdn.net/linpeng12358/article/details/41450805
关于CPU位数,OS位数以及内存大小关系的一点总结的更多相关文章
- ubuntu系统AndroidStudio修改内存大小
位于android-studio/bin目录下的studio64.vmoptions和studio.vmoptions文件. 把Xms,Xmx,-XX:MaxPermSize,-XX:Reserved ...
- ubuntu系统AndroidStudio改动内存大小
位于android-studio/bin文件夹下的studio64.vmoptions和studio.vmoptions文件. 把Xms,Xmx,-XX:MaxPermSize.-XX:Reserve ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- C#获取电脑型号、系统版本、内存大小、硬盘大小、CPU信息
摘要 有时需要获取电脑的相关信息.这时可以通过调用windows api的方式,进行获取. 方法 可以通过在powershell中 通过下面的命令进行查询,然后可以通过c#调用获取需要的信息. gwm ...
- 获取指定订阅下所有Azure ARM虚拟机配置(CPU核数,内存大小,磁盘信息)的使用情况
脚本内容: <# .SYNOPSIS This script grab all ARM VM VHD file in the subscription and caculate VHD size ...
- zabbix的安装(一)监控os资源:内存,cpu,io,负载,带宽
一.Linux下开源监控系统简单介绍1)cacti:存储数据能力强,报警性能差2)nagios:报警性能差,存储数据仅有简单的一段可以判断是否在合理范围内的数据长度,储存在内存中.比如,连续采样数据存 ...
- 计算Java对象内存大小
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型.锁原理 ...
- 每个内存大小:sudo dmidecode -t memory |grep -A16 "Memory Device$" |grep "Size:"
CPU: 型号:grep "model name" /proc/cpuinfo |awk -F ':' '{print $NF}' 数量:lscpu |grep "CPU ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
随机推荐
- Oracle 的jdbc方法
package com.swift.jdbc_oracle; import java.sql.CallableStatement; import java.sql.Connection; import ...
- c/c++面试指导---c语言基础算法总结1
c语言基础算法总结 1 初学者学习任何一门编程语言都必须要明确,重点是学习编程方法和编程思路,不是学习语法规则,语法规则是为编程实现提供服务和支持.所以只要认真的掌握了c语言编程方法,在学习其它的语 ...
- python--re(匹配字符串)
\d 匹配任何十进制数:它相当于类 [0-9]. \D 匹配任何非数字字符:它相当于类 [^0-9]. \s 匹配任何空白字符:它相当于类 [ fv]. \S 匹配任何非空白字符:它相当于类 [^ f ...
- 用python写一个类似于linux中的tree
import os filePath = 'g:/File' j = 0 # 查找的深度计数 def tree(filePath,j): dir_now = os.listdir(filePath) ...
- Spark调优之JVM调优
一.JVM调优 JVM: 老年代: 存放少量生命周期长的对象,如连接池 年轻代: Spark task执行算子函数自己创建的大量对象 JVM机制: 对象进入java虚拟机之后会放在eden区域和一个s ...
- python3 练习题100例 (十九)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """练习十九:计算1-2+3...+99中除了88以外所有数的和" ...
- 学习python第十二天,函数4 生成器generator和迭代器Iterator
在Python中,这种一边循环一边计算的机制,称为生成器:generator 要创建一个generator,有很多种方法.第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个genera ...
- C++ 二叉搜索树
二叉搜索树利用其特有的二叉树性质,使其搜索更方便 源代码: struct node { int val; node *left, *right; }; //the function of insert ...
- Mysql 表转换成 Sqlite表
目前的转换仅仅支持对没有外键的Mysql数据表 准备: 下载安装 Sqlite Expert 软件 一 获取Mysql中的.sql文件,获取过程省略可以直接导出sql文件 二 在Sqlite Expe ...
- Java从后台重定向(redirect)到另一个项目的方法
(1)通过ModelAndView跳转 @RequestMapping("alipayforward") public ModelAndView alipayforward(Htt ...