Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecture 4 Process, Thread and Task

Similar presentations


Presentation on theme: "Lecture 4 Process, Thread and Task"— Presentation transcript:

1 Lecture 4 Process, Thread and Task
September 20, 2016 Kyu Ho Park

2 Major Topics of Lect. 4 How to create a process.
How to create a thread. What is the task?

3 creating a process

4 creating a process

5 Process Concept An operating system executes a variety of programs:
Batch system – jobs Time-shared systems – user programs or tasks Process – a program in execution; process execution must progress in sequential fashion A process includes: program counter stack data section heap text In a batch system, a single job is executed at a time. To get a high utilization of CPU, the multiprogramming system had appeared. Also give fair opportunity to all processes, time sharing system was made. In MS window which is a single user system, a word processor, a web browser, e_mail process are running. At the same time, memory management process is running in the OS.

6 Process in Memory Stack SP Heap Data Text PC Program: text part
Data: global variables Heap: Dynamic data area such as allocated during program execution of ‘new’ and ‘malloc’. Stack: temporary data such as function parameters, return address, local variables. Process

7 Memory Map of a process

8 Memory Map of a process 4GB 3GB Stack heap data text

9 Virtualization Processes are provided with 2 virtualizations:
Virtualized Processor Virtualized Memory

10 Process State As a process executes, it changes state
new: The process is being created running: Instructions are being executed waiting: The process is waiting for some event to occur ready: The process is waiting to be assigned to a process terminated: The process has finished execution Now, we defined what the process is. We talked about the running process. Are all processes running? There are several states in a process. When you compile your program and get an executable file. When a program becomes a process when an executable file is loaded into memory. By double clicking or entering the name of the executable file on the command line( as in prog.exe, or a.out)

11 Diagram of Process State
terminated running ready new admitted waiting interrupt scheduler dispatch I/O or event wait I/O or event completion exit

12 Process Control Block (PCB)
Information associated with each process Process state Program counter CPU registers CPU scheduling information Memory-management information Accounting information I/O status information Each process is represented in the OS by a PCB. PCB is also called a task control block. CPU scheduling information: priority

13 Process Control Block(PCB)
Process management Registers Program counter Program status word Stack pointer Process state Time when process started CPU time used Children’s CPU time Time of next alarm Message queue pointers Pending signal bits Process id Various flag bits Memory management Pointer to text segment Pointer to data segment Pointer to bss segment Exit status Signal status Parent process Process group Real uid Effective Real gid Effective gid Bit maps for signals Files management UMASK mask Root directory Working directory File descriptors Effective uid System call parameters Some of the fields of the MINIX process table PCB is given one entry per process. PCB is all and every information that must be saved when the process is switched from running to ready state so that it can be restarted later as if it had never stopped before.

14 Process Descriptor Process Descriptor Process Switching Creating Processes Destroying Processes Overview of the Linux Process Descriptor ( struct task_struct )

15 Task List Representation of a process: A process descriptor of the type struct task_struct //<linux/sched.h> 1.7KBytes on a 32-bit machine Task list: A circular doubly linked list of task_struct

16 CPU Switch From Process to Process
Save state into PCB0 reload from PCB1 Save to PCB1 Reload from PCB0 OS P 1 idle Make a process run means that the state of PCB is changed to ‘running’ from ‘ready’ and the PC value of the PCB is loaded to the PC of CPU. User mode/ Kernel Mode

17 Operations on Processes: Process Creation
Parent process create children processes, which, in turn create other processes, forming a tree of processes Possibilities of Resource sharing Parent and children share all resources Children share subset of parent’s resources Parent and child share no resources Possibilities of Execution Parent and children execute concurrently Parent waits until children terminate

18 Process Creation (Cont.)
Possibilities of Address space Child is a duplicate of the parent Child has a program loaded into it UNIX examples fork system call creates a new process exec system call used after a fork to replace the process’ memory space with a new program

19 fork() Initial Process fork() Returns a new pid(child process) Returns
zero Original Process Continues New Process:Child

20 fork() Child Parent PC PC PC Registers SP PC Stack Resources
Heap BSS Data Text . fork( ) SP PC open files Registers Resources pid=1000 ID PC Stack Heap BSS Data Text . fork( ) SP PC open files Registers Resources pid=1001 ID Stack Heap BSS Data Text . fork( ) SP PC open files Registers Resources pid=1000 ID Child Parent PC PC

21 fork()

22 forkOut

23 fork() pid=999; fork() pid=1000; running parent pid=1234; pid=1345;
child pid=1234; pid=1345; pid=1452; ready

