解析Winndows 2000/XP物理内存管理

用 SAP HANA SDA 访问 PostgreSQL:从可行性到落地实践的完整指引 摘要:SAP HANA可通过SDA/SDI技术访问PostgreSQL数据库,支持数据虚拟化和实时复制。主要实现路径包括:1)使用Camel JDBC适配器创建虚拟表进行联邦查询;2)利用PostgreSQL Log Reader适配器实现变更数据捕获(CDC)。实施时需配置Data Provisioning Agent,注意权限和网络要求。官方文档指出,通过SDI+DP Agent的方式比直接SDA连接更稳定可靠。虚拟化查询时,HANA会自动将SQL下推到PostgreSQL执行,优化性能。 阅读详情

解析Winndows 2000/XP物理内存管理

   物理内存是相对比较紧张的资源,合理利用将是一个操作系统的性能的关键。Windows 2000/XP内部使用一个称为页框数据库(Page Frame Database)的结构用于描述物理内存的状态。本文将从这一结构入手详述Windows物理内存的组织与管理。

    Windows将物理内存按PAGE_SIZE(在x86上,为0x1000字节,即4K)为单位,将其划分,每一单元在页框数据库中均有一项描述其状态及用途等。页框数据库实际上是由这些描述每一页情况结构的数组。页框数据库由内核变量MmPfnDatabase指定,而数据库中的项数则由MmNumberOfPhysicalPages指定,项数索引叫Page Frame Number(PFN)来表示。MmNumberOfPhysicalPages通常略低于系统实际拥有的物理内存页数,系统在初始化阶段保留部分页面让操作系统本身使用。需要指出的是页框数据库只描述狭义上的物理内存,不包含其他映射的物理设备的内存。

    Windbg的!pfn命令用于对任一页内存的状态及用途等进行分析,如下所示:

    kd> dd MmPfnDatabase l 1
    80547438  80c00000
    kd> !pfn 143
        PFN 00000143 at address 80C01E48
        flink       00000500  blink / share count 00000001  pteaddress E1085174
        reference count 0001   Cached     color 0
        restore pte 00B5AC24  containing page        0096D8  Active      P      
          Shared

  《Inside Windows 2000》中将PFN的各个字段解释的已经非常清楚了。这里我只是简要进行说明:

  flink与blink用于将特定状态的页面连成一个链表,系统中内核变量MmZeroedPageListHead、MmFreePageListHead、MmStandbyPageListHead、MmModifiedPageListHead、MmModifiedNoWritePageListHead、MmBadPageListHead用于指示这些状态的页面的链表头。从这些变量名很容易明白各链表的页面状态,在Windows中页框数据库中共有8个状态,另两个为:Active与Transition状态。这8个状态由pfn的type(offset:0xd,size:byte)字段中的前3bit指示。

  pteaddress是指向这一页面的pte地址。经过分析,主要有如下三种情况:

    a. pteaddress为0或0xffffffff,根据pfn指示的状态,可识别是ZeroedPage或是FreePage。
    b. pteaddress为0xC*******,表明这一页面当前有系统或某一进程独占,并且在进程或系统工作集中。
  c. pteaddress为0xE*******,说明这是一个prototype pte,也就是说这个页面是共享的。详细请参阅我的《探究Windows 2000/XP原型PTE》。

  restore pte,在《Inside Windows 2000》中称为original pte。其作用是指示这一页面的back-store位置,即数据在磁盘中某一pagefile或是mapped file中的位置。譬如在上面提及的情况c中,其一般是指向mapped file的某一subsection,所以在内部其称为Subsection PTE,由MMPTE_SUBSECTION结构定义。而另外一种情况其可能是一个指向pagefile的pte,由MMPTE_SOFTWARE结构定义。这一点,上次我提及时存在错误。MMPTE_SUBSECTION的具体bit定义如下:

    Valid            : Pos 0, 1 Bit
    SubsectionAddressLow : Pos 1, 4 Bits
    Protection       : Pos 5, 5 Bits
    Prototype        : Pos 10, 1 Bit
    SubsectionAddressHigh : Pos 11, 20 Bits
    WhichPool        : Pos 31, 1 Bit

  最高位WhichPool是指示这个Subsection位于哪个pool中(NonPagedPool或是PagedPool中),Valid为0,指示这不是一个x86硬件可以识别的pte,由MiDispatchFault分析。由Subsection pte转换成Subsection地址的算法我在底下提供的代码中给出了。

    这一描述基本阐述了Subsection PTE的作用,用于定位由PFN所指定的页面位于相应的Mapped File的位置。为了更好的解释好这一过程,《Inside Windows 2000》中使用了一个框图来解释内存管理器内部的这几个千丝万缕的联系,但各个数据结构,如PFN,SEGMENT等等介绍的不够详尽,并且之间的转换算法均没有提及。下图是我根据Windows XP Professional Build 2600的情况,重新制作的一幅图.

