探寻Windows NT/2000 Copy On Write机制(http://wecrazy.yeah.net)

WINDOWS的内存管理【虚拟内存管理】(一) 导读:如果你已经对windows虚拟内存的概念有了一定认识,而只是想看一个例子,你可以跳过前面的基本概念。基本概念【摘录】       每个进程都被赋予它自己的虚拟地址空间。对于32位进程来说,这个地址空间是4GB,因为32位指针可以拥有从0x000000000至0xFFFFFFFF之间的任何一个值。这使得一个指针能够拥有4 294 967 296个值中的一个值,它覆盖了一个进程的4GB虚拟空 阅读详情
 探寻Windows NT/2000 Copy On Write机制
            WebCrazy( http://wecrazy.yeah.net) 
                      
    Copy On Write机制是典型的Lazy evaluation实现,现代操作系统如Windows NT/2000,UNIX/Linux的内存管理部分大量使用这种机制。本文通过对Windows NT/2000中Copy On Write机制作一深入分析,旨在探寻Windows NT/2000内核态内存管理器的几个重要的数据结构,在继续以下的讨论之前,您务必要明白PDE/PTE、VAD等一些术语(参见我先前的《 小议Windows NT/2000分页机制》与《 分析Windows NT/2000堆内存与虚拟内存组织 》),另外我将述及另几个与内存子系统相关的术语,如Control Area,Subsection,Working Set List,Page Frame Database。下面列出我在本文中用于分析Copy On Write机制的代码,文中所有的叙述均基于这段代码。

    // cow.c 
    // Writed by ChenChengQin( tsu00@263.net )

    #include <stdio.h>
    #include <string.h>

    #define BUFSIZE 10

    #pragma data_seg(".seg_cow")
    char data[BUFSIZE]={'A','A','A','A','A','A','A','A','A','/0'};
    #pragma data_seg()
    #pragma comment(linker, "/SECTION:.seg_cow,RWC")

    void main(int argc,char *argv[])
      {
       int i;
       if (argc>1){
         //memset(data,'B',BUFSIZE);
         __asm int 3;
         for(i=0;i<BUFSIZE;i++) 
            data[i]='B';
         data[BUFSIZE-1]='/0';
       }
       printf("%s",data);

       getchar();
      }


    非常简单的一段代码,使用如下指令编译:

        cl /Zi /Fa cow.c

    运行一个实例(别退出):
        c:>cow
        AAAAAAAAAA

    使用SoftICE看看cow.exe映像在内存中的分布:

        :addr cow
        :map32 cow
        Owner     Obj Name  Obj#  Address        Size      Type
        cow       .text     0001  001B:00401000  00006BB8  CODE  RO
        cow       .rdata    0002  0023:00408000  000005C8  IDATA RO
        cow       .data     0003  0023:00409000  00002EC4  IDATA RW
        cow       .idata    0004  0023:0040C000  00000633  IDATA RW
        cow       .seg_cow  0005  0023:0040D000  0000010C  IDATA RW
        cow       .reloc    0006  0023:0040E000  000006B2  IDATA RO

        //查看.seg_cow段(虚拟地址0x40d000)的首地址的PTE,详见《 小议Windows NT/2000分页机制 》
        :dd c0000000+1*1000+d*4 l 10
        0023:C0001034 003F9225  00000000  00000000  00C3C067      %.?.........g...
                      --------
                          |
                          |_cow.exe进程.seg_cow段首地址的PTE

    SoftICE的page命令可以dump出这个PTE的属性,如下所示:

       :page 40d000
       Linear     Physical   Attributes
       0040D000   003F9000   P   A U R

    不过这里列出的Attributes并没有指出.seg_cow的Copy On Write属性,因为X86的PTE的低12位(0-11),即属性位并没有指出这个属性,但Microsoft(当然不仅仅Microsoft)使用了这12位中的保留的系统(OS)位,下面是这一DWORD值在Windows 2000的具体格式:

       struct   _HARDWARE_PTE_X86 (sizeof=4)
       +0 bits0-0 Valid
       +0 bits1-1 Write
       +0 bits2-2 Owner
       +0 bits3-3 WriteThrough
       +0 bits4-4 CacheDisable
       +0 bits5-5 Accessed
       +0 bits6-6 Dirty
       +0 bits7-7 LargePage
       +0 bits8-8 Global
       +0 bits9-9 CopyOnWrite
       +0 bits10-10 Prototype
       +0 bits11-11 reserved
       +0 bits12-31 PageFrameNumber
    
    从上的PTE为003F9225的值可以看出0x40d000的只读、CopyOnWrite属性。只读属性是实现CopyOnWrite的保证,这样X86才能在另一个cow实例试图写.seg_cow段时raise一个0eh(页故障)中断(陷阱),让Windows处理这个Copy On Write操作。基于这个原理,我即运行cow的另一个实例,跟踪Copy On Write机制:

    c:>cow 1(设置一个参数,让cow试图更新.seg_cow段)

    我在代码中设置了int 3指令让softice在i3here设置为on状态时让softice激活。然后使用bpint e指令让softice捕获0eh中断。i386在raise 0e中断时将发生页故障的虚拟地址保存于CR2寄存器中。Windows 2000页故障处理入口KiTrap0E就是根据这个地址制作cow进程.seg_cow的副本,并替代第二个cow实例工作集(Working List,这儿只指进程工作集,未牵涉系统工作集)的原始页面,实现CopyOnWrite的目的。我并不准备将KiTrap0E的汇编代码列于此,只是讲一讲Windows寻找CR2指定的地址的属性的步骤,Windows 2000中由MiQueryAddressState过程实现。KiTrap0E当然也会调用MiQueryAddressState。

    1、首先检查0x40d000(由CR2指定)的PDE。由MiDoesPdeExistAndMakeValid实现。
    2、检查PTE。
    3、查页框数据库(PFN,Page Frame Database,由内核结构数组变量MmPfnDatabase指定)
    4、根据PFN中工作集索引寻找Working Set List Entry(Working Set基址由内核变量_MmWsle指出),这一步骤由内核例程MiLocateWsle完成。
    5、然后根据Wsle的属性(也是前12位)查找MmProtectToValue数组,以获得用户态可以理解的格式。即在winnt.h中定义的PAGE_WRITECOPY、PAGE_READWRITE等等。

    步骤3至5其实也实现了物理地址至线性地址的转换,当然这个是在这个地址Present的前提下。这也是为什么Windows 2000使用如此复杂且繁琐的结构来管理内存子系统。确切的说我并没有谈到PFN的PteAddress成员(下面i386kd输出可以看到),这些都是使用分页文件(pagefile.sys,通过ProtoPTE,即原型PTE实现的),共享内存块等的基础。David Solomon的书《Inside Windows NT,2nd Edition》有四种PFN形态的具体结构等等其他很多详细的说明。

    下面是i386kd的分析,其实根据上面我给定的一些内核变量SoftICE也可以看出些东西。不过远没有i386kd来的容易。

    // cow.exe 进程ID(ClientID)=4ac
    kd> !process 4ac
    !process 4ac
    Searching for Process with Cid == 4ac
    PROCESS ff605d60  SessionId: 0  Cid: 04ac    Peb: 7ffdf000  ParentCid: 04a0
        DirBase: 017bc000  ObjectTable: ff610f88  TableSize:  12.
        Image: cow.exe
        VadRoot ff624168 Clone 0 Private 37. Modified 0. Locked 0.
               .
               .
               .
    //转换40d000至物理地址,取得PFN。
    //SoftICE中使用Page命令
    kd> !vtop 017bc000 40d000
              --------
                 |_DirBase(见!process输出)
        !vtop 017bc000 40d000
        Pdi 1 Pti d                         //输出PDE与PTE
        0040d000 00a6e000 pfn(00a6e)        //输出PFN

    //查PfnDatabase
    //Softice中:
    //   dd @MmPfnDatabase+a6e*18 (每一PFN项占用0x18字节)
    kd> !pfn a6e
    !pfn a6e
        PFN 00000A6E at address FFB8EA50
        flink       00000097  blink / share count 00000001  pteaddress E151E1B4
        reference count 0001                                 color 0
        restore pte 056B04B0  containing page        002AF3  Active      P
        Shared


    /*
      查MmWsle
      SoftICE中:
         :dd @MmWsle+97*4 l 10
         0023:C05028FC 0040DF29  000006A0  00510C09  000009B0      ).@.......Q.....
                       --------
                          |_0040D000是不是PFN为A6E的Virtual Address
    */
    kd> !wsle 4ac
    !wsle 4ac

    // KPEB中的VmWorkingSetList成员(Windows 2000 Server Build 2195中偏移0f0处,值为C0502000)指出Working Set List
    // 见《 Windows 2000内核KPEB/KTEB详细结构 》

    Working Set @ c0502000   
        Quota:          2f  FirstFree:       22  FirstDynamic:          4
        LastEntry       ad  NextSlot:        16  LastInitialized      257
        NonDirect       1e  HashTable: c06f3000  HashTableSize:       200
               .
               .
               .

    这些i386kd指令已经较清楚的指出以上5个步骤。但要理解Copy On Write还必须对Section(用户态的FileMapping)对象有一基本的理解。在使用NtCreateSection/NtOpenSection(CreateFileMapping/OpenFileMapping间接使用这些例程)等时,Windows 2000一般会在VAD这个自平衡的二叉树中插入一个节点。(我在《 分析Windows NT/2000堆内存与虚拟内存组织 》中详细介绍过VAD)。SoftICE在使用query指令dump VAD树时有一成员MMCI(内存管理结构),她指向的是Control Area。如下所示:

    // SoftICE输出
    :query cow
    Address Range      Flags     MMCI      PTE       Name
    00010000-00010000  C4000001
               .
               .
               .
    00400000-0040E000  07100005  FF62FD48  E11EBF80  cow.exe
                                 --------
                                    |_Control Area
               .
               .
               .

    其实我们使用i386kd的!memusage可以dump出系统中所有的Control Area:

    kd> !memusage
     loading PFN database
     loading (99% complete)
             Zeroed:     15 (    60 kb)
               Free:      0 (     0 kb)
            Standby:   1274 (  5096 kb)
           Modified:    686 (  2744 kb)
     ModifiedNoWrite:      1 (     4 kb)
       Active/Valid:  14380 ( 57520 kb)
         Transition:     11 (    44 kb)
            Unknown:      0 (     0 kb)
              TOTAL:  16367 ( 65468 kb)
     Building kernel map
     Finished building kernel map

     Control Valid Standby Dirty Shared Locked PageTables  name
               .
               .
               .
     ff62fd48    32      0     0     0     0     0  mapped_file( cow.exe )            
     --------
         |_Control Area与上面SoftICE的MMCI一致
               .
               .
               .

     i386kd的ca命令可以看出一个Control Area结构:

     kd> !ca ff62fd48

     ControlArea @ff62fd48
       Segment:    e11ebf48    Flink              0   Blink:               0
       Section Ref        1    Pfn Ref            8   Mapped Views:        1
       User Ref           2    Subsections        7   Flush Count:         0
       File Object ff684288    ModWriteCount      0   System Views:        0
       WaitForDel         0    Paged Usage       a0   NonPaged Usage      120
       Flags (10000a0) Image File HadUserReference

        File: /Desktop/hack/cow.exe

     Segment @ e11ebf48:
        Base address        0  Total Ptes         f  NonExtendPtes:        f
        Image commit        5  ControlArea ff62fd48  SizeOfSegment: f000
        Image Base          0  Committed          0  PTE Template:   54f1c30
        Based Addr     400000  ProtoPtes   e11ebf80  Image Info:    e11ebfc0

     Subsection 1. @ ff62fd80
        ControlArea: ff62fd48  Starting Sector 0 Number Of Sectors 8
        Base Pte     e11ebf80  Ptes In subsect        1 Unused Ptes          0
        Flags              15  Sector Offset          0 Protection           1
         ReadOnly CopyOnWrite
               .
               .
               .

    由ca命令的输出结果可以看出这个Control Area有7个子区域(Subsection),限于篇幅我删掉部分输出结果,你可以将所有结果与SoftICE的map32指令输出比较比较。Control Area中实际上所有Subsection结构均是使用线性结构组织,每个Subsection在Windows 2000 Server Build 2195中占用0x20字节。所以SoftICE可以很容易的分析所有的这些。

    需要指出的是不仅仅Section对象使用Control Area,她在Windows 2000中也由SECTION_OBJECT_POINTERS结构使用:

    typedef struct _SECTION_OBJECT_POINTERS {
        PVOID DataSectionObject;    //Control Area
        PVOID SharedCacheMap;
        PVOID ImageSectionObject;   //Control Area
    } SECTION_OBJECT_POINTERS;

    而每一个FILE_OBJECT都有SECTION_OBJECT_POINTERS成员(见ntddk.h)。这个机制是Windows 2000装载可执行文件、文件IO操作(看到DataSectionObject与ImageSectionObject了吗?)的关键所在。只有熟悉这些结构,才可能真正初步明白Copy On Write机制。剩下的只有你自己多研究研究了。

    关于cow.exe,我还有两点要说明的是:
    1、cow.c使用#pragma comment(linker, "/SECTION:.seg_cow,RWC")显式的指出.cow_seg段的Copy On Write属性,实际上在Windows NT/2000中这种共享属性是默认存在的。可执行文件的映射、可读可写的数据都被默认设为Copy On Write属性,您可以使用Jeffrey Richter的VMMAP验证这种说法。
    2、Windows NT/2000使用可执行文件名(ImageName)用于识别这种程序多个实例间使用Copy On Write共享内存,对于有不同文件名的可执行文件,即便其内容完全一致,这种机制也不起作用,而用分别映射Section对象替之。

    所有以上讨论的都没有找到Microsoft的Full Documented,所有以上讨论的也只是在我初步分析Windows 2000后得到的,有什么技术问题需要交流的,欢迎赐教(tsu00@263.net)!

参考资料:
      1.David Solomom《Inside Windows NT,2nd Edition》
内存映射技术(共享内存) 内存映射 : 内存映射文件不同于文件I/O操作,内存映射实际用到了Windows的核心编程技术–内存管理。 使用内存映射文件的一般方法:   首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件。 在用CreateFile()将文件映像在物理存储器的位置通告给操作系统后,只指定了映像文件的路径,映像的长度还没有指定。 为了指定文件映射对... 阅读详情

相关推荐

Copy-On-Write机制,全局hook(一)

我本来想在ring3下全局hook,大约有这么几种方法: 1: 用SetWindowsHookEx,安装的钩子类型,如WH_GETMESSAGE,WH_KEYBOARD等,但这种方法只能挂接系统中的所有GUI线程。 2: 还有一种通过插入注册表来实现 HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Windows/AppInit_DLLs,这种方法简单,但是还是只能挂钩GUI 程序,并且这个键值已经被广大HI

井底之蛙 6784

通过挂钩NtCreateSection监控可执行模块

  Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <! /* Sty

misterliwei的专栏 8546

告别纯文本RAG:用Dify 1.11.0多模态知识库,5步搭建一个能“读图”的智能客服助手

本文详细介绍了如何利用Dify 1.11.0多模态知识库构建智能视觉客服助手,通过5个步骤实现图片内容理解与专业回复。从准备多模态素材到配置知识库节点,再到设计工作流逻辑和性能优化,帮助开发者快速搭建高效客服系统,显著提升用户体验和问题解决效率。

weixin_30832143的博客 451

Windows核心编程 - Windows内存体系结构(4)

1. 写时复制 PAGE_WRITECOPY和PAGE_EXECUTE_WRITECOPY这两个保护属性存在的目的是为了节省内存和使用页交换文件。Windows支持一种机制,允许两个或两个以上的进程共享同一块存储器。让应用程序实例共享相同的存储页极大地提升了系统的性能,但另一方面,也要求所有的应用程序实例只能读取其中的数据 或是执行其中的代码。如果某个应用程序实例修改并写入一个存储页...

yjianlu的专栏 893

支持向量机算法(带你了解原理 实践)

支持向量机作为一种强大的分类算法,在各个领域都取得了显著的成果。其基于统计学习理论的原理使得它能够在高维空间中找到最优分类超平面,并通过核函数处理非线性问题。

2303_79387663的博客 3736

别再搞错了!ERA5-Land小时数据里的辐射值,原来不是你想的那个‘瞬时值’

本文深入解析ERA5-Land小时数据中辐射值的累积特性,揭示其与瞬时值的本质区别。通过详细的数据处理方法和Python代码示例,指导研究者正确转换累积辐射量为实用瞬时值,避免常见误区,提升气候模型验证的准确性。

weixin_28700411的博客 208

Python 调用系统DLL(2) 共享内存

Python 调用系统DLL(2) 共享内存 理论上来说调用系统DLL不区分语言,所以可以在不同语言中使用共享内存进行数据传输。 共享内存简介 所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程...

weixin_43640369的博客 1302

基于Meteoinfo与TrajStat的后向轨迹聚类分析实战:从数据准备到可视化制图

本文详细介绍了基于Meteoinfo与TrajStat进行后向轨迹聚类分析的完整实战流程。从Java环境配置、Meteoinfo软件与TrajStat插件安装,到精准获取NOAA气象数据、设置参数进行批量轨迹计算,再到利用聚类分析提炼主要气流路径,并最终完成专业地图可视化与制图。文章旨在帮助环境与气象研究者快速掌握从数据准备到成果输出的全链路操作。

p4q5r6s7t的博客 804

深入理解和实现Windows进程间通信(共享内存)

Windows共享内存(Shared Memory in Windows)是一种操作系统机制,允许不同的进程(程序)共享一段内存空间。这意味着多个进程可以同时访问同一个内存区域,用以交换数据或进行通信,这是进程间通信(IPC)的一种形式。使用共享内存通常可以提高应用程序之间的数据交换效率,因为它避免了数据的复制过程,直接在内存中进行读写。基于实际的磁盘文件或系统分页文件来创建内存映射文件对象。

LeoLei8060的博客 6556

大语言模型与ROS集成的自然语言机器人控制:开源框架与应用实例

近年来,大语言模型(LLM)与机器人操作系统(ROS)的集成逐步成熟,使得自然语言驱动的机器人控制成为可能。用户输入“捡起绿色方块”或“把微波炉里的饭热好端过来”这类日常语句,机器人能够自动拆解步骤、规划动作并执行。本文梳理2026年前后发布的三个代表性开源框架——ROS-LLM、ROSClaw以及LLM+Nav2基准测试系统,介绍其技术路径与工程落地情况。

Studying…… 633

QML实现ListView的拖动排序

现有一种需求,就是用鼠标拖动某项,动态去改变某一项在ListView中显示的顺序位置,经过研究及实践实战,实现方式的核心代码如下: import QtQuick 2.4 import QtQuick.Controls 1.3 import QtQuick.Window 2.2 import QtQuick.Dialogs 1.2 Rectangle { width: 800 ...

草上爬的博客 7564

PAGE_EXECUTE_WRITECOPY As Anti-Debug Trick

http://waleedassar.blogspot.com/2012/09/pageexecutewritecopy-as-anti-debug-trick.html

Linhanshi Blog 972

PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型

在本节中,我们将深入探讨使用 TorchScript 导出 PyTorch 模型。通过序列化,TorchScript 使模型与 Python 生态系统独立,从而使得模型可以在其他环境中加载,例如基于 C++ 的环境。我们还跨越 Torch 框架与 Python 生态的边界,研究机器学习通用开放格式 ONNX,该技术能帮助我们将 PyTorch 训练的模型导出至非 PyTorch 甚至非 Python 环境。

盼小辉丶的博客 3520

内存映射文件

1.概览 (1)什么是内存映射文件     内存映射文件是由一个文件到一块内存的映射,使进程虚拟地址空间的某个区域与磁盘上某个文件的部分或全部内容的建立映射。     建立映射后,通过该区域可以直接对被映射的磁盘文件进行访问.而不必执行文件I/O操作也无需对文件内容进行缓冲处理。 就好像整个被映射的文件都加载到了内存一样,因此内存文件映射非常适合于用来管理大文件。 注:与虚拟内存使用的是

zhihu008的专栏 5186

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

【温室气体数据集】CAMS 发布的温室气体(GHG)数据集总结

WW、forever的博客 555

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

全面介绍Windows内存管理机制及C++内存分配实例

(一):进程空间   本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。 本文目的: 对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。 1.      进程地址空间 1.1地址空间 ·        32|

zhujunwsk的专栏 3143

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

内存属性类型

PAGE_WRITECOPY--- PAGE_EXECUTE_WRITECOPY PAGE_CUARD PAGE_NOCACHE PAGE_READONLY---只读 PAGE_READWRITE---可读写 PAGE_EXECUTE---可执行 PAGE_EXECUTE_READWRITE---可读可写可执行 PAGE_NOACCESS---该属性内存拒绝所有操作 PAGE_WRITECOMBINE ...

qq_42125216的博客 399

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Windows API(四)Win32 内存结构

1. 进程的地址空间 进程创建时系统分配4G的地址空间。 1.1 Windows如何划分进程的地址空间 范围 大小 作用 说明 0x00000000 - 0x0000FFFF 64KB 用于NULL指针分配,不可访问 NULL指针区域,师徒读写这一分区中内存地址将会引起访问冲突 0x00010000 - 0x7FFEFFFF 2GB - 64K - 64KB 属于Win 32进...

David 1898

Windows内存中page的copy on write Memo

Windows中内存page的copy on write属性非常有用。他保证了如果一个应用程序的多个实例被启动,或是一个dll被多个启动的应用程序同时使用时,全局和静态变量不会受到污染。大致原理就是:应 用程序启动多个实例,这多个进程的地址空间中,应用程序部分地址空间对应到physical storage上,都是一份(memory map的)。所以,如果一个实例尝试修改一个全局或静态变量时,如果...

weixin_30755709的博客 180

Redis-关于RDB的几点顿悟-COW(Copy On Write)

在看Redis的持久化机制中的RDB时,有几个疑问, 1、RDB的过程中是否会停止对外提供服务? 2、RDB的过程中数据修改了,备份的是修改前的还是修改后的?

Muscleape的博客 5928

从win32中的写时复制(Copy on write )机制谈起

我们知道,内存映射文件的物理存储器来自

bobopeng 3638

JIURL玩玩Win2k内存篇 内存共享(二) CopyOnWrite

JIURL玩玩Win2k内存篇 内存共享(二) CopyOnWrite作者: JIURL                 主页: http://jiurl.yeah.net     日期: 2003-7-30 CopyOnWrite     对于同一个可执行文件运行的两个进程,或

jiurl的专栏 2109

gloomy的《内存与进程管理器》

来源:https://www.xfocus.net/bbs/index.php?act=ST&f=2&t=58182内存与进程管理器==========================                                   But I fear tomorrow Ill be crying,                                   Y

Purpleendurer@优快云 2381

线程安全的集合类、CopyOnWrite机制介绍

关于集合框架的其他部分可以查看另一篇文章:JAVA集合框架学习总结,这里仅就集合框架中的线程问题做讨论,有错误之处欢迎指正。LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的; HashMap是非线程安全的,HashTable是线程安全的;Java.util.concurrent.ConcurrentHashMap ConcurrentHashMa

YEN_优快云的博客 1794

Windows内存放血篇,突破物理内存的CopyOnWrite

本篇以x86(开启PAE) 以及x64 Win7系统不借助微软API突破内存的写拷贝机制进行讲述 https://bbs.pediy.com/thread-222949.htm 0x01 Before Starting 1. PAE: Physical Address Extension,Inter为了支持更大的物理内存寻址而设计的x86寻址方式...

622

CopyOnWrite机制,优缺点

转载:https://www.cnblogs.com/dolphin0520/p/3938914.html

weixin_39312465的博客 1186
上一篇: Windows 2000内核KPEB/KTEB详细结构(http://webcrazy.yeah.net/)
下一篇: Windows NT/2000/XP下不用驱动的Ring0代码实现(http://webcrazy.yeah.net)
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值