zoukankan      html  css  js  c++  java
  • Windows内存中page的copy on write Memo

    Windows中内存page的copy on write属性非常有用。他保证了如果一个应用程序的多个实例被启动,或是一个dll被多个启动的应用程序同时使用时,全局和静态变量不会受到污染。

    大致原理就是:

    应 用程序启动多个实例,这多个进程的地址空间中,应用程序部分地址空间对应到physical storage上,都是一份(memory map的)。所以,如果一个实例尝试修改一个全局或静态变量时,如果没有copy-on-write,这个变量就会被污染。所以windows在使用 memory map装载应用程序时,对全局和静态变量识别,然后给存放这些变量的page设上copy-on-write属性,这样当一个实例尝试修改一个全局或静态 变量时,一个exceptin产生,windows捕获然后重新分配page出来给该实例使用,从而避免了污染。DLL的处理方式和这个是一模一样的。

    今天在做SD的时候,想到一个问题。那一个进程中的多个线程在访问全局或静态变量时,是不是也有这种逻辑呢?如果是,那所有涉及全局和静态变量的function就都MultiThread safe了!显然,这是不可能的。原因是:

    当 进程中的某个线程尝试修改全局或静态变量时,windows就会分配新的page出来,然后修改进程的地址空间中对应该page的部分,该page的 physical storage就指向了新建的page。所以,当该进程的其他线程再访问变量时,操作的就已经是新建出来的page了。此时,就有多线程问题了。

    所以,copy-on-write解决的是多实例,或是dll中的全局,静态变量不被污染的问题。和多线程没有关系。在一个进程的多线程情况下,针对全局和静态变量要用线程同步来保证线程安全。
  • 相关阅读:
    【NOIP2007】守望者的逃离
    20200321(ABC)题解 by 马鸿儒 孙晨曦
    20200320(ABC)题解 by 王一帆
    20200319(ABC)题解 by 王一帆 梁延杰 丁智辰
    20200314(ABC)题解 by 董国梁 蒋丽君 章思航
    20200309(ABC)题解 by 梁延杰
    20200307(DEF)题解 by 孙晨曦
    20200306(ABC)题解 by 孙晨曦
    20200305(DEF)题解 by 孙晨曦
    20200303(ABC)题解 by 王锐,董国梁
  • 原文地址:https://www.cnblogs.com/super119/p/2011404.html
Copyright © 2011-2022 走看看