Windbg提供了一个!memusage命令通过分析subsectin pte得到系统中各个mapped file的使用内存情况,底下的代码,只是详细的列出了某些页面由哪些mapped file使用,并没有像!memusage有详细的统计功能,不过通过这一代码与我先前提供的文章,也能基本上明白上面这幅图之间复杂关系。

    /*
       For test purpose,I define the below constant,but no say 
       MmSubsectionBase and MmNonPagedPoolEnd are fixed in 
       Windows 2000 and Windows XP. They are initialized on system 
       boot phase by ntoskrnl and rely on the system physical memory size etc.
    */
    #define WIN2000_2195
    #ifdef WINXP_2600 
    #define MmSubsectionBase 0x80d21000
    #define MmNonPagedPoolEnd 0xffbe0000
    #endif
    #ifdef WIN2000_2195
    #define MmSubsectionBase 0x0
    #define MmNonPagedPoolEnd 0xffb7f000
    #endif

    #define MmPfnDatabase 0xffb7f000    //Please redefine it on your machine.
    #define MmNumberOfPhysicalPages 0x3f7d  //Please redefine it on your machine.

    /*
      Portion of nt!MiGetSubsectionAndProtoFromPte
      Get Subsection from restore pte(original pte) at PFN Database Entry
      disasm by WebCrazy(tsu00@263.net) athttp://webcrazy.yeah.net
     Thanks to wuzq(wuzq@legend.com.cn) for light!
    */

    unsigned int MiGetSubsectionAndProtoFromPte(int pte)
    {
       unsigned int subaddr;
       if(pte < 0){ 
          subaddr = MmSubsectionBase+(((pte & 0x1e) <<2) |  ((pte>>4) & 0x7ffff80)) ;
       }else{
          subaddr = MmNonPagedPoolEnd-(((pte & 0x1e) <<2) |  ((pte>>4) & 0xfffff80)) ;
       }
       return subaddr;
    }

    /* 
      I release memusage() to dump Control Area.
      Only mapped file control area were dump.
      Please see windbg !memusage command.
    */


    void memusage()
    {
         unsigned int *pfndatabase = MmPfnDatabase;
         unsigned int numberphys = MmNumberOfPhysicalPages;

         unsigned int restorepte,pfn=0,ppte,subsection;

         unsigned char flag=0;
         static unsigned int flagnum[8];
         static char *flagdesc[8]=
                {"Zeroed","Free","Standby","Modified","ModNoWrt","Bad","Active","Trans"};
         memset(flagnum,0,sizeof(flagnum));

         for(;pfn<numberphys;pfn++){
            flag = *(char *)((char *)pfndatabase+0xd);
            flag &= 0x07;
            flagnum[flag]++;
            pfndatabase+=0x18/0x04;
        }

        DbgPrint("/nMemUsage:/n");
        for(flag=0;flag<8;flag++)
             DbgPrint("%10s:%04d(%08dK)/n",flagdesc[flag],flagnum[flag],flagnum[flag]*4);


        pfndatabase = MmPfnDatabase;
        for(pfn=0;pfn<numberphys;pfn++){
            ppte=*((unsigned int *)(pfndatabase+0x1));
            restorepte=*((unsigned int *)(pfndatabase+0x4));
            flag = *(char *)((char *)pfndatabase+0xd);
            flag &= 0x07;

            if(ppte>=0xE1000000&&ppte<0xF0000000){
               subsection=MiGetSubsectionAndProtoFromPte(restorepte);
               DbgPrint("pfn:%04X,ppte:%08X,restorepte:%08X,subsection:%08X,ca:%08X,
                    flag:%10s/n",pfn,ppte,restorepte,subsection,
                    MmIsAddressValid((void *)subsection)?*(unsigned int *)subsection:
                    0x11111111,flagdesc[flag]);
            }
            pfndatabase+=0x18/0x04;
        }
    }

    本文只是基本上说明了Windows 2000/XP下物理内存的组织管理,对于restore pte,正向前面介绍的其实他还指向pagefile,未加以叙述,着实因为这部分内容还很多,看我自己学习的进程,我会另行介绍。需要感谢的是wuzq(wuzq@legend.com.cn)给我提供的思路,才可能有我对此的一些粗浅的理解,再次感谢他。





