summaryrefslogtreecommitdiff
path: root/glibc
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@schwinge.name>2010-11-26 09:33:49 +0100
committerThomas Schwinge <thomas@schwinge.name>2010-11-26 09:33:49 +0100
commite90db4db98bf65bd354994a7496b6b4e534e3f32 (patch)
treeb4d13c0341da02f2b75e9ebc948a065c491ded68 /glibc
parentf8f6115e7241673ec3cd5cdc79757a5139384623 (diff)
glibc/fork: New.
Diffstat (limited to 'glibc')
-rw-r--r--glibc/fork.mdwn41
1 files changed, 41 insertions, 0 deletions
diff --git a/glibc/fork.mdwn b/glibc/fork.mdwn
new file mode 100644
index 00000000..d1b26906
--- /dev/null
+++ b/glibc/fork.mdwn
@@ -0,0 +1,41 @@
+[[!meta copyright="Copyright © 2010 Free Software Foundation, Inc."]]
+
+[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable
+id="license" text="Permission is granted to copy, distribute and/or modify this
+document under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no Invariant
+Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license
+is included in the section entitled [[GNU Free Documentation
+License|/fdl]]."]]"""]]
+
+On [[Unix]] systems, `fork` is a rather simple system call.
+
+Our implementation in [[glibc]] is and needs to be rather bulky.
+
+For example, it has to duplicate all port rights for the new [[Mach
+task|microkernel/mach/task]]. The address space can simply be duplicated by
+standard means of the [[microkernel/Mach]], but as [[file descriptor]]s (for
+example) are a concept that is implemented inside [[glibc]] (based on [[Mach
+port|microkernel/mach/port]]s), these have to be duplicated from userspace,
+which requires a small number of [[RPC]] for each of them.
+
+In sum, [[this affects performance|open_issues/performance/fork]] when new
+processes are continuously being spawned from the shell, for example.
+
+Often, a `fork` call will eventually be followed by an `exec`, which will in
+turn close (most of) the duplicated port rights. Unfortunately, this cannot be
+known at the time the `fork` executing, so the code calling `fork` has to be
+modified, and the `fork`, `exec` combo be replaced by a `posix_spawn` call, for
+example, to avoid this work of duplicating each port right, then closing each
+again.
+
+As far as we know, Cygwin has the same problem of `fork` being a nontrivial
+operation. Perhaps we can learn from what they're been doing? Also, perhaps
+they have patches for software packages, to avoid using `fork` followed by
+`exec`, for example.
+
+---
+
+We no longer support `MACH_IPC_COMPAT`, thus we can get rid of the `err =
+__mach_port_allocate_name ([...]); if (err == KERN_NAME_EXISTS)` code[[!tag
+open_issue_glibc]].