内存来标记相当于查询号码被多少人标记内存

&nbsp>&nbsp
&nbsp>&nbsp
linux教程 &nbsp>&nbsp
linux0.11内存管理
摘要:linux0.11内存管理描述linux0.11的内存管理主要内容。1:内存初始化linux0.11最大支持16MB的物理内存。main函数和mem_init函数对内存进行了初始化。主要使用数组mem_map[]来标记相应的内存页是否被占用。memory_end是用BIOS中断调用得到的实际内存大小。if(memory_end&16*)memory_end=16*;#因此最大只支持16MB内存if(memory_end&12*1
linux0.11内存管理描述linux 0.11的内存管理主要内容。1:内存初始化linux 0.11最大支持16MB的物理内存。main函数和mem_init函数对内存进行了初始化。主要使用数组mem_map[]来标记相应的内存页是否被占用。memory_end是用BIOS中断调用得到的实际内存大小。if (memory_end & 16 * 1024 * 1024) memory_end = 16 * 1024 * 1024; # 因此最大只支持16MB内存if (memory_end & 12*) buffer_memory_end = 4 * 1024 * 1024; # buffer_memory_end为高速缓存末端地址,其大小于机器总内存大小相关else if (memory_end & 6 * 1024 * 1024) buffer_memory_end = 2 * 1024 * 1024else buffer_memory_end = 1*main_memory_start = buffer_memory_mem_init(main_memory_start, memory_end);在mem_init中会对mem_map[]数组进行初始化。在1MB~16MB之间,共有(15 * 1024 * 1024) && 12 = 3840页。定义数组mem_map[3840]对应于这段内存的每一页,在main_memory_start和memory_end之间的页,相应的mem_map[i]的值初始化为0,表示未使用,其余的项初始化为100,表示被占用。2:基本页面分配函数有几个基本的页面分配和释放的函数。get_free_page():返回一个空闲页面的物理地址, 该函数就是在mem_map数组中查找值为0的项,然后转换成页面物理地址返回。free_page(phy_addr):释放phy_addr指向的页面, 释放操作就是将phy_addr在mem_map中对应项的值进行减1。get_empty_page(line_addr):该函数的参数指定的是线性地址,要求获得一页物理内存,并用line_addr指向这页内存。void get_empty_page(unsigned long address){ if (!(tmp=get_free_page()) || !put_page(tmp, address)) { free_page(tmp); oom(); # 内存不够 }}明显该函数先调用get_free_page获得一页物理内存, 然后用put_page对这页物理内存的物理地址和线性地址之间建立映射。建立映射的过程:对于32位的线性地址, 高10位表示页目录索引, 中间10位为页表索引, 低12位为页内偏移。因此给定一个线性地址,我们就能通过页目录基地址和线性地址高10位来确定它的页目录项。在Linux 0.11中,页目录基地址就是0。put_page: page_table = (unsigned long *) ((line_addr && 20) &; 0xffc) # 获得页目录项的指针 如果该页目录项所指向的页表是存在的, 则利用线性地址的中间10位,定位到页表中的相应页表项,并将物理地址保存进去即可建立映射。 若页表不存在,则用get_free_page首先分配一页作为页表,再去建立映射。不管是建立映射还是进行页表拷贝,都是先考虑页目录,再考虑页表。3:sys_fork与copy_page_tables函数在sys_fork时会调用copy_process,copy_process中会调用copy_mem函数, 该函数会将父进程的页表拷贝给子进程,这是父进程和子进程会共享相应的代码和数据段,只有当父进程或子进程对共享的内存进行写操作时,才会为子进程分配内存,即为写时复制。copy_mem是调用copy_page_table进行页表拷贝的。copy_page_table(old_data_base, new_data_base, data_limit)将父进程的线性地址old_data_base ~ old_data_base+data_limit对应的页表,拷贝给子进程。在拷贝过程中,将每个页表项设定为只读, 并且执行相应的mem_map[i]++(相当于添加引用计数)4:页出错异常处理有两种不同的页出错:i)页表项指向的页不存在,即页表项的存在位的值为0.ii)页保护机制。 写只读页面时出错。但出现页错误时,会发生int 14中断。系统会执行_page_fault:异常处理代码。该代码会根据两种不同的页错误,分别执行do_no_page和do_wp_pagedo_wp_page(error_code, address)该函数主要是实现了写时复制功能, 在copy_page_table时,将父进程和子进程的页表都设定成了只读,当访问了其中一个页面后,会触发中断并执行do_wp_page函数。此函数会分配一页新的物理内存, 并将相应的页表项设成可读写。do_no_page(error_code, address)该函数可处理两种情况:i)在应用分配内存时,内核并不会实际分配物理内存, 只有在访问相应内存时,才会分配。ii)在执行exec系列函数时,同样只有在访问相应内存时,才会去读文件,对于第一种情况, do_no_page直接调用get_empty_page函数,获取一页内存。对于第二种情况,有两步过程。i)调用share_page函数。 该函数的主要目的是共享代码和数据段。 如果一个可执行文件,已经有一个进程实例在执行,那么新进程可以和其他进程共享该可执行文件的代码和数据段。ii)如果只执行过一次该文件, 那就先调用get_free_page函数,将文件内容读入内存,然后用put_page函数建立映射。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
linux0.11内存管理相关信息,包括
的信息,所有linux0.11内存管理相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
服务与支持
账号与支持
关注阿里云
International2009年9月 C/C++大版内专家分月排行榜第二
匿名用户不能发表回复!|你左手是内存,右手是显存,内存可以打死显存,显存也可以打死内存。
                             && 请协调好你的主存