网友对该文章的评论
网友: ksdgfaijgioajogi(rrr@dfr.com) 发表于: 2004-10-28 16:38:05

我 草!!!  是人学的吗?!!   
你妈B啊!!!!

弄这么难的干什么?!!  操你妈!
网友: sdf(dsfds) 发表于: 2004-1-17 12:14:26

sdfdsf
网友: 匿名 发表于: 2004-1-9 14:50:41

高深阿!
网友: 匿名 发表于: 2003-3-19 20:21:08

解析Winndows 2000/XP物理内存管理
 
2003-3-17 15:44:06   webcrazy.yeah.net   WebCrazy   阅读次数: 74 
   物理内存是相对比较紧张的资源,合理利用将是一个操作系统的性能的关键。Windows 2000/XP内部使用一个称为页框数据库(Page Frame Database)的结构用于描述物理内存的状态。本文将从这一结构入手详述Windows物理内存的组织与管理。

    Windows将物理内存按PAGE_SIZE(在x86上,为0x1000字节,即4K)为单位,将其划分,每一单元在页框数据库中均有一项描述其状态及用途等。页框数据库实际上是由这些描述每一页情况结构的数组。页框数据库由内核变量MmPfnDatabase指定,而数据库中的项数则由MmNumberOfPhysicalPages指定,项数索引叫Page Frame Number(PFN)来表示。MmNumberOfPhysicalPages通常略低于系统实际拥有的物理内存页数,系统在初始化阶段保留部分页面让操作系统本身使用。需要指出的是页框数据库只描述狭义上的物理内存,不包含其他映射的物理设备的内存。

    Windbg的!pfn命令用于对任一页内存的状态及用途等进行分析,如下所示:

    kd> dd MmPfnDatabase l 1
    80547438  80c00000
    kd> !pfn 143
        PFN 00000143 at address 80C01E48
        flink       00000500  blink / share count 00000001  pteaddress E1085174
        reference count 0001   Cached     color 0
        restore pte 00B5AC24  containing page        0096D8  Active      P      
          Shared

  《Inside Windows 2000》中将PFN的各个字段解释的已经非常清楚了。这里我只是简要进行说明:

  flink与blink用于将特定状态的页面连成一个链表,系统中内核变量MmZeroedPageListHead、MmFreePageListHead、MmStandbyPageListHead、MmModifiedPageListHead、MmModifiedNoWritePageListHead、MmBadPageListHead用于指示这些状态的页面的链表头。从这些变量名很容易明白各链表的页面状态,在Windows中页框数据库中共有8个状态,另两个为:Active与Transition状态。这8个状态由pfn的type(offset:0xd,size:byte)字段中的前3bit指示。

  pteaddress是指向这一页面的pte地址。经过分析,主要有如下三种情况:

    a. pteaddress为0或0xffffffff,根据pfn指示的状态,可识别是ZeroedPage或是FreePage。
    b. pteaddress为0xC*******,表明这一页面当前有系统或某一进程独占,并且在进程或系统工作集中。
  c. pteaddress为0xE*******,说明这是一个prototype pte,也就是说这个页面是共享的。详细请参阅我的《探究Windows 2000/XP原型PTE》。

  restore pte,在《Inside Windows 2000》中称为original pte。其作用是指示这一页面的back-store位置,即数据在磁盘中某一pagefile或是mapped file中的位置。譬如在上面提及的情况c中,其一般是指向mapped file的某一subsection,所以在内部其称为Subsection PTE,由MMPTE_SUBSECTION结构定义。而另外一种情况其可能是一个指向pagefile的pte,由MMPTE_SOFTWARE结构定义。这一点,上次我提及时存在错误。MMPTE_SUBSECTION的具体bit定义如下:

    Valid            : Pos 0, 1 Bit
    SubsectionAddressLow : Pos 1, 4 Bits
    Protection       : Pos 5, 5 Bits
    Prototype        : Pos 10, 1 Bit
    SubsectionAddressHigh : Pos 11, 20 Bits
    WhichPool        : Pos 31, 1 Bit

  最高位WhichPool是指示这个Subsection位于哪个pool中(NonPagedPool或是PagedPool中),Valid为0,指示这不是一个x86硬件可以识别的pte,由MiDispatchFault分析。由Subsection pte转换成Subsection地址的算法我在底下提供的代码中给出了。

    这一描述基本阐述了Subsection PTE的作用,用于定位由PFN所指定的页面位于相应的Mapped File的位置。为了更好的解释好这一过程,《Inside Windows 2000》中使用了一个框图来解释内存管理器内部的这几个千丝万缕的联系,但各个数据结构,如PFN,SEGMENT等等介绍的不够详尽,并且之间的转换算法均没有提及。下图是我根据Windows XP Professional Build 2600的情况,重新制作的一幅图.

