29
LINUX System Process (additional slides)

LINUX System Process (additional slides)

  • Upload
    gay

  • View
    37

  • Download
    0

Embed Size (px)

DESCRIPTION

LINUX System Process (additional slides). System Calls Dealing with Memory Management. System Calls Dealing with Synchronization. Miscellaneous. fork. exec. brk. exit. wait. signal. kill. setpgrp. setuid. dupreg attachreg. detachreg allocreg attachreg growreg loadreg mapreg. - PowerPoint PPT Presentation

Citation preview

Page 1: LINUX System Process (additional slides)

LINUX System Process (additional slides)

Page 2: LINUX System Process (additional slides)

2

Process Control• Control of Process Context

– fork : create a new process– exit : terminate process execution– wait : allow parent process to synchronize its execution

with the exit of a child process– exec : invoke a new program – brk : allocate more memory dynamically– signal : inform asynchronous event– major loop of the shell and of init

fork

dupregattachreg

detachregallocregattachreggrowregloadregmapreg

exec brk

growreg

exit

detachreg

wait signal kill setpgrp setuid

System Calls Dealingwith Memory Management

System Calls Dealingwith Synchronization

Miscellaneous

Page 3: LINUX System Process (additional slides)

3

Sequence of Operations for fork

1. It allocates a slot in process table for the new process

2. It assigns a unique ID number to the child process

3. It makes a logical copy of the context of the parent process. Since certain portion of process, such as the text region, may be shared between processes, the kernel can sometimes increment a region reference count instead of copying the region to a new physical location in memory

4. It increments file and inode table counters for files associated with the process.

5. It returns the ID number of child process to the parent process, and a 0 value to the child process.

Page 4: LINUX System Process (additional slides)

4

Algorithm for forkinput : noneoutput : to parent process, child PID number to child process, 0{

check for available kernel resources;get free process table slot, unique PID number;check that user not running too many process;mark child state "being created";copy data from parent process table to new child slot;increment counts on current directory inode and changed root(if applicable);increment open file counts in file table;make copy of parent context(u area, text, data, stack) in memory;push dummy system level context layer onto child system level context;

dummy context contains data allowing child processto recognize itself, and start from herewhen scheduled;

Page 5: LINUX System Process (additional slides)

5

Algorithm for fork(Cont.)

if ( executing process is parent ){

change child state to "ready to run";return(child ID); /* from system to user */

}else /* executing process is the child process */{

initialize u area timing fields;return(0); /* to user */

}}

Page 6: LINUX System Process (additional slides)

6

Fork Creating a New Process Context

ParentData

Per ProcessRegion Table Open Files

Current Directory

Changed Root

.

.

.

.

.Kernel Stack

U Area

Per ProcessRegion Table Open Files

Current Directory

Changed Root

.

.

.

.

.Kernel Stack

U Area

FileTable

InodeTable

Parent Process

Child Process

ParentUser Stack

SharedText

ChildData

ChildUser Stack

Page 7: LINUX System Process (additional slides)

7

Example of Sharing File Access

#include <fcntl.h>int fdrd, fdwt;char c;

main( argc,argv )int argc;char *argv[];

{if ( argc != 3 ) exit(1);if ((fdrd=open(argv[1],O_RDONLY))==-1) exit(1);if ((fdwt=creat(argv[2],0666))==-1) exit(1);fork();/*both process execute same code*/rdwt();exit(0);

}

rdwt(){

for(;;){

if (read(fdrd,&c,1)!=-1) return;write(fdwt,&c,1);

}}

Page 8: LINUX System Process (additional slides)

8

Example of Sharing File Access(Cont.)

Inode Table

User FileDescriptor Table(Parent Process)

...

(Child Process)

...

File Table

Count Read 2 Only

:::Count Read 2 Write

fdrdfdwt

fdrdfdwt

• fdrd for both process refer to the file table entry for the source file(argv[1])

• fdwt for both process refer to the file table entry for the target file(argv[2])

• two processes never read or write the same file offset values.

Page 9: LINUX System Process (additional slides)