24 fork() int main(){ int i; for(i=0; i<10; i++){ printf(“Process_id=%d, i=%d\n”, getpid(), i); if(i==5){ printf(“Process_id=%d: fork() to start\n”,getpid()); int forkValue=fork(); printf(“forkValue=%d\n”, forkValue); }

25 fork( ) output

26 Creation of a process fork() system call : It creates a new process by duplicating an existing one. The process that calls fork() is the parent, and the new process is the child. pid = fork(); in the parent process, pid is the child process ID and in the child process, pid=0; execve() system call : It creates a new address space and load a new program into it. int execve(const char *filename, char *const argv[], char *const envp[]); argv: command line argument; envp: path name, etc;

27 fork() - exec()-wait()
exit() exec() fork() parent resumes child

28 forkWait

29 fork()-wait() output

30 forkWaitExeclp

31 output

32 Process Termination Process executes last statement and asks the operating system to delete it (exit) Output data from child to parent (via wait) Process’ resources are deallocated by operating system Parent may terminate execution of children processes (abort) Child has exceeded allocated resources Task assigned to child is no longer required If parent is exiting Some operating system do not allow child to continue if its parent terminates All children terminated - cascading termination

33 forkWait.c

34 Duplicating a process image
#include <sys/types.h> #include <unistd.h> pid_t fork(void); -return vaule of fork() : pid of the child if successful to the parent, 0 to the child. If failed, -1 to the parent. unistd.h : fork() prototype is defined. types.h : pid_t is defined.

35 fork() Original process PC pid ==0 pid > 0 Parent process
#include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> main() { pid_t pid; printf("Start!\n"); pid = fork(); if( pid == 0) printf("I am the Child !\n"); else if (pid > 0) printf("Parent pid=%d, Child pid=%d\n", (int)getpid(),pid); else printf("fork() failed!\n");} PC pid ==0 pid > 0 Parent process Child process #include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> main() { pid_t pid; printf("Start!\n"); pid = fork(); if( pid == 0) printf("I am the Child !\n"); else if (pid > 0) printf("Parent pid=%d, Child pid=%d\n", (int)getpid(),pid); else printf("fork() failed!\n");} #include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> main() { pid_t pid; printf("Start!\n"); pid = fork(); if( pid == 0) printf("I am the Child !\n"); else if (pid > 0) printf("Parent pid=%d, Child pid=%d\n", (int)getpid(),pid); else printf("fork() failed!\n");} PC+1 PC+1

36 Replacing a process image
#include <unistd.h> char **environ; int execl(const char *path, const char *arg0, …,(char *)0); int execlp(const char *file, const char *arg0,…,(char *)0); int execle(const char *path, const char *arg0,…,(char *)0,char *const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execve(const char *path, char *const argv[],char *const envp[]);

37 Examples of exe*() #include <unistd.h> char *const ls_argv[]={“ls”,”-l”,0}; char *const ls_envp[]={“PATH=bin:/usr/bin”,”TERM=console”,0}; execl(“/bin/ls”,”ls”,”-l”,0); execlp(“ls”,”ls”,”-l”,0); execle(“/bin/ls”,”ls”,”-l”,0,ls_envp); execv(“/bin/ps”,ls_argv); execvp(“ls”,ls_argv); execve(“/bin/ls”, ls_argv, ls_envp);

38 Waiting for a process #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); The parent process executing wait(), pauses until its child process stops. The call returns the pid of the child process

39 status status: it is the value transferred to the parent by exit(int status). Parent process: wait(&status) 0x00 0x64 Child process: exit(1); 0x00 0x64 exit(1) ./forkwait Start! Parent pid=25820, Child pid=25821 I am the Child ! status=256

40 If(pid !=0){ int stat; pid_t pid_child; pid_child = wait(&status); printf(“Child has finished,pid_child=%d\n”,pid_child); if(status !=0) printf(“Child finished normally\n”); else printf(“Child finished abnormally\n”); }

41 wait(&status) forkwait.c ./forkwait #include <unistd.h>
#include <sys/types.h> #include <stdio.h> #include <stdlib.h> main() { pid_t pid; int status; printf("Start!\n"); pid = fork(); if( pid == 0) { printf("I am the Child !\n"); exit(100); } else if (pid > 0){ printf("Parent pid=%d, Child pid=%d\n", (int)getpid(),pid); wait(&status); printf("status=%d\n", status); else printf("fork() failed!\n"); ./forkwait ./forkwait Start! Parent pid=25789, Child pid=25790 I am the Child ! status=25600 vi forkwait.c

42 exit() #include <stdlib.h> void exit(int status); /* Terminating current process and transfer the status to the parent. The value of status ranges from 0 to 255 integer value. */

43 waitpid( ) #include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options); pid : pid of the child, status : transferred from the child executing exit(status), options 0 : usual wait state, that is , the parent waits until the child process finishes, WNOHANG :the parent process does not stay at ‘wait’ state.

44 Zombie Processes Terminated running admitted interrupt
ready new admitted waiting interrupt scheduler dispatch I/O or event wait I/O or event completion exit Exit_Zombie Wait( ) TTerminated

45 forkZombie.c

46 forkZombie.c

47 Threads So far a process is a single thread of execution.
The single thread of control allows the process to perform only one task . The user cannot simultaneously type in characters and run the spell checker with the same process. Therefore modern OSs have extended the process concept to allow a process to have multiple threads of execution. In a traditional process, there is a single thread of control and a single PC in each process. However in modern OSs, support is provided for multiple threads of control. The thread will be discussed in Lecture 3. 47

48 Process and Threads Computer Program Thread Process counter
(b) Three processes each with one thread. One process with three threads.

49 Thread Usage[Tanenbaum]
A word processor with three threads

50 Linux Implementation of Threads
In the Linux, each thread has a unique task_struct . Linux implements all threads as standard processes. A thread in Linux is just a process that shares certain resources( such as an address space).

51 A Thread Stack Heap BSS Data Text SP PC open files Registers Resources
. open files Registers Resources

52 Sharing of threads Registers Thread1 Stack1 SP PC Stack2 Thread2 Heap
open files . SP PC Registers Resources Stack1 Heap BSS Data Stack2 Text Thread1 Thread2

53 Creating Threads: clone( )
#include <sched.h> int clone( int (*func)(void *), void *child_stack, int flags, void *func_arg,…); /* The caller must allocate a suitably sized block in the argument child_stack. The stack grows downward, so the child_stack argument should point to the high end of the allocated block. */ int main() { int child_stack[4096]; …. clone(thread_func, (void *)(child_stack+4095), CLONE_THREAD, NULL); ….. } int thread_func(void *arg) { If the flag is set to CLONE_CHILD_CLEARID|CLONE_CHILD_SETTID, the created one is a process.

54 clone() example #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <linux/unistd.h> #include <sched.h> int thread_func(void *arg) { printf("Child :TGID(%d), PID(%d)\n",(int) getpid(),(int) syscall(__NR_gettid)); sleep(1); return 0; } int main(void) int pid; int child_stack[4096]; printf("Start!\n"); printf("Parent:TGID(%d), PID(%d)\n",(int)getpid(),(int) syscall(__NR_gettid)); clone (thread_func, (void *)(child_stack+4095), CLONE_VM | CLONE_THREAD | CLONE_SIGHAND, NULL); printf("End!\n");

55 pthread example if((pid = pthread_create(&p_thread[0], NULL, pthread_func, (void*)&a)) < 0){ perror("Creation0 failed! "); exit(1); } if((pid = pthread_create(&p_thread[1], NULL, pthread_func, (void*)&b)) < 0){ perror("Creation1 failed"); exit(2); pthread_join(p_thread[0], (void **)&status); printf("pthread_join0\n"); pthread_join(p_thread[1], (void **)&status); printf("pthread_join1\n"); printf(“The Parent.\n”); printf("End!\n"); return 0; #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <linux/unistd.h> #include <pthread.h> void *pthread_func(void *data) { int id; int i=0; pthread_t t_id; id = *((int *)data); printf(“I am the created pthread.\n”); sleep(2); } int main(void) int pid, status; int a = 1; int b = 2; pthread_t p_thread[2]; printf("Start!\n");

56 POSIX Threads (pthread)
Embedded Software Kyu Ho Park POSIX Threads (pthread)

57 Pthread and LinuxThread
Thread got attention with the advent of the POSIX 1003.c specification. But not so popular. LinuxThreads which was very close to the POSIX standard: POSIX Thread: NPTL(Native POSIX Thread Library) NGPT(New Generation POSIX Threads) NPTL POSIX(Portable OS Interface) UNIX

58 Drawbacks of thread program
Difficult to write multi-threaded programs. Difficult to debug multi-threaded programs.

59 pthread functions #include <pthread.h> int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); void pthread_exit(void *retval); Int pthread_join(pthread_t th, void **thread_return); //equivalent to wait( ).

60 pthread_create, exit, and join
Master_thread pthread_create() pthread_join() created_ threads pthread_exit()

61 pthread

62 pthread_create

63 Task ? In Linux, Processes and threads are all represented by task_struct. Every task has its own unique id and it is represented at pid field of <task_struct>. But, according to the POSIX standard, all threads of a process shoud have the same pid. Linux adopts tgid(thread group id) to satisfy the POSIX standard. Therefore,a task if it is a process : pid == tgid, if it is a thread : pid != tgid and the child’s tgid has the same tgid of the parent.


Download ppt "Lecture 4 Process, Thread and Task"

Similar presentations


Ads by Google