计组原
计组原
一、内存
1. 理论
1. 前言
内存是计算机系统的主存储器 介绍上面两个存储单位后就介绍下内存了。 内存作为1个存储数据的存在, 有1个很重要的特性, 就是内存里的数据能被cpu直接访问。 cpu能不能直接访问硬盘的数据呢, 不能。 只能通过把硬盘的数据先放到内存里, 然后再从内存里访问硬盘的数据。我们平时玩游戏碰上读图loading 进度条的这个过程, 就是把数据从硬盘读到内存的过程啊。 读完条后地图的数据就在内存中了。 所以内存才是计算机系统的主存储器, 而硬盘是被分到跟光盘..u盘一类都是外部存储器
2. 直接寻址技术
当代计算机还实现了1个逆天的技术,就是直接寻址了. 什么意思呢, 还是用上面的例子说明, 假如你知道你要找的人住在那栋大楼的17楼 1702, 但是你还是需要从1楼走到17楼去找他, 这个过程还是需要时间成本的.
但是如果你具有了直接寻址技术, 就能直接跳到17楼 1702门前, 如果你找的下1个人在2楼, 又能从17楼直接跳到2楼, 逆天啊. 而直接寻址技术已经成为当代计算机软硬件的标准技术之一了, 也就是说只要cpu知道要访问数据的内存地址, 就能直接到内存的对应位置去访问数据!
3. 内存地址的表示方式
跟门牌号一样, 其实内存地址也是由1个2进制数字来表示的. 每1个地址对应内存里的1个byte字节, 如果地址的值加1, 那么这个地址就对应下1个字节了.
那么内存地址的长度是多少呢? 这个就是这篇文章标题所涉及的. 在32位操作系统中, 内存的地址就是32位的2进制数, 那么假如32位系统的某个内存地址是: 0000 1111 1111 0000 1111 0000 1111 0000 那么它可以用十六进制表示成: 0 F F 0 F 0 F 0 也就是 Ox0ff0f0f0 前面Ox代表十六进制, 所以你见到这种字母数字混合一次的地址方式,就是这样得来的了, 它实际上是1个二进制的数字啊. 不过计算机里面所有的东西都是二进制了..
4. 内存地址的数量决定cpu能访问的内存大小
上面说了, 既然32位系统里内存地址长度是32位的. 所以32位的地址范围就是从 0000 0000 0000 0000 0000 0000 0000 0000 到 1111 1111 1111 1111 1111 1111 1111 1111 啦(Ox00000000 ~ OxFFFFFFFF), 这里有几个地址呢? 明显是有 2^32 个啦.
那么2^32到底是多少个? 2^32 = 4 * 1024(G) * 1024(M) * 1024(K) = 4294967296 , 就是4G 啊, 而每1个地址对应1个1个字节, 容量就是1byte, 所以2^32个地址就总共能对应应4GB 的内存容量啊, 这里的B指的是byte 字节啊。
假如你给32位的系统配上了8GB的内存, 操作系统最多也只能给其中4GB 分配地址, 其余 4GB 是没有地址, 因为地址不够用啊, 所以32位系统最多支持4GB内存就是这样来的。
补充评论(没有深入探究了、尽信书,不如无书)
这个转载的文章误人子弟了。前面说的都对,后面就驴头不对马嘴了。32位操作系统,指的是寄存器是32位,一次内存数据流宽度是32位。但是不是说内存地址也必须32位。内存大小是由硬件和操作系统两个方面决定的。硬件是地址总线,地址总线如果是32个,那么就最多支持4G,但是地址总线一般大于等于数据总线,如果地址总线是36个,那么硬件支持内存就大于4G了。还有操作系统,那是虚拟地址了。就算地址总线有36个,操作系统支持的虚拟地址只有32位,那也仅仅支持4G内存。内存大小是由硬件和操作系统两方制约的(还有其他小的制约因素)。至于文中说的32位操作系统,指的是寄存器位数,和内存大小没多大关系。地址总线36位,如果寄存器位数32位,可以通过读取两次,完成内存地址定位。
2. 实际
1. 线程数和逻辑CPU个数,内核个数
1 CPU 4 Core 8 Thread
在任务管理器中,看到其实是4个内核,但是逻辑处理器是8个,有多少个逻辑处理器,就可以开多少个线程。 线程数=逻辑处理器个数
- 一个
物理内核
可以作为1个或者2个逻辑CPU
操作系统可以使用逻辑CPU来模拟真实CPU。 在没有多核处理器的时候,一个物理CPU只能有一个物理内核, 有了多核技术,一个物理CPU可以有多个物理内核,可以把一个CPU当作多个CPU使用,即逻辑CPU。 没有开启超线程时,逻辑CPU的个数就是总的CPU物理内核数。 开启超线程后,逻辑CPU的个数就是总的CPU物理内核数的两倍。
实际能看到的2个物理CPU:
from multiprocessing import cpu_count
print(cpu_count())
> 8
在python中,使用上述代码可以获取当前系统的逻辑cpu个数,也就是支持并发的线程个数。