Interprocess Communication

IPC using regular files

• unrelated processes can share

• fixed size

• lack of synchronization

IPC using pipes

• for transmitting data between related processes

• can transmit an unlimited amount of data

• automatic synchronization on open()

Page 10: LINUX System Process (additional slides)

Pipe

$ who | sort

pipewho sort

write pointer ofanother process

read pointer of one process

Page 11: LINUX System Process (additional slides)

pipes

Two file descriptors are returned through the fd argument

• fd[0]: can be used to read from the pipe, and

• fd[1]: can be used to write to the pipe

Anything that is written on fd[1] may be read by fd[0].

• This is of no use in a single process.

• However, between processes, it gives a method of communication

The pipe() system call gives parent-child processes a way to

communicate with each other.

#include <unistd.h>

int pipe(int fd[2]) Returns: 0 if OK, -1 on error

Page 12: LINUX System Process (additional slides)

pipe after fork

user process

fd[0] fd[1]

pipe

kernel

child process

fd[0] fd[1]

pipe

kernel

parent process

fd[0] fd[1]

Page 13: LINUX System Process (additional slides)

dup

• The new file descriptor returned by dup is guaranteed to be the lowest numbered available file descriptor.

• With dup2, we specify the value of the new descriptor with the filedes2 argument

• The new file descriptor that is returned as the value of the functions shares the same file table entry as the filedes argument.

#include <unistd.h>

int dup(int filedes);Int dup2(int filedes, int filedes2);

Both return: new file descriptor if OK, -1 on error

Page 14: LINUX System Process (additional slides)

example

• dup(1);

fd 0

fd 1

fd 2

fd 3

fd 4

File descriptor table File table entry

Page 15: LINUX System Process (additional slides)

15

Use of Pipe, Dup, and Fork#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

#include <errno.h>

#include <sys/wait.h>

int main(int argc, char *argv[]) {

char *path = "/bin/ls";

char *arg0 = "ls";

pid_t pid;

int pipefd[2];

int status;

pipe(pipefd);

pid = fork();

if (pid == 0) { dup2(pipefd[1], STDOUT_FILENO); close(pipefd[0]); close(pipefd[1]); if (execl(path, arg0, NULL) == -1) perror("execl"); } else { if (fork() == 0) { dup2(pipefd[0], STDIN_FILENO); close(pipefd[0]); close(pipefd[1]); if (execl("/bin/cat", "cat", NULL) == -1) perror("execl cat"); } else { close(pipefd[0]); close(pipefd[1]); wait(&status); wait(&status); } }}

Page 16: LINUX System Process (additional slides)

16

Process Termination• exit system call

– process terminate by exit system call• enters the zombie status• relinquish resources (close all open files)• buffered output written to disk• dismantles its context except for its slot in the process table.

– exit(status);• status : the value returned to parent process• can be used for unix shell (shell programming)

– call exit explicitly or implicitly(by startup routine) at the end of program.

– kernel may invoke internally on receipt of uncaught signals. In this case, the value of status is the signal number.

Page 17: LINUX System Process (additional slides)

Exit handler

• Register exit handler– Register a function that is called when a program is

terminated– Called in reverse order of registration

#include <stdlib.h>

void atexit(void (*func)(void)); returns: 0 if OK, nonzero on error

Page 18: LINUX System Process (additional slides)

Exit handler/* doatexit.c */static void my_exit1(void), my_exit2(void);

int main(void) { if (atexit(my_exit2) != 0) perror("can't register my_exit2"); if (atexit(my_exit1) != 0) perror("can't register my_exit1"); if (atexit(my_exit1) != 0) perror("can't register my_exit1"); printf("main is done\n"); return 0;}

static void my_exit1(void) { printf("first exit handler\n");}

static void my_exit2(void) { printf("second exit handler\n");}

Output :

main is donefirst exit handlerfirst exit handlersecond exit handler

Page 19: LINUX System Process (additional slides)

19

