http://www.perlmonks.org?node_id=436654

DeadPoet has asked for the wisdom of the Perl Monks concerning the following question:

To All:

Please enlighten me on a curious perl compile option. The option is know as PERL_COPY_ON_WRITE. What is it and what does it do?

Sincerely,
DeadPoet
  • Comment on What is PERL_COPY_ON_WRITE Compile Option About

Replies are listed 'Best First'.
Re: What is PERL_COPY_ON_WRITE Compile Option About
by BrowserUk (Patriarch) on Mar 04, 2005 at 18:18 UTC

    PERL_COPY_ON_WRITE has nothing to do with threads or process as far as I can see.

    It is used by code within the pp_hot.c, regcomp.h and other places to avoid copying data until (and unless) it is written to.

    An example with informative comment comes from pp_hot.c:

    #ifdef PERL_COPY_ON_WRITE /* The match may make the string COW. If so, brilliant, because that's just saved us one malloc, copy and free - the regexp has donated the old buffer, and we malloc an entirely new one, rather than the regexp malloc()ing a buffer and copying our original, only for us to throw it away here during the substitution. */ if (SvIsCOW(TARG)) { sv_force_normal_flags(TARG, SV_COW_DROP_PV); } else #endif

    Examine what is said, not who speaks.
    Silence betokens consent.
    Love the truth but pardon error.
      To All:

      Here is what I just found at
        http://yapc.mongueurs.net/yapc/talk/?tid=85
      "Currently in perl when you write $a = $b, the contents of $b are immediately copied into $a. In theory perl could just pretend that it did the copy, and only actually do it if one of $a or $b is modified. If $b is a large string, and $a is never modified this could potentially be a big efficiency gain. This talk consists of simple pictures - how I didn't do it, and how I did."


      DeadPoet

        It appears that currently, COW is only used for certain copy operations--some of those in the regex engine, shared hash keys (or values?), and a few other places--but not currently simple scalars.

        It looks like the proposal is to extend it's reach.


        Examine what is said, not who speaks.
        Silence betokens consent.
        Love the truth but pardon error.
        That was an excelent talk. Highly informative and imaginatively illustrated with several people holding up cards in a carefully choreographed sequence.
Re: What is PERL_COPY_ON_WRITE Compile Option About
by hardburn (Abbot) on Mar 04, 2005 at 17:24 UTC

    CoW refers to a method of optimizing memory usage for multithreaded programs. Consider a program that fork()s after intitlizing a variable. Under normal usage, those variables are copied into the memory space for each program. Under CoW, they point to the orginal variable in the parent. As long as each thread only reads the variables, this is safe. When a modification occurs, the variable is copied into the specific thread's memory space, thus keeping the change from other threads.

    "There is no shame in being self-taught, only in not trying to learn in the first place." -- Atrus, Myst: The Book of D'ni.

      I'm confused by your answer. You talk of threads created by fork, but fork creates new processes, not new threads (except in Windows). Does CoW affect multitasking or multithreading or both?

        "Processes are threads with an attitude. Or the other way around." (I belive this is attributed to Larry, and may not be an exact quote).

        Forks and threads are conceputally similar, and for the purposes of CoW, are basically the same thing.

        "There is no shame in being self-taught, only in not trying to learn in the first place." -- Atrus, Myst: The Book of D'ni.