从硬件说起
大部分Caffe源码解读都喜欢跳过这部分,我不知道他们是什么心态,因为这恰恰是最重要的一部分。
内存的管理不擅,不仅会导致程序的立即崩溃,还会导致内存的泄露,当然,这只针对传统CPU程序而言。
由于GPU的引入,我们需要同时操纵俩种不同的存储体:
一个受北桥控制,与CPU之间架起地址总线、控制总线、数据总线。
一个受南桥控制,与CPU之间仅仅是一条可怜的PCI总线。
一个传统的C++程序,在操作系统中,会被装载至内存空间上。
一个有趣的问题,你觉得CPU能够访问显存空间嘛?你觉得你的默认C++代码能访问显存空间嘛?
结果显然是否定的,问题就在于CPU和GPU之间只存在一条数据总线。
没有地址总线和控制总线,你除了让CPU发送数据拷贝指令外,别无其它用处。
这不是NVIDIA解决不了,AMD就能解决的问题。除非计算机体系结构再一次迎来变革,
AMD和NVIDIA的工程师联名要求在CPU和GPU之间追加复杂的通信总线用于异构程序设计。
当然,你基本是想多了。
可怜的数据总线,加大了异构程序设计的难度。
于是我们看到,GPU的很大一部分时钟周期,用在了和CPU互相交换数据。
也就是所谓的&内存与显存之间友好♂关系&。
你不得不接受一个事实:
GPU最慢的存储体,也就是片外显存,得益于镁光的GDDR技术,目前家用游戏显卡的访存速度也有150GB/S。
而我们可怜的内存呢,你以为配上Skylake后,DDR4已经很了不起了,实际上它只有可怜的48GB/S。
那么问题来了,内存如何去弥补与显存的之间带宽的差距?
答案很简单:分时、异步、多线程。
换言之,如果GPU需要在接下来1秒内,获得CPU的150GB数据,那么CPU显然不能提前一秒去复制。
它需要提前3秒、甚至4秒。如果它当前还有其它串行任务,你就不得不设个线程去完成它。
这就是新版Caffe增加的新功能之一:多重预缓冲。
设置于DataLayer的分支线程,在GPU计算,CPU空闲期间,为显存预先缓冲3~4个Batch的数据量,
来解决内存显存带宽不一致,导致的GPU时钟周期浪费问题,也增加了CPU的利用率。
最终,你还是需要牢记一点:
不要尝试以默认的C++代码去访问显存空间,除非你把它们复制回内存空间上。
否则,就是一个毫无提示的程序崩溃问题(准确来说,是被CPU硬件中断了【微机原理或是计算机组成原理说法】)
在传统的CUDA程序设计里,我们往往经历这样一个步骤:
cudaMalloc(....)&&&&&&& & 【分配显存空间】
cudaMemset(....)   【显存空间置0】
cudaMemcpy(....) && 【将数据从内存复制到显存】
cudaMemcpy(....)&&&&&& 【将数据从显存复制回内存】
这些步骤相当得繁琐,你不仅需要反复敲打,而且如果忘记其中一步,就是毁灭性的灾难。
这还仅仅是GPU程序设计,如果考虑到CPU/GPU异构设计,那么就更麻烦了。
于是,聪明的人类就发明了主存管理自动机,按照按照一定逻辑设计状态转移代码。
这是Caffe非常重要的部分,称之为SyncedMemory(同步存储体)。
状态转移自动机
自动机共有四种状态,以枚举类型定义于类SyncedMemory中:
enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED };
这四种状态基本会被四个应用函数触发:cpu_data()、gpu_data()、mutable_cpu_data()、mutable_gpu_data()
在它们之上,有四个状态转移函数:to_cpu()、to_gpu()、mutable_cpu()、mutable_gpu()
前两个状态转移函数用于未进入Synced状态之前的状态机维护,后两个用于从Synced状态中打破出来。
具体细节见后文,因为Synced状态会忽略to_cpu和to_gpu的行为,打破Synced状态只能靠人工赋值,切换状态头head。
后两个mutable函数会被整合在应用函数里,因为它们只需要简单地为head赋个值,没必要大费周章写个函数封装。
★UNINITIALIZED:
UNINITIALIZED状态很有趣,它的生命周期是所有状态里最短的,将随着CPU或GPU其中的任一个申请内存而终结。
在整个内存周期里,我们并非一定要遵循着,数据一定要先申请内存,然后在申请显存,最后拷贝过去。
实际上,在GPU工作的情况下,大部分主存储体都是直接申请显存的,如除去DataLayer的前向/反向传播阶段。
所以,UNINITIALIZED允许直接由to_gpu()申请显存。
由此状态转移时,除了需要申请内存之外,通常还需要将内存置0。
★HEAD_AT_CPU:
该状态表明最近一次数据的修改,是由CPU触发的。
注意,它只表明最近一次是由谁修改,而不是谁访问。
在GPU工作时,该状态将成为所有状态里生命周期第二短的,通常自动机都处于SYNCED和HEAD_AT_GPU状态,
因为大部分数据的修改工作都是GPU触发的。
该状态只有三个来源:
I、由UNINITIALIZED转移到:说白了,就是钦定你作为第一次内存的载体。
II、由mutable_cpu_data()强制修改得到:都要准备改数据了,显然需要重置状态。
cpu_data()及其子函数to_cpu(),只要不符合I条件,都不可能转移到改状态(因为访问不会引起数据的修改)
★HEAD_AT_GPU:
该状态表明最近一次数据的修改,是由GPU触发的。
几乎是与HEAD_AT_CPU对称的。
★SYNCED:
最重要的状态,也是唯一一个非必要的状态。
单独设立同步状态的原因,是为了标记内存显存的数据一致情况。
由于类SyncedMemory将同时管理两种主存的指针,
如果遇到HEAD_AT_CPU,却要访问显存。或是HEAD_AT_GPU,却要访问内存,那么理论上,得先进行主存复制。
这个复制操作是可以被优化的,因为如果内存和显存的数据是一致的,就没必要来回复制。
所以,使用SYNCED来标记数据一致的情况。
SYNCED只有两种转移来源:
I、由HEAD_AT_CPU+to_gpu()转移到:
含义就是,CPU的数据比GPU新,且需要使用GPU,此时就必须同步主存。
II、由HEAD_AT_GPU+to_cpu()转移到:
含义就是,GPU的数据比CPU新,且需要使用CPU,此时就必须同步主存。
在转移至SYNCED期间,还需要做两件准备工作:
I、检查当前CPU/GPU态的指针是否分配主存,如果没有,就重新分配。
II、复制主存至对应态。
处于SYNCED状态后,to_cpu()和to_gpu()将会得到优化,跳过内部全部代码。
自动机将不再运转,因为,此时仅需要返回需要的主存指针就行了,不需要特别维护。
这种安宁期会被mutable前缀的函数打破,因为它们会强制修改至HEAD_AT_XXX,再次启动自动机。
主存操作函数
建立synced_memory.hpp,在操作主存之前,你需要封装一些基础函数。
CPU端的函数是C/C++标准的通用函数:
inline void dragonMalloc(void **ptr, size_t size){
*ptr = malloc(size);
CHECK(*ptr) && "host allocation of size " && size && " failed";
inline void dragonFree(void *ptr){
free(ptr);
inline void dragonMemset(void *ptr,size_t size){
memset(ptr, 0, size);
inline void dragonMemcpy(void* dest, void* src,size_t size){
memcpy(dest, src, size);
内存操纵函数
CHECK宏由GLOG提供,条件为假时,会触发assert,终结程序。
GPU端的函数由CUDA提供:
#ifndef CPU_ONLY
#include "cuda.h"
inline void cudaSetDevice(){
cudaGetDevice(&device);
if (device != -1) return;
CUDA_CHECK(cudaSetDevice(0));
inline void dragonGpuMalloc(void **ptr, size_t size){
cudaSetDevice();
CUDA_CHECK(cudaMalloc(ptr, size));
inline void dragonGpuFree(void *ptr){
cudaSetDevice();
CUDA_CHECK(cudaFree(ptr));
inline void dragonGpuMemset(void *ptr, size_t size){
cudaSetDevice();
CUDA_CHECK(cudaMemset(ptr, 0, size));
inline void dragonGpuMemcpy(void *dest, void* src, size_t size){
cudaSetDevice();
CUDA_CHECK(cudaMemcpy(dest, src, size, cudaMemcpyDefault));
显存操纵函数
#ifndef CPU ONLY& ..... #endif 确保本段代码不会被非CUDA模式所编译
cudaSetDevice()是一个通用函数,在后期,你应该移至common.hpp中。
该函数不是必要的,目的只是对当前执行GPU的一个惯性检查,检查失败则终结程序。
需要注意的是cudaMemcpy的最后一个参数,Flag:cudaMemcpyDefault,在CUDA 6.0之后才被使用。
在6.0版本之前,cudaMemcpy需要指明dest和src的来源,是host向device,还是device向host,还是device向device?
所以,早期的CUDA代码可能需要三个if来指明Flag的值,而cudaMemcpyDefault会自动检测,相当智能。
class SyncedMemory
SyncedMemory():cpu_ptr(NULL), gpu_ptr(NULL), size_(0), head_(UNINITIALIZED) {}
SyncedMemory(size_t size) :cpu_ptr(NULL), gpu_ptr(NULL), size_(size), head_(UNINITIALIZED) {}
void to_gpu();
void to_cpu();
const void* cpu_data();
const void* gpu_data();
void set_cpu_data(void *data);
void set_gpu_data(void *data);
void* mutable_cpu_data();
void* mutable_gpu_data();
#ifndef CPU_ONLY
void async_gpu_data(const cudaStream_t& stream);
enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED };
void *cpu_ptr, *gpu_
size_t size_;
bool own_cpu_data, own_gpu_
SyncedHead head_;
SyncedHead head() { return head_; }
size_t size() { return size_; }
~SyncedMemory();
SynecMemory的声明
成员变量包括:
★两个主存指针:cpu_ptr、gpu_ptr
★主存大小size以及状态标记head
★共享标记:own_cpu_data、 own_gpu_data
成员函数包括:
★状态转移函数:void to_gpu()、void to_cpu()
★常访问函数:const void* cpu_data()、 const void* gpu_data()
★修改函数:void* mutable_cpu_data()、void* mutable_gpu_data()
★共享函数:void set_cpu_data(void *data)、void set_gpu_data(void *data)
★封装访问函数:SyncedHead head()、size_t size()
★异步流同步函数与析构函数:void async_gpu_data(const cudaStream_t& stream)、~SyncedMemory()
值得注意的是,两个共享函数以及共享标记不属于自动机范围。
共享函数的唯一用处是用于局部主存的共享,只用于DataLayer的Transformer中。
在Blob级别的共享中,存在两种共享:
I、共享另一个Blob的全部数据:只需要让SyncedMemory指针重新指向另一个Blob的SyncedMemory指针
II、共享另一个Blob的部分数据:
这利用了C/C++内存指针的一个Trick,内存首指针可以做代数加减运算,做一定偏移。
set_xxx_data(void *data)提供了最底层的指针修改,可以直接指向偏移之后的内存,而共享部分数据。
建立synced_memory.cpp。
void SyncedMemory::to_cpu()
switch (head_){
case UNINITIALIZED:
dragonMalloc(&cpu_ptr, size_);
dragonMemset(cpu_ptr, size_);
head_ = HEAD_AT_CPU;
own_cpu_data = true;
case HEAD_AT_GPU:
#ifndef CPU_ONLY
if (cpu_ptr == NULL){
dragonMalloc(&cpu_ptr, size_);
own_cpu_data = true;
dragonGpuMemcpy(cpu_ptr,gpu_ptr,size_);
head_ = SYNCED;
case HEAD_AT_CPU:
case SYNCED:
★void SyncedMemory::to_cpu()
需要注意的是共享标记own_xxx_data,只要申请了内存,就必须做标记。
共享标记在析构时是必要的,因为你不能将宿主数据一并释放掉。
void SyncedMemory::to_gpu()
#ifndef CPU_ONLY
switch (head_){
case UNINITIALIZED:
dragonGpuMalloc(&gpu_ptr,size_);
dragonGpuMemset(gpu_ptr, size_);
head_ = HEAD_AT_GPU;
own_gpu_data = true;
case HEAD_AT_CPU:
if (gpu_ptr == NULL){
dragonGpuMalloc(&gpu_ptr,size_);
own_gpu_data = true;
dragonGpuMemcpy(gpu_ptr, cpu_ptr, size_);
head_ = SYNCED;
case HEAD_AT_GPU:
case SYNCED:
★void SyncedMemory::to_gpu()
GPU的转移函数是与CPU版本对称的。
const void* SyncedMemory::cpu_data(){
return (const void*)cpu_
const void* SyncedMemory::gpu_data(){
return (const void*)gpu_
★const void* SyncedMemory::xxx_data()
常访问函数,注意const指针的强制转换,访问之前需要运行一次自动机。
void* SyncedMemory::mutable_cpu_data(){
head_ = HEAD_AT_CPU;
return cpu_
void* SyncedMemory::mutable_gpu_data(){
#ifndef CPU_ONLY
head_ = HEAD_AT_GPU;
return gpu_
★void* SyncedMemory::mutable_xxx_data()
修改函数,运行自动机、强制修改自动机状态,最后返回指针,用于从外部修改。
void SyncedMemory::set_cpu_data(void *data){
if (own_cpu_data) dragonFree(cpu_ptr);
head_ = HEAD_AT_CPU;
own_cpu_data = false;
void SyncedMemory::set_gpu_data(void *data){
#ifndef CPU_ONLY
if (own_gpu_data) dragonGpuFree(gpu_ptr);
head_ = HEAD_AT_GPU;
own_gpu_data = false;
★void SyncedMemory::set_xxx_data(void *data)
共享函数,共享之前,先释放旧主存,修改共享标记,强制修改自动机状态。
SyncedMemory::~SyncedMemory(){
if (cpu_ptr && own_cpu_data) dragonFree(cpu_ptr);
#ifndef CPU_ONLY
if (gpu_ptr && own_gpu_data) dragonGpuFree(gpu_ptr);
★SyncedMemory::~SyncedMemory()
析构函数,注意检查共享标记,不能释放宿主内存。
异步流同步
异步流概念,是CUDA 5.0中引入的。
与Intel CPU的流水线架构一样,NVIDIA的GPU也采用了I/O和计算分离的流水线做法。
cudaMemcpy使用的是默认流cudaStreamDefault,编号为0。
异步流编程API开放之后,允许程序员在CPU端多线程编程中,向GPU提交异步的同步复制流,
以此增加GPU端的I/O利用率。
简单来说,默认流只允许主进程与显存复制数据,而我们实际上不可能这么干,原因有二:
I、效率低,主进程就是单线程啊。
II、很多情况下,数据复制完之前,需要阻塞。阻塞主进程不是一个好主意。
Caffe中只有一处是这么做的,那就是DataLayer正向传播一个Batch的时候,这个阻塞是必然的。
但是,在构成Batch之前,只要采取多线程设计,那么异步流复制只会阻塞旁支线程,而不会影响主进程。
这是为什么NVIDIA开放异步流API的原因,它鼓励了CPU用于多线程I/O,让GPU计算如虎添翼。
#ifndef CPU_ONLY
void SyncedMemory::async_gpu_data(const cudaStream_t& stream){
CHECK(head_ == HEAD_AT_CPU);
first allocating memory
if (gpu_ptr == NULL){
dragonGpuMalloc(&gpu_ptr, size_);
own_gpu_data = true;
const cudaMemcpyKind kind = cudaMemcpyHostToD
CUDA_CHECK(cudaMemcpyAsync(gpu_ptr, cpu_ptr, size_, kind, stream));
head_ = SYNCED;
★void SyncedMemory::async_gpu_data()
异步流的底层代码接受一个异步流作为参数,使用cudaMemcpyAsync()向GPU提交复制任务。
它等效于HEAD_AT_CPU+to_gpu(),所以需要更新同步标记。
完整代码将在DataLayer中完成,该函数将由多线程调用。
synced_mem.hpp:
synced_mem.cpp:
阅读(...) 评论()笔记本内存条安装图解_内存吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:130,241贴子:
笔记本内存条安装图解收藏
分步阅读步骤12345678
由于笔记本电脑的结构与台式电脑不同,所以其硬件排列方式与安装方法自然与台式电脑会有很大不同,这可能会给许多想diy硬件的朋友带来些许麻烦。但是其实,不管是台式机还是笔记本,它们的基本原理都是一样的。比如安装内存条,无非是把内存条插到主板的内存插槽里,这并没有什么神秘。下面我就来具体地说一说。
金士顿原装内存,稳定性高,高科技研发内存,高效散热,超快速度低功耗凭借超过 25 年的内存专业技术,金士顿以其丰富的知识和资源满足您的需要
工具/原料笔记本电脑一台内存条一根 方法/步骤首先你要对你的笔记本电脑做一个全面评估,从它的定位与实际功能来看,是不是能满足你现在的需要,值不值得再去升级。要知道,即使最简单的硬件更换,都会有潜在的风险,尤其是笔记本电脑这类结构较为复杂的设备。 所以,要做一个评估,如果你认为没有升级的必要,就不要冒险自己升级了。然后,根据你电脑的整体配置,来选择适合的内存条。内存条到现在已经经历了好几代了,前几年是流行DDR 2,而现在DDR 3已经是主流了,ddr 2已经趋于淘汰。所以,要搞清楚你的内存条属于第二代还是第三代,如果选择错了会出现不兼容的现象,导致升级失败。选择内存条的容量。容量越大价格越贵,尤其是现在二代内存要比三代内存贵上许多。要根据你实际的需要来选择合适容量的内存条。下面就要开始实质的安装了。首先准备好工具,包括螺丝刀和内存。在笔记本背部会有内存仓的标记,当然不同型号不同品牌的笔记本会有所区别。但都大同小异。要注意一定不要弄错了,如果不能确定 ,最好查看一下说明书或者咨询专业人士。打开内存仓盖儿之后,调整一下所插金条内存金手指的缺口部分位置,使其对准插槽的固定突起部分,这其实是工业设计中的防呆设计。然后用大约45度的角度插入插槽,然后轻按一下,它就会发出“啪”的一声响,卡入插槽中了。如果没能听到响声,就很可能没安装好,需要重新安装一下。如图所示这就是卡扣卡住内存条的样子。要注意操作的时候一定要小心,不用用力过大,否则会损坏各种部件。安装完成之后再盖上后盖儿,然后用螺丝刀拧紧螺丝就可以了。安装完成,还要查看一下是不是安装成功。可以用一些硬件查看类的软件来查看。这个过程不再赘述。注意事项最重要的是轻拿轻放,不可用力过猛,否则会损坏硬件如果型号不同的笔记本,而你又没有搞清它的结构时,最好不要擅自安装,以免损坏。
不错啊~正需要呢。
不同牌子的内存条会不会不兼容
图好像好小(´⊙ω⊙`)赛扬+超线程=i3 i3+i3=i7 总结赛扬+赛扬+超线程=i7 2个赛扬400(≥∇≤)
应用吧活动,
登录百度帐号怎么看内存条频率 查看内存条频率方法【图文】
  朋友们都知道电脑内存可以为数据的运行提供存储单元,内存的基本容量和频率是直接关系到电脑整体性能的。那么,怎么看内存条频率?朋友们可以来看看下文中的介绍,学会了怎么看内存条频率在购买的时候就可以作为一项衡量指标,从而选择到更适合自己使用的性价比高的产品。    内存的频率越高性能就越好,目前DDR2内存的频率从333MHZ到1066MHZ不等,而DDR3内存则在1066NHZ到1600MHZ之间。朋友们想要处理大型的问题或是玩3D游戏,必须要选择一款好的内存作为支持,这样才能实现好的使用效果,怎么看内存条频率?看内存的方法对比看的方法而言就少很多了,因为我们无法进入到内存中实际的看频率,只能通过数据和使用性能进行推断。    第一,朋友们可以选择看内存表面的标注,一般内存条在出厂的时候都是会标注上内存的容量和频率的,购买新内存或者是电脑的时候可以取出来看一下。只需要看下内存表面的铭牌标注即可。一些内存的频率标注在标签下面,可以撕开看一下。  第二,可以在开机的时候可以查看电脑的自检信息,电脑在重启或者是开机自检的时候可以显示各个硬件的详细信息,此时朋友们就可以看到内存的频率和容量等等。可以尝试在 电脑开机 检测到第二个画面的时候按pause键暂停,此时就可以查看到内存频率情况。    第三,可以借助一些软件来进行查看,多数优化软件都是有此种功能的,可以快速的显示电脑内存频率情况。很多朋友在使用软件进行检验的时候可以发现内存时序,内存时序与通道的数量是没有明显关系的,一般来说时序越低速度越快,和频率的原理是差不多的,也可以作为朋友们选购内存的一项参考因素。    怎么看内存条频率:  1、看内存条表面标注  内存上一般都会标注内存容量以及频率等,如果您是新购买的内存,或者台式电脑,那么就可以拿出来看看,我们可以通过看内存表面铭牌标注即可知道,如下图:  2、开机看电脑自检信息  电脑在重启或者开机后,在硬件自检的时候会显示各主要硬件详细信息,其中就会包含内存频率与容量等信息,我们可以在电脑开机硬件监测到第二个画面的时候,按pause键暂停,暂停自检画面看内存频率信息。  3、借助电脑优化软件查看内存频率(推荐鲁大师)  使用一些电脑优化软件也可以检测内存频率,比如使用鲁大师检测电脑硬件信息即可检测到内存容量与频率了,如下图所示的就是使用鲁大师检测电脑硬件配置的结果,其中就包含了内存频率一项。    内存条的性能指标:  (1)、存储容量:即一根内存条可以容纳的二进制信息量,如常用的168线内存条的存储容量一般多为32兆、64兆和128兆。而DDRII3普遍为1GB到8GB。  (2)、存取速度(存储周期):即两次独立的存取操作之间所需的最短时间,又称为存储周期,半导体存储器的存取周期一般为60纳秒至100纳秒。  (3)、存储器的可靠性:存储器的可靠性用平均故障间隔时间来衡量,可以理解为两次故障之间的平均时间间隔。  (4)、性能价格比:性能主要包括存储器容量、存储周期和可靠性三项内容,性能价格比是一个综合性指标,对于不同的存储器有不同的要求。    以上就是怎么看内存条频率这个问题的介绍了,掌握了一定的查看方法可以快速的了解到电脑内存情况。在选购的时候朋友们可以对比来购买,相同的内存容量下,频率高则电脑的性能越好。选购内存的时候建议朋友们选择大品牌产品,这样质量和售后都有保障。
最新更新栏目
您可能喜欢
大家都在搜

我要回帖

更多关于 黄山标记入住押金多少 的文章

 

随机推荐