|
|
1.1 root 1: .\" @(#)p3 6.1 (Berkeley) 4/24/86
2: .\"
3: .SH
4: V. PROCESSES AND IMAGES
5: .PP
6: An
7: .IT image
8: is a computer execution environment.
9: It includes a memory image,
10: general register values,
11: status of open files,
12: current directory and the like.
13: An image is the current state of a pseudo-computer.
14: .PP
15: A
16: .IT process
17: is the execution of an image.
18: While the processor is executing on behalf of a process,
19: the image must reside in main memory;
20: during the execution of other processes it remains in main memory
21: unless the appearance of an active, higher-priority
22: process
23: forces it to be swapped out to the disk.
24: .PP
25: The user-memory part of an image is divided into three logical segments.
26: The program text segment begins at location 0 in the virtual address space.
27: During execution, this segment is write-protected
28: and a single copy of it is shared among
29: all processes executing the same program.
30: At the first hardware protection byte boundary above the program text segment in the
31: virtual address space begins a non-shared, writable data segment,
32: the size of which may be extended by a system call.
33: Starting at the highest
34: address in the virtual address space is a stack segment,
35: which automatically grows downward
36: as the stack pointer fluctuates.
37: .SH
38: 5.1 Processes
39: .PP
40: Except while
41: the system
42: is bootstrapping itself into operation, a new
43: process can come into existence only
44: by use of the
45: .UL fork
46: system call:
47: .P1
48: processid = fork\|(\|\|)\|
49: .P2
50: When
51: .UL fork
52: is executed, the process
53: splits into two independently executing processes.
54: The two processes have independent
55: copies of the original memory image,
56: and share all open files.
57: The new processes differ only in that one is considered
58: the parent process:
59: in the parent,
60: the returned
61: .UL processid
62: actually identifies the child process
63: and is never 0,
64: while in the child,
65: the returned value is always 0.
66: .PP
67: Because the values returned by
68: .UL fork
69: in the parent and child process are distinguishable,
70: each process may determine whether
71: it is the parent or child.
72: .SH
73: 5.2 Pipes
74: .PP
75: Processes may communicate
76: with related processes using the same system
77: .UL read
78: and
79: .UL write
80: calls that are used for file-system I/O.
81: The call:
82: .P1
83: filep = pipe\|(\|\|)\|
84: .P2
85: returns a file descriptor
86: .UL filep
87: and
88: creates an inter-process channel called a
89: .IT pipe .
90: This channel, like other open files, is passed from parent to child process in
91: the image by the
92: .UL fork
93: call.
94: A
95: .UL read
96: using a pipe file descriptor
97: waits until another process writes using the
98: file descriptor for the same pipe.
99: At this point, data are passed between the images of the
100: two processes.
101: Neither process need know that a pipe,
102: rather than an ordinary file,
103: is involved.
104: .PP
105: Although
106: inter-process communication
107: via pipes is a quite valuable tool
108: (see Section 6.2),
109: it is not a completely general
110: mechanism,
111: because the pipe must be set up by a common ancestor
112: of the processes involved.
113: .SH
114: 5.3 Execution of programs
115: .PP
116: Another major system primitive
117: is invoked by
118: .P1
119: execute\|(\|file, arg\*s\d1\u\*n, arg\*s\d2\u\*n, .\|.\|. , arg\*s\dn\u\*n\|)\|
120: .P2
121: which requests the system to read in and execute the program
122: named by
123: .UL file ,
124: passing it string arguments
125: .UL arg\v'.3'\*s1\*n\v'-.3'\| ,
126: .UL arg\v'.3'\*s2\*n\v'-.3'\| ,
127: .UL .\|.\|.\|\| ,
128: .UL arg\v'.3'\*sn\*n\v'-.3' .
129: All the code and data in the process invoking
130: .UL execute
131: is replaced from the
132: .UL file ,
133: but
134: open files, current directory, and
135: inter-process relationships are unaltered.
136: Only if the call fails, for example
137: because
138: .UL file
139: could not be found or because
140: its execute-permission bit was not set, does a return
141: take place from the
142: .UL execute
143: primitive;
144: it resembles a ``jump'' machine instruction
145: rather than a subroutine call.
146: .SH
147: 5.4 Process synchronization
148: .PP
149: Another process control system call:
150: .P1
151: processid = wait\|(\|status\|)\|
152: .P2
153: causes its caller to suspend
154: execution until one of its children has completed execution.
155: Then
156: .UL wait
157: returns the
158: .UL processid
159: of the terminated process.
160: An error return is taken if the calling process has no
161: descendants.
162: Certain status from the child process
163: is also available.
164: .SH
165: 5.5 Termination
166: .PP
167: Lastly:
168: .P1
169: exit\|(\|status\|)\|
170: .P2
171: terminates a process,
172: destroys its image,
173: closes its open files,
174: and generally obliterates it.
175: The parent is notified through
176: the
177: .UL wait
178: primitive,
179: and
180: .UL status
181: is made available
182: to it.
183: Processes may also terminate as a result of
184: various illegal actions or user-generated signals
185: (Section VII below).
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.