Windbg提供了一个!memusage命令通过分析subsectin pte得到系统中各个mapped file的使用内存情况,底下的代码,只是详细的列出了某些页面由哪些mapped file使用,并没有像!memusage有详细的统计功能,不过通过这一代码与我先前提供的文章,也能基本上明白上面这幅图之间复杂关系。

    /*
       For test purpose,I define the below constant,but no say 
       MmSubsectionBase and MmNonPagedPoolEnd are fixed in 
       Windows 2000 and Windows XP. They are initialized on system 
       boot phase by ntoskrnl and rely on the system physical memory size etc.
    */
    #define WIN2000_2195
    #ifdef WINXP_2600 
    #define MmSubsectionBase 0x80d21000
    #define MmNonPagedPoolEnd 0xffbe0000
    #endif
    #ifdef WIN2000_2195
    #define MmSubsectionBase 0x0
    #define MmNonPagedPoolEnd 0xffb7f000
    #endif

    #define MmPfnDatabase 0xffb7f000    //Please redefine it on your machine.
    #define MmNumberOfPhysicalPages 0x3f7d  //Please redefine it on your machine.

    /*
      Portion of nt!MiGetSubsectionAndProtoFromPte
      Get Subsection from restore pte(original pte) at PFN Database Entry
      disasm by WebCrazy(tsu00@263.net) athttp://webcrazy.yeah.net
     Thanks to wuzq(wuzq@legend.com.cn) for light!
    */

    unsigned int MiGetSubsectionAndProtoFromPte(int pte)
    {
       unsigned int subaddr;
       if(pte < 0){ 
          subaddr = MmSubsectionBase+(((pte & 0x1e) <<2) |  ((pte>>4) & 0x7ffff80)) ;
       }else{
          subaddr = MmNonPagedPoolEnd-(((pte & 0x1e) <<2) |  ((pte>>4) & 0xfffff80)) ;
       }
       return subaddr;
    }

    /* 
      I release memusage() to dump Control Area.
      Only mapped file control area were dump.
      Please see windbg !memusage command.
    */


    void memusage()
    {
         unsigned int *pfndatabase = MmPfnDatabase;
         unsigned int numberphys = MmNumberOfPhysicalPages;

         unsigned int restorepte,pfn=0,ppte,subsection;

         unsigned char flag=0;
         static unsigned int flagnum[8];
         static char *flagdesc[8]=
                {"Zeroed","Free","Standby","Modified","ModNoWrt","Bad","Active","Trans"};
         memset(flagnum,0,sizeof(flagnum));

         for(;pfn<numberphys;pfn++){
            flag = *(char *)((char *)pfndatabase+0xd);
            flag &= 0x07;
            flagnum[flag]++;
            pfndatabase+=0x18/0x04;
        }

        DbgPrint("/nMemUsage:/n");
        for(flag=0;flag<8;flag++)
             DbgPrint("%10s:%04d(%08dK)/n",flagdesc[flag],flagnum[flag],flagnum[flag]*4);


        pfndatabase = MmPfnDatabase;
        for(pfn=0;pfn<numberphys;pfn++){
            ppte=*((unsigned int *)(pfndatabase+0x1));
            restorepte=*((unsigned int *)(pfndatabase+0x4));
            flag = *(char *)((char *)pfndatabase+0xd);
            flag &= 0x07;

            if(ppte>=0xE1000000&&ppte<0xF0000000){
               subsection=MiGetSubsectionAndProtoFromPte(restorepte);
               DbgPrint("pfn:%04X,ppte:%08X,restorepte:%08X,subsection:%08X,ca:%08X,
                    flag:%10s/n",pfn,ppte,restorepte,subsection,
                    MmIsAddressValid((void *)subsection)?*(unsigned int *)subsection:
                    0x11111111,flagdesc[flag]);
            }
            pfndatabase+=0x18/0x04;
        }
    }

    本文只是基本上说明了Windows 2000/XP下物理内存的组织管理,对于restore pte,正向前面介绍的其实他还指向pagefile,未加以叙述,着实因为这部分内容还很多,看我自己学习的进程,我会另行介绍。需要感谢的是wuzq(wuzq@legend.com.cn)给我提供的思路,才可能有我对此的一些粗浅的理解,再次感谢他。
