精华内容
下载资源
问答
  • 操作系统:CPU通道

    千次阅读 2014-12-03 23:53:29
    设备I/O中引入缓冲技术的目的是为了缓和IO设备和CPU设备速度不匹配的矛盾而不是为了节省内存 设备管理的任务:I/O缓冲的管理;设备分配;设备映射;设备驱动 虚拟设备是通过___SPOOLing_____技

    通道是一种专用处理器

    CPU对通道的请求形式是:通道命令

    通道对 CPU的请求形式是:中断

    CPU与通道可以并行执行,并通过(I/O指令和I/O中断 )实现彼此间的通讯和同步。

    在设备I/O中引入缓冲技术的目的是为了缓和IO设备和CPU设备速度不匹配的矛盾而不是为了节省内存

    设备管理的任务:I/O缓冲的管理;设备分配;设备映射;设备驱动

    虚拟设备是通过___SPOOLing_____技术把____独占____设备变成能为若干用户___共享___的设备。

    通道是一个独立于___CPU_____的专管的处理机,它控制____外围设备_____与内存之间的信息交换。

    通道技术:通道是一个独立于 CPU的专管输入/输出控制的处理机,它控制设备与内存直接进行数据交换。它有自己的通道指令,这些通道指令受CPU启动,并在操作结束时向CPU发中断信号。
     通道作用:通道方式进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。

    展开全文
  • 它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道和三通道检测功能。  软件使用:CPU-Z的功能非常强大,但是它的体积却是非常之...
  • cpu-z检查cpu

    2013-04-05 23:55:07
    它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道和三通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • cpu-z CPU检测软件

    2017-03-15 15:08:16
    CPU检测软件 cpu-z中文版是一款家喻户晓的CPU检测软件,除了...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,cpu-z中文版还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。
  • 项目性能测试过程中发现,同样的代码,连接同样数量(10万)的设备(设备和代码之间通过NIO有大量的数据交互),Linux下CPU利用率只有20%~30%,而windows下却一直高于80%。 2. 原因初步排查 通过jconsole分别...

    1. 现象简述

    在项目性能测试过程中发现,同样的代码,连接同样数量(10万)的设备(设备和代码之间通过NIO有大量的数据交互),在Linux下CPU利用率只有20%~30%,而在windows下却一直高于80%。

    2. 原因初步排查

    通过jconsole分别监控运行在linux和windows上的程序,在【线程】选项卡中发现,windows下启动了大量未命名线程,堆栈信息都类似于下图:
    在这里插入图片描述

    通过Java自带的Jstack将Java程序对应进程的内存信息导出,命令如下:

    jstack -l 31372 > c:/31372.stack  
    

    说明: 其中31372为该进程的PID。

    然后搜索有相同堆栈信息的线程,发现同样的线程启动了97个,通过windows的监控工具Process Explorer(该工具使用可参考这里)可以发现,这些线程每个大约占用0.7%~0.9%的CPU资源,那么这97个线程约占用了69.7%的CPU资源,而Linux并未启动这些线程,这也就可以从宏观上解释windows下CPU利用率比Linux高出60%多的现象了。

    3. NIO深度分析

    从openJDK下载WindowsSelectorImpl类的源码,可以发现:

    final class WindowsSelectorImpl extends SelectorImpl {
        ...
    }
    

    该类继承了SelectorImpl类,于是找到SelectorImpl类的源码:

    abstract class SelectorImpl extends AbstractSelector {
        ...
    }
    

    可以发现,该类继承了AbstractSelector抽象类。

    在Eclipse中,可以看到这个类的继承关系:
    在这里插入图片描述

    即这些类最终的实现类为Selector,在代码中找到使用Selector类的地方:

    int n = selector.select(25);
    

    Selector类的select()方法在SelectorImpl类中实现,具体如下:

    public int select(long timeout) throws IOException {
        if (timeout < 0)
            throw new IllegalArgumentException("Negative timeout");
        return lockAndDoSelect((timeout == 0) ? -1 : timeout);
    }
    

    select()方法调用了lockAndDoSelect()方法,源码如下:

    private int lockAndDoSelect(long timeout) throws IOException {
        synchronized (this) {
            if (!isOpen())
                throw new ClosedSelectorException();
            synchronized (publicKeys) {
                synchronized (publicSelectedKeys) {
                    return doSelect(timeout);
                }
            }
        }
    }
    

    lockAndDoSelect()方法调用了doSelect()方法,而doSelect()方法在SelectorImpl类中是抽象方法。

    protected abstract int doSelect(long timeout) throws IOException;
    

    其具体实现与操作系统相关,windwos系统中该方法在WindowsSelectorImpl类中实现,Linux系统中该类在EPollSelectorImpl类中实现。

    3.1 Windows下NIO的实现分析

    查看WindowsSelectorImpl类的源码,找到doSelect()方法,源码如下:

    protected int doSelect(long timeout) throws IOException {
        if (channelArray == null)
            throw new ClosedSelectorException();
        this.timeout = timeout; // set selector timeout
        processDeregisterQueue();
        if (interruptTriggered) {
            resetWakeupSocket();
            return 0;
        }
        // Calculate number of helper threads needed for poll. If necessary
        // threads are created here and start waiting on startLock
        adjustThreadsCount();
        finishLock.reset(); // reset finishLock
        // Wakeup helper threads, waiting on startLock, so they start polling.
        // Redundant threads will exit here after wakeup.
        startLock.startThreads();
        // do polling in the main thread. Main thread is responsible for
        // first MAX_SELECTABLE_FDS entries in pollArray.
        try {
            begin();
            try {
                subSelector.poll();
            } catch (IOException e) {
                finishLock.setException(e); // Save this exception
            }
            // Main thread is out of poll(). Wakeup others and wait for them
            if (threads.size() > 0)
                finishLock.waitForHelperThreads();
          } finally {
              end();
          }
        // Done with poll(). Set wakeupSocket to nonsignaled  for the next run.
        finishLock.checkForException();
        processDeregisterQueue();
        int updated = updateSelectedKeys();
        // Done with poll(). Set wakeupSocket to nonsignaled  for the next run.
        resetWakeupSocket();
        return updated;
    }
    

    该方法中,startLock是为了在需要时启动辅助线程,运行完一次即阻塞辅助线程,到下一次需要时再启动。finishLock是为了让主线程等到所有辅助线程运行完才一起返回。
    该方法中最重要的三个步骤分别为第12行、第16行和第22行,下面分别进行详细分析。

    3.1.1 调整辅助线程

    从WindowsSelectorImpl类的源码中可以找到adjustThreadsCount()方法的实现如下:

    // After some channels registered/deregistered, the number of required
    // helper threads may have changed. Adjust this number.
    private void adjustThreadsCount() {
        if (threadsCount > threads.size()) {
            // More threads needed. Start more threads.
            for (int i = threads.size(); i < threadsCount; i++) {
                SelectThread newThread = new SelectThread(i);
                threads.add(newThread);
                newThread.setDaemon(true);
                newThread.start();
            }
        } else if (threadsCount < threads.size()) {
            // Some threads become redundant. Remove them from the threads List.
            for (int i = threads.size() - 1 ; i >= threadsCount; i--)
                threads.remove(i).makeZombie();
        }
    }
    

    从注释可以看到,该方法在NIO中channel注册或者注销之后,对辅助线程的数量进行调整。其中threads.size()为当前辅助线程的数量,threadsCount为需要的辅助线程的数量。如果当前的数量小于需要的数量时,创建新的辅助线程,以达到需要的数量。如果当前的数量大于需要的数量,则杀掉多余的线程。
    该方法逻辑简单,但是需要深究一下这个需要的辅助线程数量threadsCount是如何计算的。通过查找发现,该变量在channel注册时,implRegister()方法调用growIfNeeded()方法来对其增加;当channel注销时,implDereg()方法对其减少。其中常量MAX_SELECTABLE_FDS=1024,即每增加1024个channel,就会增加一个辅助线程;每减少1024个channel,就会减少一个辅助线程。

    protected void implRegister(SelectionKeyImpl ski) {
        synchronized (closeLock) {
            if (pollWrapper == null)
                throw new ClosedSelectorException();
            growIfNeeded();
            channelArray[totalChannels] = ski;
            ski.setIndex(totalChannels);
            fdMap.put(ski);
            keys.add(ski);
            pollWrapper.addEntry(totalChannels, ski);
            totalChannels++;
        }
    }
    
    private void growIfNeeded() {
        if (channelArray.length == totalChannels) {
            int newSize = totalChannels * 2; // Make a larger array
            SelectionKeyImpl temp[] = new SelectionKeyImpl[newSize];
            System.arraycopy(channelArray, 1, temp, 1, totalChannels - 1);
            channelArray = temp;
            pollWrapper.grow(newSize);
        }
        if (totalChannels % MAX_SELECTABLE_FDS == 0) { // more threads needed
            pollWrapper.addWakeupSocket(wakeupSourceFd, totalChannels);
            totalChannels++;
            threadsCount++;
        }
    }
    
    protected void implDereg(SelectionKeyImpl ski) throws IOException{
        int i = ski.getIndex();
        assert (i >= 0);
        if (i != totalChannels - 1) {
            // Copy end one over it
            SelectionKeyImpl endChannel = channelArray[totalChannels-1];
            channelArray[i] = endChannel;
            endChannel.setIndex(i);
            pollWrapper.replaceEntry(pollWrapper, totalChannels - 1,
                                                                pollWrapper, i);
        }
        channelArray[totalChannels - 1] = null;
        totalChannels--;
        ski.setIndex(-1);
        if ( totalChannels != 1 && totalChannels % MAX_SELECTABLE_FDS == 1) {
            totalChannels--;
            threadsCount--; // The last thread has become redundant.
        }
        fdMap.remove(ski); // Remove the key from fdMap, keys and selectedKeys
        keys.remove(ski);
        selectedKeys.remove(ski);
        deregister(ski);
        SelectableChannel selch = ski.channel();
        if (!selch.isOpen() && !selch.isRegistered())
            ((SelChImpl)selch).kill();
    }
    

    从上面分析可知,当channel注册或者注销时,会增加或者减少辅助线程,那这个辅助线程SelectThread所完成的工作是什么呢?
    SelectThread类为WindowsSelectorImpl类的一个内部类,具体如下:

    // Represents a helper thread used for select.
    private final class SelectThread extends Thread {
        private final int index; // index of this thread
        final SubSelector subSelector;
        private long lastRun = 0; // last run number
        private volatile boolean zombie;
        // Creates a new thread
        private SelectThread(int i) {
            this.index = i;
            this.subSelector = new SubSelector(i);
            //make sure we wait for next round of poll
            this.lastRun = startLock.runsCounter;
        }
        void makeZombie() {
            zombie = true;
        }
        boolean isZombie() {
            return zombie;
        }
        public void run() {
            while (true) { // poll loop
                // wait for the start of poll. If this thread has become
                // redundant, then exit.
                if (startLock.waitForStart(this))
                    return;
                // call poll()
                try {
                    subSelector.poll(index);
                } catch (IOException e) {
                    // Save this exception and let other threads finish.
                    finishLock.setException(e);
                }
                // notify main thread, that this thread has finished, and
                // wakeup others, if this thread is the first to finish.
                finishLock.threadFinished();
            }
        }
    }
    

    从代码中可以看出,该线程run()方法里,主要逻辑是当获得startLock时,执行subSelector.poll(index),这个操作与doSelect()方法中第22行基本一样,稍后一起说明。

    小结: 到此,调整辅助线程这个步骤基本解释完了,其主要逻辑是根据channel数量来调整辅助线程的数据,而辅助线程的主要工作就是subSelector.poll(index)。

    3.1.2 启动辅助线程

    doSelect()方法第16行:

    startLock.startThreads();
    

    主要作用是启动辅助线程(具体可查看StartLock类的代码,这里不作详细解释),从上面分析可知,SelectThread需要获得startLock才执行。启动辅助线程后,这些线程主要操作就是subSelector.poll(index),这个操作与doSelect()方法中第22行基本一样,稍后一起说明。

    3.1.3 poll操作

    doSelect()方法第22行:

    subSelector.poll();
    

    的操作与SelectThread的工作基本一致,区别在于这里没有参数,而SelectThread中调用的poll()方法有index参数。
    首先找到SubSelector类,具体如下:

    private final class SubSelector {
            private final int pollArrayIndex; // starting index in pollArray to poll
            // These arrays will hold result of native select().
            // The first element of each array is the number of selected sockets.
            // Other elements are file descriptors of selected sockets.
            private final int[] readFds = new int [MAX_SELECTABLE_FDS + 1];
            private final int[] writeFds = new int [MAX_SELECTABLE_FDS + 1];
            private final int[] exceptFds = new int [MAX_SELECTABLE_FDS + 1];
    
            private SubSelector() {
                this.pollArrayIndex = 0; // main thread
            }
    
            private SubSelector(int threadIndex) { // helper threads
                this.pollArrayIndex = (threadIndex + 1) * MAX_SELECTABLE_FDS;
            }
    
            private int poll() throws IOException{ // poll for the main thread
                return poll0(pollWrapper.pollArrayAddress,
                             Math.min(totalChannels, MAX_SELECTABLE_FDS),
                             readFds, writeFds, exceptFds, timeout);
            }
    
            private int poll(int index) throws IOException {
                // poll for helper threads
                return  poll0(pollWrapper.pollArrayAddress +
                         (pollArrayIndex * PollArrayWrapper.SIZE_POLLFD),
                         Math.min(MAX_SELECTABLE_FDS,
                                 totalChannels - (index + 1) * MAX_SELECTABLE_FDS),
                         readFds, writeFds, exceptFds, timeout);
            }
    
            private native int poll0(long pollAddress, int numfds,
                 int[] readFds, int[] writeFds, int[] exceptFds, long timeout);
                 
            ......
            ......
    }
    

    从SubSelector类的源码可知,不管poll()方法是否带了参数,最后都是调用本地方法poll0(),去检测是否有channel发生了已注册的事件。

    3.1.4 总结

    通过以上分析,windows下NIO的select()的实现是:主线程只负责检测前1024个channel,其他channel分给相应的子线程SelectThread来完成(每个SelectThread线程负责检测1024个channel)。所以,当有大量连接(channel)时,就会启动大量的SelectThread来协助检测通道事件,导致CPU利用率很高。

    3.2 Linux下NIO的实现分析

    NIO在windows下占用大量CPU资源的原因找到了,但是Linux下为什么不会有同样的问题,这里就需要分析一下NIO在Linux下的实现了。

    上面分析提到过,在Linux系统中,doSelect()方法由EPollSelectorImpl类实现,具体如下:

    protected int doSelect(long timeout) throws IOException {
        if (closed)
            throw new ClosedSelectorException();
        processDeregisterQueue();
        try {
            begin();
            pollWrapper.poll(timeout);
        } finally {
            end();
        }
        processDeregisterQueue();
        int numKeysUpdated = updateSelectedKeys();
        if (pollWrapper.interrupted()) {
            // Clear the wakeup pipe
            pollWrapper.putEventOps(pollWrapper.interruptedIndex(), 0);
            synchronized (interruptLock) {
                pollWrapper.clearInterrupted();
                IOUtil.drain(fd0);
                interruptTriggered = false;
            }
        }
        return numKeysUpdated;
    }
    

    从源码中可以看出,该方法中主要操作就是第7行中的pollWrapper.poll(timeout),下面找到EPollArrayWrapper类中对poll()方法的实现,具体如下:

    int poll(long timeout) throws IOException {
        updateRegistrations();
        updated = epollWait(pollArrayAddress, NUM_EPOLLEVENTS, timeout, epfd);
        for (int i=0; i<updated; i++) {
            if (getDescriptor(i) == incomingInterruptFD) {
                interruptedIndex = i;
                interrupted = true;
                break;
            }
        }
        return updated;
    }
    

    可以看到,poll()方法主要操作是调用本地方法epollWait()来获取是否有通道事件。

    private native int epollWait(long pollAddress, int numfds, long timeout, int epfd) throws IOException;
    

    总结: 通过以上分析可知,Linux对select()的实现并未启动多个线程来检测channel,所以不会出现占用大量CPU资源的情况。

    4. 结语

    以上分析中看到的Windows下和Linux下NIO中select()实现的巨大差异,归根结底是因为windows和linux中网络IO模型不同:linux通过epoll实现,windows通过select实现。当然,这里分析也没有非常彻底,还可以继续探究上面分析中提到的本地方法,从而深入到系统所使用的网络IO模型,这才是问题真正的根源。以上内容如有错误之处,敬请各位指正。

    5. 参考

    http://www.code-sea.com/?p=97
    https://blog.csdn.net/yzq234040228/article/details/44493863
    https://blog.csdn.net/panxj856856/article/details/80432669

    展开全文
  • cpu-z CPU检测工具

    2012-11-21 19:09:35
    它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道和三通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • 家喻户晓的CPU检测软件,CPU-Z 支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能
  • CPU-Z/CPU检测软件,

    2013-12-05 20:57:20
    它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。 使用这个软件可以查看...
  • Cpu-Z CPU检测软件

    2011-03-08 23:53:41
    Cpu-Z是一款家喻户晓的...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • cpu-z”CPU检测软件

    2013-07-23 16:23:16
    它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。 使用这个软件可以查看...
  • Cpu-Z检测CPU软件

    2009-03-05 13:16:02
    Cpu-Z 是一款家喻户晓的...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • 查看CPU的信息 cpu-z

    2009-06-17 09:45:33
    Cpu-Z 是一款家喻户晓的...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • cpu-z(CPU检测软件)

    2010-04-28 10:40:47
    它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道和三通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • CPU检测软件

    2012-07-10 11:27:27
    它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道和三通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • cpu-z检测cpu小工具

    2009-04-15 20:13:21
    它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。 纯文本版报告虽然看的...
  • 家喻户晓的CPU检测软件,CPU-Z 支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能
  • 介绍 I/O通道是DMA的进一步发展,进一步减少CPU的干预,DMA是每次对一个数据块进行操作,通道是一次对一组数据块进行操作。 通道实质是简单的处理器。...4.启动通道,开始步骤6 5.设备驱动程序阻塞,CPU调度

    介绍

    I/O通道是DMA的进一步发展,进一步减少CPU的干预,DMA是每次对一个数据块进行操作,通道是一次对一组数据块进行操作。
    通道实质是简单的处理器。拥有命令寄存器,地址寄存器,有通道程序,指令单一,但是没有专有的内存

    执行过程

    CPU中
    1.用户进程提出I/O请求,唤醒设备驱动进程(参考 其他文章,我后续会写专门文章介绍)
    2.设备驱动进程根据请求参数组织和生成通道程序(是自动生成,不是人工写的)
    3.通道程序起始地址送入通道地址寄存器CAW
    4.启动通道,开始步骤6
    5.设备驱动程序阻塞,CPU调度执行其他进程。
    通道中
    6.根据CAW值从内存提取一条通道指令送入通道命令寄存器CCW,CAW加一指向下一条通道指令。
    7.执行CCW指向的指令执行。
    8.若不是最后一条通道指令,返回6继续执行。若是的话发出中断请求。

    通道程序与通道指令

    通道程序是由一组通道指令构成
    下面举出一个简单通道程序

    操作码通道程序结束标志记录结束标志数据读写字节计数内存地址
    WRITE00802680
    WRITE001401034
    WRITE11250720

    该通道程序由三条通道指令构成,将数据写到磁盘上
    操作码WRITE表示写操作
    通道结束标志,0表示不是最后一条,1表示是最后一条通道指令
    记录结束标志,前两个为0,后一个为1,表示三条指令操作的数据写到一个
    记录上
    内存地址,该条指令要操作的内存首址

    要结合上面执行过程进行理解。
    有问题留言提问

    展开全文
  • 通道技术

    千次阅读 多人点赞 2016-04-12 10:31:26
    1.通道及其作用: ... 它有自己的通道指令,这些通道指令受CPU启动,并操作结束时向CPU发中断信号。 通道方式进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。   2.双通道技术:
    1.通道及其作用: 
    

    通道是一个独立于CPU的专管输入/输出控制的处理机,它控制设备与内存直接进行数据交换。引入通道的目的是:使数据的传输独立于CPU,使CPU从繁重的I/O工作中解脱出来它有自己的通道指令,这些通道指令受CPU启动,并在操作结束时向CPU发中断信号。

    通道方式进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。

     

    2.双通道技术:

    双通道,其实就是两个内存控制器。什么叫内存控制其呢?如果把CPU比如成工厂,内存比喻成仓库,那么内存控制器就是仓库管理员。单通道就是工厂到仓库只有一个门,一个管理员,每次只能提一批货。双通道就是又盖了一个仓库,又多了一个管理员,同时给工厂提供原料,每次提供的原料多了一倍

    我们加大内存就等于加大仓库,仓库大了,备货足,工厂不用老上外面买东西去,生产速度自然快。仓库管理员多了一个,多了一个给工厂提供原料的出口,仓库向工厂提供原料的速度加快,工厂自然也快乐。大概就是这个道理。

    至于什么东西支持双通道。这要分开来说。

    1) 对于Intel所有的CPU,和soket462架构的AMD K7产品,是否支持双通道,主要看主板有没有两个内存控制器,有没有两个仓库管理员,因为上述系统的内存控制是做在主板的北桥芯片中,也就说仓库管理员的组织关系归主板管,所以是否支持双通道,跟CPU没关系。

    2) AMD所有的K8,以及现在新出的754架构的闪龙,他们的系统内存控制器做到CPU里面了,也就是说仓库管理员的组织关系归CPU管,所以,这个系统,是否支持双通道,CPU说了算,跟主板没关系。例如所有754针脚的CPU都只能支持单通道,并不支持双通道。所有939针脚的CPU都支持双通道。

    至于支持双通道的主板有哪些?我们常见的Intel的芯片组,848865PE(没有E不行)以上的,都会支持双通道。其他VIA,以及SIS等的芯片组主板,你应当在它产品信息里面查到是否双通道。如果是上面第二种情况,你只用考虑是买 939AMD,还是754AMD就好了

    展开全文
  • cpu复位怎么运行?

    千次阅读 2013-10-16 13:17:28
    cpu只和前端总线连接,也就是直接连接到北桥,那么cpu加电,第一个做的就是将这个地址放到地址总线上,等待代码的来临,这个地址会被北桥感觉到,是不是北桥会预先就知道,这个地址是系统bios芯片的地址,所以不会...
  • 它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道和三通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。 绿色版本 ...
  • cpu-z检测工具

    2017-09-01 16:23:49
    CPU检测软件cpuz支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • Cpu-Z 是一款家喻户晓的...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • 它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。  另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件
  • CPU硬件查询软件

    2011-11-24 10:37:00
    它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道和三通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • Cpu-Z是一款家喻户晓的...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • Cpu-Z 是一款家喻户晓的...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • cpu-z_1.82

    2018-01-11 12:24:15
    CPU-Z,是一款CPU检测软件,除了使用Intel或AMD自己的检测软件之外,...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还”“能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能
  • libvirt/qemu特性之cpu hotplug

    千次阅读 2014-01-20 19:24:53
    目前qemu(1.7)/libvirt(1.2)只实现了cpu 的hotadd功能。hot remove还实现中。 libvirt进行cpu hot add的过程: 虚拟机中安装qemu-agent配置libvirt...启动虚拟机、Guest中查看VCPU数目ls /sys/devices/system/cpu
  • ----------------------...它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件。
  • 它支持的CPU种类相当全面,软件的启动速度及检测速度都很快。  另外,它还能检测主板和内存的相关信息,其中就有我们常用的内存双通道检测功能。当然,对于CPU的鉴别我们还是最好使用原厂软件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,619
精华内容 20,647
关键字:

在cpu启动通道后