精华内容
下载资源
问答
  • 今天阅读LINUX内核情景分析,终于搞清楚了几个问题,甚是高兴。 一、说一个CPU 是“16位”和“32位”时,到底是指什么呢? 二、intel X86系列处理器中“实模式”和“保护模式”到底是怎么回事? 三、Intel Pentium ...

    今天阅读LINUX内核情景分析,终于搞清楚了几个问题,甚是高兴。

    1. 一、说一个CPU 是“16位”和“32位”时,到底是指什么呢?
    2. 二、intel X86系列处理器中“实模式”和“保护模式”到底是怎么回事?
    3. 三、Intel Pentium Pro处理器的内存扩展机制PSE和PAE是如何工作?

    一、通常,在人们提到一款处理器是“16位”或“32位”时是指什么呢"?

    其实是指:处理器中“算术逻辑单元”(ALU)的宽度。然而一直以来,我都认为是指CPU地址总线的位数,好惭愧啊。比如,16位8086CPU,其地址总线是20位。

    二、intel X86系列处理器中“实模式”和“保护模式”到底是怎么回事?

    作为一名程序员,以前经常在一些书籍中看到“实模式”和“保护模式”,但其究竟是个什么概念?一直以来也是不知其所以然。今天在阅读Linux内核情景分析时,终于意外地对这两概念有个粗略认识了。其实,很简单。“实模式”和“保护模式”是X86系列CPU的两种工作模式,在“实模式”下,CPU的寻址缺乏对内存的保护,一个进程可以随心所欲的访问内存中的任何一个单元,不受任何限制。相反,在“保护模式”下,CPU给系统提供了内存访问控制机制,可以很好地进行进程的访问控制。关于X86如何实现内存访问的保护?若有兴趣的话,可参阅相关书籍。

    三、Intel Pentium Pro处理器的内存扩展机制PSE和PAE是如何工作?

    关于这部分内容,若要深入了解,推荐大家下载pentium-pro-2系统体系的电子版看看。PSE和PAE分别是两种内存扩展机制。启动PSE时,页面大小扩充4M,寻址空间仍然是4G。启动PAE时,页面大小是2M,并且可将32位的线性地址转换成36位的物理地址,寻址空间达到64G。要启用PAE机制必须将CR4寄存器中的PAE标志置位。

    PAE启用后,处理器会对分页机制做如下更改:

    (1)将64GB的内存空间划分成2^24个不同页面,页表项的体积扩展为64位,物理地址域扩展为24位;
    (2)引入新的最高一级页表,称为页目录指针表(PDPT),其中包含4个64位的项;
    (3)CR3寄存器中包含27位的PDPT的高位地址(其低5位地址为0);
    (4)当将线性地址映射到4KB的页面时,CR3由高位到低位依次为2位PDPT索引,9位页目录索引,9位页表索引,12位页内偏移;当将线性地址映射到4MB的页面时,CR3由高位到低位依次为2位PDPT索引,9位页目录索引,21位页内偏移。

    需要注意,PAE机制并未增大单个进程能够访问的地址空间,仅仅将内核能够访问的地址空间增加到了64GB。

    以下是PAE地址转换图:

    image image

    展开全文
  • 本文系转发,分析Linux文件系统同步和异步的预读机制,有图有真相,比较形象。... 所谓预读,是指文件系统为应用程序一次读出比预期更多的文件内容并缓存在page cache中,这样下一次读请求到来时部分页面直接从page ca
        

    640?wx_fmt=png&wxfrom=5&wx_lazy=1

    本文系转发,分析Linux文件系统同步和异步的预读机制,有图有真相,比较形象。

    预读可以提高CPU和硬盘工作的并行度,减小APP延迟。

    主要阐述内核(linux-3.12)的文件系统预读及时的设计和实现,可能有理解不全面的地方,望各位能多多指教。

            所谓预读,是指文件系统为应用程序一次读出比预期更多的文件内容并缓存在page cache中,这样下一次读请求到来时部分页面直接从page cache读取即可。当然,这个细节对应用程序透明,应用程序可能的感觉唯一就是下次读的速度会更快,当然这是好事。

            由于应用程序的访问行为存在多样性加上作者对预读的把握不是非常深入,因此,难免存在不是非常精确的地方,望多赐教。我们会通过设置几个情境来分析预读的逻辑。

    情境1


    // 事例代码

    640?wx_fmt=png

         该场景非常简单:打开文件,共进行三次读(且是顺序读),那让我们看看操作系统是如何对文件进行预读的。

    Read 1

            第一次进入内核读处理流程时,在page cache中查找该offset对应的页面是否缓存,因为首次读,缓存未命中,触发一次同步预读:

    640?wx_fmt=png

    该同步预读逻辑最终进入如下预读逻辑:

    640?wx_fmt=png

      读逻辑会为该文件初始化一个预读窗口:(ra->start, ra->size, ra->async_size),本例中的预读窗口为(0,4,3),初始化该预读窗口后调用ra_submit提交本次读请求。形成的读窗口如下图所示:

    640?wx_fmt=jpeg

    图中看到,应用程序申请访问PAGE 0,内核一共读出PAGE0 ~PAGE3,后三个属于预读页面,而且PAGE_1被标记为PAGE_READAHEAD,当触发到该页面读时,操作系统会进行一次异步预读,这在后面我们会仔细描述。

            等这四个页面被读出时,第一次读的页面已经在pagecache中,应用程序从该page中拷贝出内容即可。

    Read 2

            接下来应用程序进行第二次读,offset=4096, size=8192。内核将其转化为以page为单位计量,offset=1,size=2。即读上面的PAGE1和PAGE2。

            感谢第一次的预读,PAGE1和PAGE2目前已经在内存中了,但由于PAGE1被打上了PAGE_AHEAD标记,读到该页面时会触发一次异步预读:

    640?wx_fmt=png

    640?wx_fmt=png

     经历了第一次预读,文件的预读窗口状态为(ra->start,ra->size, ra->async_size)=(0, 4, 3),本次的请求为(offset,size)=(1, 2),上面代码的判断条件成立,因此我们会向前推进预读窗口,此时预读窗口变为(ra->start,ra->size, ra->async_size) = (4, 8, 8)

            由于本次是异步预读,应用程序可以不等预读完成即可返回,只要后台慢慢读页面即可。本次预读窗口的起始以及大小以及预读大小可根据前一次的预读窗口计算得到,又由于本次是异步预读,因此,预读大小就是本次读的页面数量,因此将本次预读的第一个页面(PAGE 4)添加预读标记。

    640?wx_fmt=png

     由于上面的两次顺序读,截至目前,该文件在操作系统中的page cache状态如下:

    640?wx_fmt=png

    Read 3

            接下来应用程序进行第三次读,顺序读,范围是[page3, page6],上面的预读其实已经将这些页面读入page cache了,但是由于page4被打上了PAGE_READAHEAD标记,因此,访问到该页面时会触发一次异步预读,预读的过程与上面的步骤一致,当前预读窗口为(4,8,8),满足顺序性访问特征,根据特定算法计算本次预读大小,更新预读窗口为(12,16,16),新的预读窗口如下:

    640?wx_fmt=jpeg

      对该情境简单总结下,由于三次的顺序读加上内核的预读行为,文件的page cache中的状态当前如下图所示:

    640?wx_fmt=jpeg

    情景2


    刚才描述最简单的一种预读情况:单进程文件顺序读,且读大小不超过32页面,这里我们来看另外一种情境:单进程文件顺序读,读大小为256KB,看看预读逻辑如何处理这种情况,照例首先给出事例代码:

    640?wx_fmt=png

          事例代码中我们一共进行了三次读,顺序读,且读的大小不定,有超过最大预读量的,也有低于最大预读量的。

    Read 1

            毫无疑问,由于第一次读肯定未在缓存命中,前一篇博客告诉我们需要进行一次同步预读,需要初始化预读窗口

    640?wx_fmt=png

      在初始化预读窗口中判断得出:ra->size=32 pages,即使应用程序要读的数量是40 pages,这样ra->async_size = ra->size=32 pages,在readit逻辑判断成立,因此会重设ra->async_size的值,根据计算应该是32 pages,而总的ra->size=初始值+ra->async_size=64 pages。形成的预读窗口为(0, 64, 32),如下图:

    640?wx_fmt=png

     由于应用程序本次访问的实际页面是PAGE0 ~PAGE40(由于同步预读会全部在缓存命中),因此在访问过程中会碰到page32,此时触发一次异步预读,并向前推进预读窗口:

    640?wx_fmt=png

    更新后的当前预读窗口为(64, 32, 32),如下:

    640?wx_fmt=png

    因此,经过第一次读以后,该文件在内存中page cache状态如下图所示:

    640?wx_fmt=png

    Read 2

            由于第二次读只需读出page40 ~ page55,直接在page cache中命中,也不会触发一次异步预读,预读窗口也不会更新,因此,该过程非常简单。本次读完以后,文件在内存page cache的状态如下:

    640?wx_fmt=png

    Read3

            应用程序第三次读的范围为page56 ~ page87,由上图可知,这些均可以在page cache中命中,但是由于访问了PAGE64,因此会触发一次异步预读,且当前的预读窗口为(64, 32, 32),根据上面的算法更新预读窗口为(96, 32, 32),因此,本次预读完成以后,文件在page cache中的缓存状态如下:

    640?wx_fmt=png

    总结

            我们可以将本情境与情景1中描述的情境对比,其实可以发现两者思想完全一致,只是由于应用程序读的粒度不同导致了预读的粒度更大,仅此而已。


    情景3


    情景1和2关于文件系统的预读我们通过实例阐述了应用程序的顺序读而触发操作系统对文件大小预取情况,情景3我们主要描述预读如何解决交织读的问题。所谓的交织读指的是多线程(进程)读同一个打开的文件描述符,单个线程的顺序读在操作系统看来可能会变成随机读。同样我们还是结合实例来分析。

    事例代码

    640?wx_fmt=png

      事例代码中创建了两个线程同时读文件file,每个线程均是顺序读,让我们看看操作系统的预读是如何处理这种情况的。因为多线程的执行顺序可能是多种多样的,我们只列举一种执行流并解释,线程1 read 1,线程2 read 1,线程2 read 2,线程1 read 2,线程1 read 3,线程2 read3。

    线程1 Read 1

            线程1读文件的前两个页面,由于尚未缓存命中,因此会触发文件系统的一次同步预读,确定预读窗口为(ra->start, ra->size, ra->async_size) = (0, 4, 2),形成的预读窗口如下:

    640?wx_fmt=png

    线程2 Read 1

            线程2读文件的128和129两个页面,由于这两个页面也尚未缓存在page cache中,也必须启动一次同步预读,这里会更改上面的预读窗口为(128, 4, 2),更新后的预读窗口如下:

    640?wx_fmt=png

    线程2 Read 2

            由于本次读和上次读是顺序读,且本次访问的4个页面有两个缓存命中,但由于访问了PAGE 130,而该页面又被打上了异步预读标记,因此在访问页面130的时候会触发一次异步预读,更新预读窗口为(132, 8, 8),如下:

    640?wx_fmt=png

       由于本次会访问4个页面,因此PAGE 132也会被访问,从而又触发一次异步预读,更新预读窗口为(140, 16, 16),最终形成的预读窗口如下:

    640?wx_fmt=png

    线程2两次读 read1 和read 2以后形成的page cache状态如下所示:

    640?wx_fmt=png

    线程1 Read 2

            接下来线程1进行第二次读,范围是PAGE 2 ~ PAGE 5,由于线程1 read 1将PAGE 2 和PAGE 3已经预读进page cache,因此可直接命中,但在访问PAGE 2的时候会触发一次异步预读,所以这里会更新预读窗口,但很不幸,预读窗口保存的是线程2的预读状态,因此本次访问和之前的预读窗口并不连续,因此我们必须想办法来恢复线程1的之前的预读状态,会触发下面的执行逻辑:

    640?wx_fmt=png

    这里恢复线程1的预读窗口方法也比较简单:从本次预读的页面开始向后搜索,找到第一个没有缓存在page cache的页面,本例中是page4,然后以此为本次预读的起始页面号,并可以计算出上次的预读窗口大小(page 4 - page 2 = 2),根据这两个值便可确定本次预读窗口为(4, 8, 8)。

            更新后的预读窗口如下图所示:

    640?wx_fmt=png

       在访问页面4时,会再次出发异步预读,更新预读窗口为(8, 8, 8),如下图所示:

    640?wx_fmt=png

    因此,线程1经过read 1 和read 2,形成的page cache状态如下:

    640?wx_fmt=png

    线程1 Read 3

            线程1第三次读的页面是PAGE 6 ~ PAGE 13,全部在缓存命中,但在访问PAGE 8的时候会触发一次异步预读,更新预读窗口为(16, 16, 16)。

            在线程1经历了三次读以后,page cache的状态如下图所示:

    640?wx_fmt=png

    线程2 Read 3

            线程2第三次读页面是PAGE 134 ~ PAGE 141,这些全在缓存中命中,但是访问PAGE 140时会触发一次异步预读。更新预读窗口,但是很不幸,之前的预读窗口是线程1的,因此我们必须搜寻才能恢复线程2的预读窗口,搜寻过程之前已经描述,这里不再啰嗦,恢复出线程2的预读窗口为(156, 32,32)。因此,总的来看,由于线程2的三次读形成的page cache状态如下:

    640?wx_fmt=png


    展开全文
  • TPS是指1秒钟能处理的交易数,由于以太坊出块速度是固定的,每15秒一个区块,因而以太坊的TPS值由一个区块里能够打包的交易数量决定。和比特币将区块大小限制在1M不同,以太坊对区块大小并没有限制,因而理论上一个...

        TPS是指1秒钟能处理的交易数,由于以太坊出块速度是固定的,每15秒一个区块,因而以太坊的TPS值由一个区块里能够打包的交易数量决定。和比特币将区块大小限制在1M不同,以太坊对区块大小并没有限制,因而理论上一个区块可以打包任意多的交易,因此以太坊的TPS应该可以无限高啊,网络上以太坊的"低TPS评价"又是怎么来的呢?

        数据是最不能说谎的,我们以事实为依据,我们先来看下“以太猫"盛行时以太坊网络阻塞不堪时的区块交易数量(TPS),因为这个状态下的区块交易数(TPS)其实就接近最高值了。

    “以太猫“时期TPS分析

        “以太猫"发布于2017.11.23。然后很快就风靡以太圈,从12月3日开始,以太坊待处理交易几乎直线上升,也就是说网络已经开始产生拥堵。到12月9开始,以太网络被以太猫搞死的消息开始广泛传播。

        所以我们看看12月9日当日的区块交易数量数据

     

      

        从上面可见这一天的区块交易数量也就在100左右。

    TPS为啥这么低

        为啥只有100左右呢?最开始我们分析过,TPS应该可以无限高啊?肯定有其他因素限制着。其实有两个因素

        1)全网广播速度限制

            以太坊对区块没有限制,但是网络广播速度限制了区块的大小。我们知道一个新块生产出来后需要全网广播,然后需要全网超过51%的节点收到该新区块才能得到认可。区块越大,数据量就大,全网广播的时间就越长。但是全网广播又必须尽量在下一个区块生产出来之前完成,所以这个全网广播时间就有了限制,就是区块出块速度。目前数据显示,1M的数据全网广播需要1.5s左右。因而以太坊在加上全网广播速度限制后,它的区块大小理论上最高可到10M.因此我们来看看上面的区块大小是不是10M,

        出乎意料,区块只有22k大小,和上面的10M大小相差甚远。因而这个因素不是罪魁祸首。那真正的“凶手”在哪里呢?

        2)gasLimit限制

         就是区块的总gas量,区块中的所有交易使用的油量的总和不能超过这个限制,并且这个油量限制是动态调整的。

        

    区块gasLimit源码分析

        区块gas限制的逻辑在core/block_validator.go文件中

    1)常量

        GasLimitBoundDivisor=1024

        MinGasLimit=5000,区块最小的油量限制

        TargetGasLimit=4712,388,是可以更新的,这个值最开始是5000,等于创世纪块的gasLimit.

     

    2)具体算法

       核心部分为蓝色框和红色框代码

        当gasLimit > TargetGasLimit时:

            蓝色框起作用。其逻辑是如果parentGasUsed > parentLimit*2/3,蓝色框为正,相当于要增加这一个块的gasLimit,否则是减少。增加的速度由GasLimitBoundDivisor值决定。

        当gasLimit < TargetGasLimit时:

            红色框起作用,目的是按照GasLimitBoundDivisor的速率尽快让gasLimit达到TargetGasLimit。这个主要是因为TargetGasLimit是可以更新的,当更新后,需要将区块gasLimit慢慢的向新TargetGasLimit接近,当到达这个值后,就由蓝色框部分动态调整gasLimit.并且以后永远不会出现gasLimit < TargetGasLimit,直到设置下一个更大的值。

     

    gasLimit提速问题

        从上面我们看出,如果网络中的交易数量一直是增长的,没有波动,则gasLimit会不断变大。但是如果系统不断波动,gasLimit就可能不怎么增长。在全网交易量大增,TPS确实是可以动态提高的,但是这个提升是慢慢的,对于“以太猫”这种剧增是没法应付的。理论上当出现“以太猫”这种剧增后,如果一直保持,整个系统的TPS会不断提高的,但是由于“以太猫”导致的网络拥堵使得大家苦不堪言,市场立马出现两种"应急"反馈。

        1)交易费疯长导致普通交易量减少

        2)媒体开始呼吁抵制以太猫,导致以太猫后期交易变少

        3) 低TPS预期导致开发人员没有开发高交易量智能合约的需求

        这些反馈使得网络的交易量剧增只保留了一段时间,从而没有足够时间让以太坊TPS提升到足够轻松应对以太猫正常要求的交易量。其实这个有点像我们跑步,如果“三天打鱼,两天晒网”,我们的耐力没法提升的,必须持续一段时间一直跑才有效果,并且是一级一级提升。

        

        总的来说,以太坊本身具备缓慢持续提升TPS的能力,但是波动性的峰值TPS需要TargetGasLimit来解决,它相当于设置了最低gasLimit,可以解决峰值问题。

    |**************************************************
    * 本文来自CSDN博主"爱踢门",喜欢请点关注
    * 转载请标明出处:http://blog.csdn.net/itleaks
    ***************************************************|

    如果你对EOS,ETH技术及开发感兴趣,请入QQ群讨论: 829789117


    如需实时查看最新文章,请关注公众号"区块链斜杠青年",一起探索区块链未来

    展开全文
  • 本文《go调度器源代码情景分析》系列 第一章 预备知识的第2小节。 内存计算机系统的存储设备,其主要作用协助CPU在执行程序时存储数据和指令。 内存由大量内存单元组成,内存单元大小为1个字节(1字节...

    本文是《go调度器源代码情景分析》系列 第一章 预备知识的第2小节。


     

    内存是计算机系统的存储设备,其主要作用是协助CPU在执行程序时存储数据和指令。

    内存由大量内存单元组成,内存单元大小为1个字节(1字节包含8个二进制位), 每个内存单元都有一个编号,更专业的说法是每一个内存单元都有一个地址,我们在编写汇编代码或编译器把用高级语言所写的程序编译成汇编指令时,如果要读写内存,就必须在指令中指定内存地址,这样CPU才知道它要存取哪个或哪些内存单元。

    大家都知道,高级语言中有变量的概念,变量又有全局变量和函数局部变量之分,而不管是哪种变量(除了C语言中申明为register的变量),都需要保存在内存之中, 同时,绝大多数类型的变量都不会只占一个字节大小的内存,但是每个内存单元却只有一个字节大小,那么像这种大于一个字节的变量是如何保存在内存中的呢?聪明的你一定会想到,任何大于一个字节的变量都存储在相邻的几个内存单元中,事实也确实如此,比如go语言中的int64类型的变量在内存中就被存放在连续的8个内存单元之中,要读写该变量,只需在汇编指令中指定这些内存单元的起始地址以及读写的字节数即可。说到这里,问题又来了,既然一个int64类型的变量在内存中占8个字节,那么如何安排这8个字节来存储64位的整型数据呢?比如如何在内存中存储0x1122334455667788这个16进制表示的整型值,是把高位的0x11放在这8个内存单元中的第一个字节还是把低位的0x88放在第一个字节呢?其实两种方案都是可以的,不同的CPU采用的方案也可能不同,比如X86系列(包括AMD64)的CPU就会把低位的0x88放在起始位置,而PowerPC CPU则会把高位的0x11放在起始的第一个字节,这就是所谓的大小端存储模式:

    • 大端存储模式:数据的高字节保存在内存的低地址中,低字节保存在内存的高地址中。
    • 小端存储模式:数据的高字节保存在内存的高地址中,低字节保存在内存的低地址中。

    需要注意的是大小端存储模式与CPU相关,而与内存无关,内存只管保存数据而不关心数据是什么以及怎么解释这些数据。下图是大小端存储模式的示意图:

     

     

     

    下面再用上一节讨论寄存器时使用过的例子来帮助我们加深对内存的理解:

    c = a + b // go语言代码
    

     

    mov (%rsp),%rdx     #把变量a的值从内存中读取到寄存器rdx中
    mov 0x8(%rsp),%rax  #把变量b的值从内存中读取到寄存器rax中
    add %rdx,%rax       #把寄存器rdx和rax中的值相加,并把结果放回rax寄存器中
    mov %rax,0x10(%rsp) #把寄存器rax中的值写回变量c所在的内存


    这里的4条指令有3条跟内存读写有关,指令中的rsp寄存器里面存放的是一个内存地址,现假设这个内存地址是X, 则第一条指令 mov (%rsp),%rdx 表示把从地址为X开始的8个内存单元中的值读取到rdx寄存器中(因为rdx是一个64位寄存器,这就隐含了要一次读取连续的8个字节,指令中的地址只是起始地址,这个地址开始的8个字节是变量a所在的位置),第二条指令类似,只是起始地址为X + 0x8(变量b在内存中的地址),最后一条指令表示把rax寄存器中的值写入从地址为X + 0x10开始的8个内存单元中。下图直观的表示了上面4条指令的执行过程。

     

    对这个图做个简单的说明:

    1. 这里假定rsp寄存器的值是X
    2. 图中的内存部分,每一行有8个内存单元,它们的地址从右向左依次加一,即如果最右边的内存单元的地址为X的话,则同一行最左边的内存单元的地址为X+7。
    3. 灰色箭头表述数据流动方向
    4. 紫红色数字n表示上述代码片段中的第n条指令

     

    最后,我们对内存部分做个简单的总结:

    • 内存中的每个字节都有一个地址;
    • 任何大于一个字节的变量在内存中都存储在相邻连续的的几个内存单元之中;
    • 大端存储模式指数据的高字节保存在内存的低地址中,低字节保存在内存的高地址中;小端存储模式指数据的高字节保存在内存的高地址中,低字节保存在内存的低地址中。

     

    转载于:https://www.cnblogs.com/abozhang/p/10767954.html

    展开全文
  • 只可以近亲进程使用,不可以再任意两个进程通信使用,所以只能实现"有名","有形"的文件来实现就可以克服其缺点,这里的有名:一个文件应该有文件名,使得任何进程可以通过文件名或者路径找到该文件,有形文件的inode...
  • Tasklet一词的原意是“小片任务”的意思,这里是指一小段可执行的代码,且通常以函数的形式出现。软中断向量HI_SOFTIRQ和TASKLET_SOFTIRQ均是用tasklet机制来实现的。 从某种程度上讲,tasklet机制是Linux内核对BH...
  • Linux内核源代码情景分析读书笔记(1)-Intel X86CPU寻址方式 1.CPU的位数,如16位或32位,是指处理器中“算术逻辑单元(ALU)”的宽度。通常,系统总线中的数据部分(数据总线),与ALU具有相同的宽度(但也...
  • 众所周知:Windows系统一个分时抢占式系统,分时每个线程分配时间片,抢占时间片到期前,中途可以被其他更高优先级的线程强制抢占。 背景知识:每个cpu都有一个TSS,叫‘任务状态段’。这个TSS内部中的一些...
  • windows内核情景分析---设备驱动

    千次阅读 2014-04-04 10:20:23
    设备栈:从上层到下层的顺序依次:过滤设备、类设备、过滤设备、小端口设备【过、类、过滤、小端口】 驱动栈:因设备堆栈原因而建立起来的一种堆栈  老式驱动:不提供AddDevice的驱动,又叫NT式驱动 Wdm驱动...
  • 区块数据同步分为被动同步和主动同步被动同步是指本地节点收到其他节点的一些消息,然后请求区块信息。比如NewBlockHashesMsg主动同步是指节点主动向其他节点请求区块数据,比如geth刚启动时的syning,以及运行时...
  • 设备栈:从上层到下层的顺序依次:过滤设备、类设备、过滤设备、小端口设备【过、类、过滤、小端口】 驱动栈:因设备堆栈原因而建立起来的一种堆栈 老式驱动:不提供AddDevice的驱动,又叫NT式驱动 Wdm驱动:...
  • windows内核情景分析---内核对象

    千次阅读 2014-04-04 10:10:58
    写过Windows应用程序的朋友都...Job、Directory(对象目录中的目录)、SymbolLink(符号链接),Section(内存映射文件)、Port(LPC端口)、IoCompletion(Io完成端口)、File(并非专磁盘文件)、同步对象(Mutex
  • 系统调用是指使用类似函数调用的方式调用操作系统提供的API。 虽然从概念上来说系统调用和函数调用差不多,但本质上它们有很大的不同,操作系统的代码位于内核地址空间,而CPU在执行用户代码时特权等级很低,无权...
  • 物理页面的使用和周转 1. 几个术语 1.1 虚存页面 ...指虚拟地址空间中一个固定大小, 边界与页面大小 4KB 对齐的区间及其... 通常说物理内存页面的分配和释放是指 物理介质, 而谈及页面的换入和换出的时候...
  • 写过Windows应用程序的朋友...Job、Directory(对象目录中的目录)、SymbolLink(符号链接),Section(内存映射文件)、Port(LPC端口)、IoCompletion(Io完成端口)、File(并非专磁盘文件)、同步对象(Mutex...
  • 被动同步是指本地节点收到其他节点的一些消息,然后请求区块信息。比如NewBlockHashesMsg 主动同步是指节点主动向其他节点请求区块数据,比如geth刚启动时的syning,以及运行时定时和相邻节点同步 被动同步  ...
  • 物理页面的使用和周转1. 几个术语1.1 虚存页面指虚拟地址空间中一个固定...另外, 通常说物理内存页面的分配和释放是指 物理介质, 而谈及页面的换入和换出的时候, 是指他的内容。1.3 交换技术当系统内存不够用的时
  •  5.1 概述 构成一个操作系统最重要的就是 进程管理 与 文件系统; 有些操作系统有进程管理而没有文件系统,有些...狭义的文件:磁盘文件,进入可以有序地存储在任何介质中(包括内存)的一组信息。 广义的
  • 当我们说一个CPU“16位”或“32”位时,处理器中“算数逻辑单元”(ALU)的宽度。数据总线通常与ALU具有相同的宽度。当Intel决定在16位CPU 8086中采用1M字节的内存空间,地址总线的宽度也就确定了,那就是20...
  • 爆强图片分析

    千次阅读 2012-04-13 20:00:30
    本图,最近的左边那男的,我来分析一下。只用一个手如此休闲的姿势一般看网页或看资料,那一般会右手用鼠标或是方向键,做基本操作。专业人士做简单的办工,那一般也右手用小键盘来输入数字。而这个哥用的...
  • “注册消防工程师”,是指经考试取得相应级别注册消防工程师资格证书,并依法注册后,从事消防技术咨询、消防安全评估、消防安全管理、消防安全技术培训、消防设施检测、火灾事故技术分析、消防设施维护、消防安全...
  • 您与该职位不太合适,无法进入面试阶段。建议参考STAR法则对简历进行修改,并突出您在专业知识方面的优势。 ... Ssituation,中文含义是情景,也就是在面谈中我们要求应聘者描述他在所从...
  • 引用毛德操在《Linux 内核源代码情景分析》中的一段话: 若要问构成一个“操作系统”的最重要的部件什么,那就莫过于进程管理和文件系统了。事实上,有些操作系统(如一些“嵌入式”系统)可能有进程管理而没有...
  • redis的一些问题分析

    2019-06-02 19:45:41
    在数据库事务的情景下,原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。 对于Redis而言,命令的原子性:一个操作的不可以再分,操作要么执行,...
  • 文章目录前言正文一、定义二、情景假设三、情景分析四、模式结构及分析(一) 模式结构1. 类适配器2. 对象适配器(二) 模式分析(1) 模式特点(2) 模式缺点五、使用情景六、延申及拓展总结 前言 文章内容主要参考了刘伟...
  • Redis API的原子性分析

    2018-03-13 22:44:00
    在数据库事务的情景下,原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。【维基百科】 对于Redis而言,命令的原子性:一...

空空如也

空空如也

1 2 3 4 5
收藏数 91
精华内容 36
关键字:

情景分析是指