Algorithm for Exitalgorithm exitinput : return code for parent processoutput : none{

ignore all signals;if ( process group leader with associated control terminal ){

send hangup signal to all members of process group;reset process group for all members to 0;

}close all open files(internal version of algorithm close)release current directory(algorithm iput);release current(changed) root, if exists (algorithm iput);free regions, memory associated with process(algorithm freereg);write accounting record;make process state zombie;assign parent process ID of all child processes to be init process(1);

if any children were zombie, send death of child signal to init;send death of child signal to parent process;context switch;

}

Page 20: LINUX System Process (additional slides)

20

Awaiting Process Termination

• wait system call– synchronize its execution with the termination of a child

process

– pid = wait(stat_addr);• pid : process id of the zombie child process• stat_addr : address of an integer to contain the exit status of the

child

Page 21: LINUX System Process (additional slides)

21

Algorithm for Awaiting Process Termination

1. searches the zombie child process2. If no children, return error3. if finds zombie children, extracts PID number and exit code4. adds accumulated time the child process executes in the user

and kernel mode to the fields in u area5. Release process table slot

Page 22: LINUX System Process (additional slides)

22

Algorithm for Waitalgorithm waitinput : address of variables to store status of exiting processoutput : child ID, child exit code{

if (waiting process has no child process)return(error);

for(;;){

if (waiting process has zombie child){

pick arbitrary zombie child;add child CPU usage to parent;free child process table entry;return(childID,child exit code);

}if (process has no child process)

return(error);sleep at interruptible priority(event child process exits);

}}

Page 23: LINUX System Process (additional slides)

23

Invoking Other Programs

• exec system call– invokes another program, overlaying the memory space of a

process with a copy of an executable file

– execve(filename, argv, envp)• filename : the name of executable file being invoked• argv : a pointer to an array of character pointers that are

parameters to the executable program• envp : a pointer array of character pointers that are environment of

the executed program

– several library functions that calls exec system callexecl, execv, execle...

Page 24: LINUX System Process (additional slides)

24

Algorithm for Execalgorithm execinput : (1) file name (2) parameter list (3) environment variables listoutput : none{

get file inode(algorithm namei)verify file executable, user has permission to execute;read file headers, check that it is a load module;copy exec parameters from old address space to system space;for(every region attached to process)

detach all old regions(algorithm detach);for(every region specified in load module){

allocate new regions(algorithm allocreg);attach the regions(algorithm attachreg);load region into memory if appropriate(algorithm loadreg);

}copy exec parameters into new user stack region;special processing for setuid programs, tracing;initialize user register save area for return to user mode;release inode of file(iput);

}

Page 25: LINUX System Process (additional slides)

Environment variables

• Environment variables(EV) are inherited from parent to child process

• Generally, EV are set in .login or .cshrc

$ envUSER=ysmoonLOGNAME=ysmoonHOME=/home/prof/ysmoonPATH=/bin:/usr/bin:/usr/local/bin:/usr/ccs/bin:/usr/ucb:/usr/

openwin/bin:/etc:.SHELL=/bin/csh......

Page 26: LINUX System Process (additional slides)

Environment list

• Environment variables are accessed through global variable environ

extern char ** environ;

• Each element has a form of “Name=Value”– Each string ends with ‘\0’– Last element of environ is NULL pointer

Page 27: LINUX System Process (additional slides)

Environment list

"USER=bongbong""LOGNAME=bongbong""HOME=/home/prof/bongbong""PATH=/bin:/usr/local…""MAIL =/var/mail/bongbong"

"SHELL=/bin/csh"NULL

environ:

environment pointer

environmentlist

environmentstrings

...

Page 28: LINUX System Process (additional slides)

getenv/putenv

#include <stdlib.h>

char *getenv(const char *name);

Returns : pointer to value associated with name, NULL if not found

#include <stdlib.h>

int putenv(const char *str); // str : “name=value” Returns: 0 if OK, nonzero on error

Page 29: LINUX System Process (additional slides)

setenv/unsetenv

#include <stdlib.h>int setenv(const char *name, const char *value, int rewrite);

Returns: 0 if OK, nonzero on error

void unsetenv(const char *name);