【GitHub项目实战】OpenAvatarChat 搭建实时交互数字人 OpenAvatarChat 项目构建了一个集成语音识别、大语言模型、语音合成、表情驱动和实时通信于一体的虚拟人系统,具备本地优先、模块解耦、快速部署的特点。系统通过配置文件统一管理组件,支持多种组合方案,适用于低资源设备和私有化部署场景。配置逻辑清晰、模块职责明确,能快速启动并实现端到端语音交互流程,为多模态系统学习与实践提供了结构完整的工程参考。 阅读详情

相关推荐

水电站数字孪生:水力发电在可视化领域的应用

为智慧水坝领域提供了 B/S 架构的基于 WebGL 的图形引擎,与 GIS、粒子仿真、虚拟现实、边缘计算等技术相结合,融合多元业务系统数据,形成数字孪生界面,助力水利水电工程进一步提升数字化水平,乃至为整个工业领域添砖加瓦。

二三维数据可视化/数字孪生 2255

探索 Windows 2000 的内存管理机制

翻译: Kendiv( %20%20);%20document.write(%20addy78904%20);%20document.write(%20%20);%20//-->%20"> <!-- var prefix = ma + il + to; var path = hr + ef + =; var addy78904 = fcczj

2854

AT32F403A ADC采集实战:如何用V2库精准读取可变电阻电压(附完整代码)

本文详细介绍了基于AT32F403A微控制器和V2库实现高精度ADC采集的工程化方法。内容涵盖从基础的单通道轮询配置到多通道扫描与DMA传输的进阶应用,并重点分享了提升ADC采集精度的关键技巧,包括采样时间优化、软件滤波算法以及硬件布局考量,提供了完整的实战代码,帮助开发者解决数据跳动、稳定性等常见问题。

weixin_29189003的博客 91

浅议Windows 2000/XP Pagefile组织管理

任何时候系统内存资源相对磁盘空间来说都是相形见拙的。因为虚拟内存机制,使我们可以有相对丰富的地址资源(通常32bit的虚拟地址,可以有4G的寻址 空间),而这些资源对物理内存来说一般情况是总是绰绰有余的。所以在现代操作系统中,总是在相对紧张时使用一些策略,如FIFO、LRU等将物理内存的一 些页面置入相对便宜的磁盘空间资源中。一般的UNIX系统,独立使用一...

weixin_34247155的博客 181

【Claude】Auto mode cannot determine the safety of an action 报错已解决

Claude Code Auto mode 安全分类器报错完整解析,涵盖 temporarily unavailable、could not evaluate、transcript exceeded 三种情况的根因与处理

博客 9970

01 Python学习总结:Python简介及入门

Python 是一门高级编程语言,以其简洁、易读和强大的功能而广受欢迎。它适用于多种应用场景,包括 Web 开发、数据分析、人工智能、自动化脚本等。以下是 Python 的简介及入门知识总结,帮助你快速了解并开始学习 Python。

数据知道的博客 1万+

windbg修改notepad内容(!pte/!dd/.process/s命令)

