Processes: Bilkent University Department of Computer Engineering CS342 Operating Systems
Processes: Bilkent University Department of Computer Engineering CS342 Operating Systems
Chapter 3
Processes
Last Update: Sep 30, 2020
1
Outline
OUTLINE
• Process Concept
• Process Scheduling
• Operations on Processes
– Creating processes
• Inter-process Communication
• Examples of IPC Systems
• Communication in Client-Server Systems
2
Process Concept and Process Management
3
Process Concept
4
Process: program in execution
• But if we want to start several processes, then the running program in CPU
(current process) has to be stopped for a while and other program (process)
has to run in CPU.
– Process management becomes an important issue
– To do process switch, we have to save the state/context (register values)
of the CPU which belongs to the stopped program, so that later the
stopped program can be re-started again as if nothing has happened.
• Keep track of process progress
5
Process: program in execution
CPU
SP
registers
(Physical)
(Physical)
PSW Main
Main
PC Memory
Memory
(RAM)
(RAM)
IR
CPU state
of the process
(CPU context) process address space
Process processes
Three program counters
A
Process C
B Process
Process Process B
A C
B
Process A
C
time
Conceptual model
what is of three different one process
happening processes executing at
physically a time
7
Process in Memory
Stack segment
(holds the called function parameters,
local variables, return values)
Data segment
(includes global
variables, arrays, etc., you use)
Text segment
A process needs this memory (code segment)
content to run (instructions are here)
(called address space; memory image)
8
Process Address Space
9
Process State
10
Diagram of Process State
11
Process Control Block
Process 1 Process 2 Process 3 Process N
address space
stack stack stack stack
process
data data data data
text text text text
13
Process Representation in Linux
struct task_struct {
long state; /* state of the process */
….
pid_t pid; /* identifier of the process */
…
unisigned int time_slice; /* scheduling info */
…
struct files_struct *files; /* info about open files */
….
struct mm_struct *mm; /* info about the address space of this process */
…
}
14
CPU Switch from Process to Process
15
Example: Processes in Linux
• The /proc file system in Linux is the kernel interface to users to look to the
kernel state (variables, structures, etc.).
– Many subfolders
– One subfolder per process (name of subfolder == pid of process)
16
Process Queues and Scheduling
17
Process Scheduling
Select Dispatch
(Scheduling Algorithm) (mechanism)
18
Scheduling
Job queue
19
Ready Queue and Various I/O Device Queues
20
Representation of Process Scheduling
CPU Scheduler
ready queue
I/O queue
21
Schedulers
Short-term
scheduler
CPU
ready queue
job queue
22
Schedulers
23
Addition of Medium Term Scheduling
24
Process Behavior
waiting waiting
25
Context Switch
• When CPU switches to another process, the system must save the state of the
old process and load the saved state for the new process via a context switch
26
Process Creation and Termination
27
Process Creation
28
Process Creation (Cont)
• UNIX examples
– fork system call creates new process
– exec system call used after a fork to replace the process’ memory space
with a new program
29
C Program Forking Separate Process in Linux
int main()
{ Parent
pid_t n; // stores process id pid=x
n=?
n = fork(); before fork() executed
if (n < 0) {
fprintf(stderr, "Fork Failed");
exit(-1);
} Parent Child pid=y
else if (n == 0) { /* child process*/ pid=x
n=y n=0
execlp("/bin/ls", "ls", NULL);
}
else { /* parent process */ after fork() executed
wait (NULL);
printf ("Child Complete");
exit(0); Parent
} pid=x n=y Child pid=y
}
after execlp() executed
30
Execution Trace: fork()
Process-Parent Process-Child
stack n y stack n 0
PC
data data
…. ….
text n=fork(); text n=fork();
If (n == 0) If (n == 0)
.. ..
else if (n>0) else if (n>0)
CPU ... ...
PC PC
x pid y pid
PCB-Parent PCB-Child
sys_fork()
Kernel {….}
RAM
31
Execution Trace: fork() with execlp()
Process-Parent Process-Child
stack n y stack n 0
PC
data data
…. ….
text n=fork(); text n=fork();
If (n == 0) If (n == 0)
new code
…exec() …exec()
else if (n>0) else if (n>0)
CPU ... ...
PC PC
x pid y pid
PCB-Parent PCB-Child
sys_fork() sys_execve()
Kernel {….} {….}
RAM
32
Family of exec() Functions in Unix
Program A Program B
… …
Your Programs execlp(…); execv(…); …..
… …
user
execl(...) execlp(...) execle(...) execv(...) execvp(...) execve(...) mode
C Library {…} {…} {…} {…} {…} {…}
sys_execve(…)
{ kernel
Kernel … mode
}
33
Examples
main()
pid_t n=0; What is the following pseudocode doing?
main()
pid_t x,y;
x = fork();
if (x==0) {
y = fork();
if (y==0) {
print (“hello”);
}
}
}
35
Examples
What is the following pseudocode doing?
main() {
int x,y;
x = fork();
if (x==0) {
y = fork();
if (y==0) {
print (“hello”);
exit(0);
}
exit(0);
}
waitpid (x);
}
36
A tree of processes on a typical Solaris
37
Process Termination
• Process executes last statement and asks the operating system to delete it (can
use exit system call)
– Output data from child to parent (via wait)
– Process’ resources are deallocated by operating system
38
Process Termination
Parent Child
fork();
….
….
….
….
….
x = wait ();
exit (code);
sys_wait() sys_exit(..)
{ {
…return(..) …
Kernel } }
39
Inter-process Communication (IPC)
40
Cooperating Processes and the need for
Interprocess Communication
• Processes within a system may be independent or cooperating
– Independent process cannot affect or be affected by the execution of
another process
– Cooperating process can affect or be affected by the execution of
another process
Application
41
IPC Mechanisms
42
Communication Models
43
Shared Memory IPC Mechanism
44
Access via pointers
char *cptr;
char c;
Buffer
Producer Produced Items Consumer
Process Process
// Shared data
#define BUFFER_SIZE 10
typedef struct {
...
} item;
item buffer[BUFFER_SIZE];
int in = 0; // next free position
int out = 0; // first full position
47
Buffer State in Shared Memory
item buffer[BUFFER_SIZE]
Producer Consumer
int out;
int in;
Shared Memory
48
Buffer State in Shared Memory
Buffer Full
in out
((in+1) % BUFFER_SIZE == out) : considered full buffer
Buffer Empty
in out
50
Message Passing IPC Mechanism
51
Implementation in a system
• The
Howmessaging
are links established?
passing facility can be implemented in various ways.
– Explicitly by the process? Or implicitly by the kernel?
• Can
That ameans
link bethe
associated
facility may
withhave
moredifferent
than twofeatures
processes?
depending on the system
• How many links can be there between a pair of communicating processes?
• What is the capacity of a link?
• Is the size of a message that the link can accommodate fixed or variable?
• Is a link unidirectional or bi-directional?
52
Naming: Identifying the receiver
• Naming (how do we identify the receiver)
– Direct naming and communication
• Receiver and sender process explicitly specified
– send (P, message) – send a message to process P
– receive(Q, message) – receive a message from process Q
• How does the sender/receiver behave if it can not send/receive the message
immediately
– Depends whether Blocking or Non-Blocking communication is used
54
Buffering
55
Synchronization
Sender Receiver
Kernel
Buffer
56
Example IPC: POSIX message queues
POSIX (Portable Operating System Interface) is the standard API for Unix-like systems.
shareddefs.h
struct item {
int id;
char astr[64];
};
#include "shareddefs.h"
int main()
{
mqd_t mq; struct item item; int n;
mq = mq_open(MQNAME, O_RDWR);
if (mq == -1) { perror("mq_open failed\n"); exit(1); }
int i = 0;
while (1) {
item.id = i;
strcpy(item.astr, "os is good\n");
n = mq_send(mq, (char *) &item, sizeof(struct item), 0);
if (n == -1) {perror("mq_send failed\n"); exit(1); }
i++;
sleep(1);
}
mq_close(mq);
return 0;
}
58
#include <stdlib.h>
#include <mqueue.h>
#include <stdio.h> consumer.c
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include "shareddefs.h”
int main()
{ mqd_t mq; struct mq_attr mq_attr;
struct item *itemptr;
int n, buflen; char *bufptr;
consumer: consumer.c
gcc -Wall -o consumer consumer.c -lrt
producer: producer.c
gcc -Wall -o producer producer.c -lrt
clean:
rm -fr *~ producer consumer
korpe@ubuntu:~/x$ ls
60
Example IPC: POSIX shared memory
• The following functions are defined to create and manage shared memory in
POSIX API
• shm_open():
– create or open a shared memory region/segment (also called
shared memory object)
• shm_unlink():
– remove the shared memory object
• ftruncate():
– set the size of shared memory region
• mmap():
– map the shared memory into the address space of the process.
With this, a process gets a pointer to the shared memory region
and can use that pointer to access the shared memory.
61
Example IPC: POSIX shared memory
• The following functions are defined to create and manage shared memory in
POSIX API
• shm_open():
– create or open a shared memory region/segment (also called
shared memory object)
• shm_unlink():
– remove the shared memory object
• ftruncate():
– set the size of shared memory region
• mmap():
– map the shared memory into the address space of the process.
With this, a process gets a pointer to the shared memory region
and can use that pointer to access the shared memory.
62
producer
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h> In this example, run the producer first.
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main()
{
const int SIZE = 4096; const char *name = "OS";
const char *message0= "Studying "; const char *message1= "Operating Systems ";
const char *message2= "Is Fun!";
int shm_fd; void *ptr;
sprintf(ptr,"%s",message0);
ptr += strlen(message0);
sprintf(ptr,"%s",message1);
ptr += strlen(message1);
sprintf(ptr,"%s",message2);
ptr += strlen(message2);
return 0;
}
63
consumer
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
int main()
{
const char *name = "OS";
const int SIZE = 4096;
int shm_fd;
void *ptr; int
printf("%s",ptr);
64
Other IPC methods:
pipes
• Unix/Linux Pipes:
– A pipe enables one-way communication
between a parent and child and vice versa
– It is easy to use.
– When process terminates, pipe is removed
automatically
– pipe() system call
P C
pipe
65
#include <stdio.h> Parent is sending to Child
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#define BUFFER_SIZE 25 C P
#define READ_END 0
#define WRITE_END 1
0(R) 1(W)
int main(void)
{
char write_msg[BUFFER_SIZE] = "Greetings";
char read_msg[BUFFER_SIZE]; pid_t pid;
int fd[2]; // an array of 2 integers fd[0] and fd[1]
pid = fork();
if (pid < 0) { fprintf(stderr, "Fork failed"); return 1; }
if (pid > 0) {
close(fd[READ_END]); //close read end (index 0) - it is unused here
write(fd[WRITE_END], write_msg, strlen(write_msg)+1);
close(fd[WRITE_END]);
}
else { /* child process */
close(fd[WRITE_END]); //close write end (index 1) - it is unused here
read(fd[READ_END], read_msg, BUFFER_SIZE);
printf("child read %s\n",read_msg);
close(fd[READ_END]);
}
return 0;
} 66
Other IPC methods:
named-pipes (FIFOs)
– A named-pipe is called FIFO.
• It has a name (a filename)
• Call mkfifo() to create
– When processes terminate, it is not removed automatically
– No need for parent-child relationship
– Bidirectional
– Any two processes can create and use named pipes.
P1 P2
a_filename
named pipe
67
Communication Through Network:
Client-Server Communication
68
Communications in Client-Server Systems
• Sockets
• Remote Procedure Calls
• Remote Method Invocation (Java)
69
Sockets
Network
M1 M2
70
Socket Communication
71
Sockets
• Two types
– TCP (STREAM)
– UDP
• A socket is bound to an address and port.
• A network application
– Two parts
• Usually a server and a client
72
TCP Server and Client
• cConnect
= Accept (c,(s)
s_address_port)
• Read(c)
Read (c)and
andWrite(c)
Write (c)
• Close(c)
Close (c)
73
Remote Procedure Calls
74
Execution of RPC
75
Remote Method Invocation
76
Marshalling Parameters
77
References
78
Additional Study Material
79