Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Jan 1998 01:13:38 -0600 (CST)
From:      Joel Ray Holveck <joelh@gnu.org>
To:        tlambert@primenet.com
Cc:        tlambert@primenet.com, chrisy@flix.net, freebsd-hackers@FreeBSD.ORG
Subject:   Re: sharable static arrays?
Message-ID:  <199801150713.BAA04785@detlev.UUCP>
In-Reply-To: <199801142007.NAA07464@usr06.primenet.com> (message from Terry Lambert on Wed, 14 Jan 1998 20:07:31 %2B0000 (GMT))
References:   <199801142007.NAA07464@usr06.primenet.com>

next in thread | previous in thread | raw e-mail | index | archive | help

> OK.  Sean was wrong and I was wrong.

Not wrong, if I understand properly, you just correctly answered a
different question than what I meant to ask.

> What you want is already in there.  All original vnode data is
> shared between all processes.  This includes static data.  The
> program txt (executable code) is read-only.  Data is read/write, but
> is marked copy-on-write.  You do not take memory space for
> additional instances of the program, *unless* you write the data.
> If you do, it's copied.  A page at a time.  Uninitialized and
> allocated data are BSS data.  This is allocated per process.

So, let me make sure I've got this straight:

int		g_uninit;	   /* Global uninitialized */
int		g_statinit = 1;	   /* Global statically initialized */
static int	fs_g_uninit;	   /* File scope uninitialized */
static int	fs_g_statinit = 1; /* File scope statically initialized */
const int	g_const = 1;	   /* Global constant */
foo()
{
	int		local_uninit;   /* Auto uninitialized */
	int		local_init = 4; /* Auto initialized */
	static int	ls_uninit;	/* Local static uninitialized */
	static int	ls_init = 4;    /* Local static initialized */
}

Now, I know the scoping rules, and I know the lifetime-of-data rules.
These are not my concern.

If I understand right:

g_statinit, fs_g_statinit, and ls_init are all stored in the data
segment, which is allocated and initialized at compile-time, and at
run-time is initially shared by all instances of the executable but is
copy-on-write (per page).  (I did not originally realize that the data
segment was loaded copy-on-write; I had thought that a separate copy
was generated for each process.)

g_uninit, fs_g_uninit, and ls_uninit are all stored in the BSS
segment.  Memory is reserved in the virtual address space at load
time, but not physically allocated until a page is written to during
run-time.

local_uninit and local_init are allocated on the stack at run-time.
local_init is initialized at run-time (by code generated by the
compiler) semimmediately after allocation.

Now, my question originally boiled down to this: does g_const get
allocated in text or data?  I was assuming this would be significant
because I thought that text was allocated as shareable, but data had a
separate copy for each process.  Now, realizing that data is
copy-on-write, I discover it is not an issue.

> I hope this answers all your questions, and the questions that the
> initial answers might have raised, so we can put this to rest.  8-).

All my questions raised by answers have been answered, and my original
question has been shown to be moot.  I, too, will tire of this thread
before long.

I do appreciate the help from all.

Cheers,
joelh

-- 
Joel Ray Holveck - joelh@gnu.org - http://www.wp.com/piquan
   Fourth law of programming:
   Anything that can go wrong wi
sendmail: segmentation violation - core dumped



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199801150713.BAA04785>