在高端调试论坛上看到有人调试calc.exe的,我也依样画葫芦调试notepad.exe:定位notepad.exe缓存所在的物理页面进而修改文本内容。     文本原有的内容如下:     目前windbg正在调试内核,调试器不在notepad.exe进程上下文中,为了达到目的,需要枚举系统中的进程并切换到notepad.exe !process 0 0 ;枚举系统所有进程 Fai

lixiangminghate的专栏 3183

SAP-ABAP:SAP数据库视图(Database View)详解-创建

数据库视图是SAP中实现多表关联查询的基础工具,适合简单的跨表查询和权限控制场景。但其功能有限,对于复杂逻辑或高性能需求,建议结合CDS视图或ABAP程序开发。通过合理设计,数据库视图可显著提升开发效率和系统可维护性。它存储在数据库中,但本身不存储数据,仅通过查询动态生成结果。是一种基于物理数据库表的虚拟表,通过关联多个表(使用。

baidu_35680696的博客 1369

MMPTE数据结构

MMPTE其实是个union,它抽象了PDE,PTE,原型PTE等数据结构 kd> dt _MMPTE -r2 nt!_MMPTE +0x000 u : __unnamed +0x000 Long : Uint4B +0x000 Flush : _HARDWARE...

weixin_34208283的博客 1175

021、反激变换器的软启动设计

本文分享了反激变换器软启动设计的实践经验。作者通过一次上电炸机事故引出软启动的重要性,分析了启动瞬间电流冲击和环路饱和问题。介绍了三种软启动方案:效果差的RC电路、推荐使用的数字芯片方案以及分立元件实现方法,重点指出数字方案的一致性优势。文章还探讨了软启动与过流保护的配合问题,提供了实测波形、温度影响等调试要点,并总结出软启动时间选择、批量生产一致性等实用建议。最后强调软启动是电源可靠性的关键设计,不应为节省成本而忽略。全文包含多个工程实践细节,对电源设计人员具有重要参考价值。(149字)

Jack010169的博客 173

GMSL转eDP芯片MAX9686X(ADI)

MAX96860/MAX96862/MAX96864解串器可以把单路或双路GMSL转换成eDP V1.4a,支持820MHzPCLK的无压缩的24bpp(每个像素的位数)视频,或660MHz的30bpp视频。芯片的GMSL支持NRZ编码的6Gbps/187Mbps的GMSL2,PAM4编码的12Gbps/187Mbps的GMSL3。同时支持单线(COAX模式)双向全双工传输控制数据和video数据。支持DSC压缩的芯片,最大支持像素时钟1080MHz@24bpp或者864MHz@30bpp,传输方式包括同轴

qflook的博客 2837

使用WinDbg查看保护模式分页机制下的物理地址

    我们知道,当今主流的x86/x64 Intel处理器默认都使用了保护模式,不同于8086时代的实模式机制,保护模式和分页机制实现了内核层与用户层隔离,进程间执行环境隔离。    对Win32系统比较熟悉的人都知道系统为每一个进程都分配了4GB的进程空间,其中低2GB是用户层空间,而高2GB是内核层空间,而内存地址使用的分页机制下的虚拟地址,而虚拟地址需要通过分页机制的层层转换,才能找到映射...

weixin_42486644的博客 2390

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[转]解析Winndows 2000/XP物理内存管理

物理内存是相对比较紧张的资源,合理利用将是一个操作系统的性能的关键。Windows2000/XP内部使用一个称为页框数据库(PageFrameDatabase)的结构用于描述物理内存的状态。本文将从这一结构入手详述Windows物理内存的组织与管理。Windows将物理内存按PAGE_SIZE(在x86上,为0x1000字节,即4K)为单位,将其划分,每一单元在页框数据库...

WiLL_2015的博客 253

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

解析Winndows 2000/XP物理内存管理(http://webcrazy.yeah.net)

解析Winndows 2000/XP物理内存管理            WebCrazy(http://webcrazy.yeah.net)    物理内存是相对比较紧张的资源,合理利用将是一个操作系统的性能的关键。Windows 2000/XP内部使用一个称为页框数据库(Page Frame Database)的结构用于描述物理内存的状态。本文将从这一结构入手详述Windows物理内存的组织与管

FreeXploiT 1598

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 367

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 264

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 43

C++ STL 反向迭代器:从源码框架到适配器实现

在 C++ STL 中,反向迭代器(reverse_iterator)是一个很典型的设计案例:它本身并不直接持有容器数据,而是通过封装一个正向迭代器,把「前进」变成「后退」,从而让同一个容器既能正序遍历,也能逆序遍历。本文从 SGI-STL 3.0 的源码框架出发,梳理反向迭代器的设计思路,再手写一个通用的迭代器适配器,并在vector和list中完成适配与测试。在 SGI-STL 3.0 中,反向迭代器的核心源码位于。反向迭代器是一个适配器,各个容器再基于它适配出自己的反向迭代器类型。下面截取list。

Godbro的博客 228

[C++]:7.STL:list

好久不见,firdawn小课堂又和大家见面啦。今天我们要学习的内容是list容器,list也是一种常用的数据结构。下面是本章的思维导图,那么让我们开始学习吧!自定义的list,由三个结构构成。分别是链表的最小组成单位,也就是链表节点。以及迭代器类和list类其实要特别说明的是, List的迭代器,它不是单纯的指针,因为我们如果对指针直接进行解引用操作的话,我们得到的是这个节点,而不是节点里面存储的值并且我们对这个指针加加,得到的也不是下一个节点的地址,而是所在节点的下一个单位的地址。

2301_80817679的博客 172

RT-Thread 5.4.0 完整版架构剖析(下):IPC、时钟、内存、设备与组件

从 IPC 全量、时钟与定时器、内存管理,到设备框架、组件层、软件包机制、移植裁剪与速查表,补齐 RT-Thread 5.4.0 完整版的下半张地图。

189

CMake 多目录工程实战:静态库与动态库的完整构建示例

本文通过一个完整CMake项目示例,展示了如何构建静态库(math)与动态库(sort),并分别在test1、test2中链接使用。项目结构清晰,顶层CMakeLists.txt统一管理变量,各子目录独立配置编译规则。通过add_library生成库,link_directories和link_libraries实现链接,最终完成构建与验证。重点区分了静态库(打包进可执行文件)与动态库(运行时加载)的差异,适用于实际工程化开发与面试准备。

2303_77004089的博客 112

第2讲:提示注入攻击——原理与防御

提示注入是攻击者通过恶意指令绕过AI系统规则的安全威胁,分为直接注入(如覆盖指令、角色扮演越狱)和间接注入(藏于文档或搜索结果中)。防御需三重机制:检测(识别高危模式与多轮诱导)、加固(设置优先级、随机分隔符、锁定输出)、净化(清除控制字符、编码、截断超长输入)。结合上下文分析与多模态处理,可有效防范编码绕过、过度净化等陷阱。核心理念:防御需检测、加固、净化联动,筑牢AI应用安全防线。

sandaoliuge的博客 254

TypeError: must be str, not list

【代码】TypeError: must be str, not list。

Forerunner and Successor 先駆者と後継者 38

CompletableFuture 实战:异步任务编排、异常处理、超时与线程池边界

本文以用户主页接口为例,详解 CompletableFuture 在异步任务编排中的实战应用。通过并行执行用户资料、订单与推荐数据查询,显著降低耗时。重点剖析了默认线程池风险、任务组合方式(如 allOf 与 thenApply)、异常处理机制、超时控制及上下文传递问题。强调应为阻塞 I/O 任务自定义线程池,避免占用 commonPool,并通过 completedFuture 灵活处理可选分支。最终实现高效、可控的异步编排,兼顾性能与稳定性。

此人很懒,什么都没有写~~ 354

Python 开发的实践:从数据结构选型到框架决策

规模多大?决定用list还是set,Pandas 还是 Polars。瓶颈在哪?I/O 密集用异步,CPU 密集用进程/自由线程,内存受限用列式与惰性执行。代价是什么?消除手动维护窗口的出错面,TaskGroup消除失败任务不被取消的泄漏,消除 N+1,Protocol消除为类型约束而引入的继承层级——每个选择都在消除某类代价,同时也引入新的约束。能回答这三个问题,比记住更多 API 更有用。愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意!

weixin_45809780的博客 367

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 433
上一篇: 解析Windows 2000/XP进程工作集
下一篇: 主线程如何与次线程用全局变量通讯
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值