linux操作系统之 cpu简单介绍

32/64位

32位处理器,计算机中的位数指的是CPU一次能处理的最大位数。32位计算机的CPU一次最多能处理32位数据,例如它的EAX寄存器就是32位的,当然32位计算机通常也可以处理16位和8位数据。在Intel由16位的286升级到386的时候,为了和16位系统兼容,它先推出的是386SX,这种CPU内部预算为32位,外部数据传输为16位。直到386DX以后,所有的CPU在内部和外部都是32位的了。在计算机中,“位(bit)”和"字节(Byte)"、KB、MB以及TB的关系是:8位等于一字节,即8bit=1Byte,1KB=1024Byte(字节)=8*1024bit,1MB=1024KB,1GB=1024MB,1TB=1024GB 。32位处理器每次处理 4Byte(32bit),

同理,64位处理器每次处理 8Byte(64bit) 。

 

运算能力对比:

如果我们将总长128位的指令分别按照16位、32位、64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位、32位的更快。

 

寻址空间对比:

内存地址是由1个2进制数字来表示的.   每1个地址对应内存里的1个byte字节, 如果地址的值加1, 那么这个地址就对应下1个字节了.  

CPU最大能查找多大范围的地址叫做寻址能力 ,如32位寻址的CPU可以寻址2的32次方个地址  ,每个地址代表1个字节,那加起来就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。

 

32位操作系统针对的32位的CPU设计。

64位操作系统是指特别为64位架构计算机系统而设计的操作系统

 

操作系统和cpu的关系

Cpu的作用是运行机器语言指令。高级语言和汇编语言程序被编译成cpu能理解的机器语言后,存入到内存中,cpu就会从内存中读取并执行这些指令序列,完成程序功能

CPU指令集:(主流)ARM 和 X86两类。CPU指令集取决于CPU的体系架构

操作系统:  操作系统是 用户 和cpu 之间的桥梁,把用户的行为翻译成cpu指令,发送给cpu执行。

 

cpu指令集架构 ,微架构,cpu的关系

1  指令集架构就是规定了一堆抽象指令,比如加、移位指令啥的。加指令可以完成加法操作,移位指令可以完成移位的操作

微处理器的指令集架构(Instruction Set Architecture)常见种类如下: 复杂指令集运算(Complex Instruction Set Computing,CISC);精简指令集运算(Reduced Instruction Set Computing,RISC) ;显式并行指令集运算(Explicitly Parallel Instruction Computing,EPIC);超长指令字指令集运算(VLIW)

它是软件与CPU这两个层级之间的接口

2  : 微架构、处理器架构、CPU架构  都是指的是 指令集的实现逻辑,把指令集具体化了。

3 : CPU本来只是个硬件,指令集的处理逻辑放进去之后,就变成了可以执行指令的cpu

4 同一个指令集 不同厂商实现的逻辑肯定不一样,所以效率也会有差别。

5 同一个指令集   在32位 和 64位cpu上的实现逻辑 肯定也不一样,而且 64位cpu 实现的指令集 效率肯定高。 

  x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为“IA-32” 
  x84_64是x86 CPU开始迈向64位的时候,有2选择:1、向下兼容x86。2、完全重新设计指令集,不兼容x86。AMD抢跑了,比Intel率先制造出了商用的兼容 x86的CPU,AMD称之为AMD64,抢了64位PC的第一桶金,得到了用户的认同。而Intel选择了设计一种不兼容x86的全新64为指令集,称 之为IA-64(这玩意似乎就是安腾),但是比amd晚了一步,而且IA-64也挺惨淡的,因为是全新设计的CPU,没有编译器,也不支持 windows(微软把intel给忽悠了,承诺了会出安腾版windows server版,但是迟迟拿不出东西)。。。后来不得不在时机落后的情况下也开始支持AMD64的指令集,但是换了个名字,叫x86_64,表示是x86 指令集的64扩展,大概是不愿意承认这玩意是AMD设计出来的。 
也就是说实际上,x86_64,x64,AMD64基本上是同一个东西,我们现在用的intel/amd的桌面级CPU基本上都是x86_64,与之相对的arm,ppc等都不是x86_64。 
  x86、x86_64主要的区别就是32位和64位的问题,x86中只有8个32位通用寄存器,eax,ebx,ecx,edx, ebp, esp, esi, edi。x86_64把这8个通用寄存器扩展成了64位的,并且比x86增加了若干个寄存器(好像增加了8个,变成了总共16个通用寄存器)。同样的 MMX的寄存器的位数和数量也进行了扩展。此外cpu扩展到64位后也能支持更多的内存了,等等许多好处。 

 

 

CPU 缓存

计算机系统中,CPU高速缓存(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。

当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。

缓存之所以有效,主要是因为程序运行时对内存的访问呈现局部性(Locality)特征。这种局部性既包括空间局部性(Spatial Locality),也包括时间局部性(Temporal Locality)。有效利用这种局部性,缓存可以达到极高的命中率。

在处理器看来,缓存是一个透明部件。因此,程序员通常无法直接干预对缓存的操作。但是,确实可以根据缓存的特点对程序代码实施特定优化,从而更好地利用缓存。

 

CPU 亲和力

CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性;再简单的点的描述就将制定的进程或线程绑定到相应的cpu上;在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。

  软亲和性(affinity):  就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。

  硬亲和性(affinity):简单来说就是利用linux内核提供给用户的API,强行将进程或者线程绑定到某一个指定的cpu核运行。

 

我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起,所有设置CPU亲和性可以使某些程序提高性能

  解释:在linux内核中,所有的进程都有一个相关的数据结构,称为 task_struct。这个结构非常重要,原因有很多;其中与 亲和性(affinity)相关度最高的是 cpus_allowed 位掩码。这个位掩码由 n 位组成,与系统中的 n 个逻辑处理器一一对应。 具有 4 个物理 CPU 的系统可以有 4 位。如果这些 CPU 都启用了超线程,那么这个系统就有一个 8 位的位掩码。 如果为给定的进程设置了给定的位,那么这个进程就可以在相关的 CPU 上运行。因此,如果一个进程可以在任何 CPU 上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是 1。实际上,这就是 Linux 中进程的缺省状态;(这部分内容在这个博客中有提到一点:http://www.cnblogs.com/wenqiang/p/4802619.html)

   cpus_allowed用于控制进程可以在哪里处理器上运行

        sched_set_affinity() (用来修改位掩码)
        sched_get_affinity() (用来查看当前的位掩码)

 

cpu 亲和度 是想让同一个进程在同一个cpu上执行。

调度器的作用是 选择优先级高的可以执行的进程然后让cpu 去执行。

 

 

linux 大端和小端

所谓的大小端问题,也就是字节序。处理器(CPU)对内存数据操作有两种模式:读和写。这样,处理器在读写一个多字节内存的时候,高字节是在内存的高地址还是低地址就是一个问题,不同的大小端模式可能有不同的结果。

当处理器读写指令针对数据不一致的时候就涉及到大小端问题,例如:将0x7654321放入内存里,然后在内存首地址用单字节读取命令,这就涉及到处理器是大端还是小端。对于小端处理器,写内存的时候会将内存的低地址处放入数据源的低字节,在内存的高地址处放入数据源的高字节;大端模式则刚好相反

 

网络字节序
网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;
UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;
所以说,网络字节序是大端字节序;比如,我们经过网络发送整型数值0x12345678时,在80X86平台中,它是以小端发存放的,在发送之前需要使用系统提供的字节序转换函数htonl()将其转换成大端法存放的数值;

常见CPU的字节序
Big Endian : PowerPC、IBM、Sun
Little Endian : x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值