Process Abstraction Processi Pi Executable Memory CPU ALU
Process Abstraction Processi Pi Executable Memory CPU ALU Register OS Address Space Processa Pi Address Space Pa Address Space … Pa Executable Memory … Pk Address Space Machine Executable Memory (Physical) Processk ※ Open File만 공통으로 참조 함 OS interface Pk Executable Memory
Address Space Pi Address Space Address Binding Pi Executable Memory (Physical) Data Code Process i Files (Memory Mapped) Other Resources (Memory Mapped)
Process Descriptor 운영체제가 프로세스를 관리하기 위해 필요한 모든 정보들을 보관 할당된 자원(file, memory…), 수행상태(run, ready…), 레지스터 상태 프로세스마다 하나씩 생성 ‘PCB (Process Control Block)’ 이라고도 함 운영체제는 Process Descriptor를 Process Table에 저장하고 Process id 를 통해 관리함 Process Control Block Process State Process Name Process Table PID PCB 위치 1 * 2 * n * . . Information handled by OS Process. Thread State List Program Process Name. Counter Process State Program Counter Process Name Registers Program Counter Registers Memory Limits Registers List Limits of open files Memory List of open files Memory Limits. List of open files. . . . CPU related information Resource related information
Process 생성/소멸 - 5 Process 구조 void main() {. . . Command void main() { 명령 입력 User . . . Process Create? Create Process Wait for Child return; Thread Create? Create Thread void Thread_functions() { Wait for Thread . . . Calculation Other? . . . return; exit(0); Save (as) void utility_functions() { Print . . . return;
Windows Process 생성/소멸 - 3 예> Win. Exec를 이용한 프로세스 생성 단순히 프로그램을 수행하고 각각 종료됨 // PROG_A. CPP #include <iostream. h> #include <windows. h> void main( void ) { cout << "Starting Prog_a. exe" << endl; i = Win. Exec("prog_b. exe", SW_SHOW); } Process Creation Code // PROG_B. CPP #include <iostream. h> void main() { cout << "Greetings from Prog_b. " << endl; Exit. Process(0); } Child Process Terminating Code Child Process Code
Windows Process 생성/소멸 - 4 예> Create. Process를 이용한 프로세스 생성 자식 프로세스가 종료되면 다른 작업 수행 void main(void) { char cmd. Str[100] : STARTUPINFO start. Up. Info; PROCESS_INFOMATTON proc. Info; BOOL success; strcpy(cmd. Str, “prog_b. exe”); 자식 프로세스의 핸들을 포함하고 있는 구조체 Get. Startup. Info (&start. Up. Info); // Create the child process Success = Create. Process ( 0, cmd. Str, 0, 0, false, CREATE_NEW_CONSOLE, 0, 0, &start. Up. Info, &proc. Info); Process Creation Code if (!success) cout << “Error creating process: “ << Get. Last. Error() << endl; //wait for the child process to complete Wait. For. Single. Object (proc. Info. h. Process, INFINITE); //. . Close. Handle(proc. Info); } 자식 프로세스의 핸들 정보 Wait for Child Process Finishing Close Child Process Handle
Windows Process 생성/소멸 - 4 예> Create. Process를 이용한 프로세스 생성 자식 프로세스가 종료되면 다른 작업 수행 void main(void) { char cmd. Str[100] : STARTUPINFO start. Up. Info; PROCESS_INFOMATTON proc. Info; BOOL success; strcpy(cmd. Str, “prog_b. exe”); 자식 프로세스의 핸들을 포함하고 있는 구조체 Get. Startup. Info (&start. Up. Info); // Create the child process Success = Create. Process ( 0, cmd. Str, 0, 0, false, CREATE_NEW_CONSOLE, 0, 0, &start. Up. Info, &proc. Info); Process Creation Code if (!success) cout << “Error creating process: “ << Get. Last. Error() << endl; //wait for the child process to complete Wait. For. Single. Object (proc. Info. h. Process, INFINITE); } //. . Close. Handle(proc. Info); 자식 프로세스의 핸들 정보 Wait for Child Process Finishing Close Child Process Handle
Linux Process 생성/소멸 - 4 Linux Process 생성 프로그램 구조 Ex. 동일한 프로그램 코드를 갖는 경우 Parent Process Child Process 4000 void main() { 4100 4200 . . . 4202 4300 5000 5500 자신을 복사 PC 위치: 4201 Child? Child Code Parent Code Wait for Child. . . 6000 4100 4200 Process Create 4201 No void main() {. . . Process Create 4201 Yes 4202 4300 5000 5500 Child? Child Code Parent Code Wait for Child. . . 6000 return;
Linux Process 생성/소멸 - 5 fork를 이용한 프로세스 생성 부모 프로세스와 동일한 코드를 갖는 프로세스 생성 Process Creation Code Child Process Terminating Code Wait for Child Process Finishing
Linux Process 생성/소멸 - 6 exec와 system을 이용한 프로세스 생성 부모 프로세스와 다른 코드를 갖는 프로세스 생성 Process Creation Code Process Code Replacement Child Process Terminating Code Wait for Child Process Finishing - Programmer가 프로세스를 생성하는 예 (system) // PROG_A. CPP #include <process. h> void main( void ) { system( “new_program. out" ); } Process Creation Code
Linux Process 생성/소멸 - 8 kill을 이용한 자식 프로세스 소멸 #include <string. h> <stdio. h> <sys/types. h> <signal. h> int main() { int pid, status; pid = fork(); if (pid == 0) { // 자식 프로세스 printf("I’m child(pid: %d)n", getpid()); getchar(); } else if(pid > 0) { // 부모 프로세스 printf("Im parent(pid: %d)n", getpid()); status = kill(pid, SIGKILL); if( status == 0) printf(“succeed to kill child(%d). n”, pid); else printf(“fail to kill child(%d). n”, pia); } else { perror("fork error : "); } } return 0; Send Kill signal to the child process
Context Switching ALU Right Operand 1 Left Operand Status Registers Process 1 Descriptor R 1 R 2. . . Functional Unit Rn Process 2 Descriptor Result 2 PC Control Unit IR
Context Switching Process 1 Process 2 Idle Context Switching Execution Context Switching Idle Schedule Execution Hardware process progress Process Manager Idle
Thread ? Definition(1) 프로세스 내부에서 코드를 공유하면서도 자신만의 독립적인 흐름을 가지는 실행 루틴 Thread Share Process Code Data Thread Status Thread Share Thread Status Process Status Share Thread Status
Thread ? Definition(2) Thread (Execution Engine) Status Stack Files Data Status Stack Binary Program Status Stack Other Resources
Thread Descriptor - 2 예> Thread Descriptor Process Descriptor List … Process State Process Name Thread List Program Counter Thread Descriptor Thread ID Registers Memory Limits List of open files. . . Thread State Parent Process Info Thread Descriptor Thread Specific open files Thread ID . . . Thread State Parent Process Info Thread Specific open files . . . Thread Descriptor Thread ID Thread State Parent Process Info Thread Specific open files . . .
Thread 생성/소멸 - 2 Thread 생성 프로그램 구조 Windows/Linux 동일 void main() void Thread_functions(). . . exit(0); void Thread_functions() Thread 생성 . . . exit(0); void Thread_functions() . . . exit(0); Thread 종료 대기. . . return;
Thread 생성/소멸 - 5 Create. Thread를 이용한 Thread 생성/소멸 int main(int argv, char *argv[]) { int t. Id; //Thread Identifier HANDLE h. Child. Thread; //thread handle variable /* 새로운 쓰레드를 만든다. */ h. Child. Thread = Create. Thread(NULL, 0, child. Thread. Func, NULL, 0, &t. Id); Thread Creation Code. /*자식이 종료되길 기다림*/ Wait. For. Single. Object(h. Child. Thread, …); Waiting for Thread Terminating. /*자식 쓰레드가 끝난 후 수행할 작업*/ printf(“Thread(%d) is terminated. n”, t. Id); return 0; } DWORD WINAPI child. Thread. Func(LPVOID me){ /* 특정 작업을 수행하는 부분 */. . . return 0; } Thread Function Code
Thread 생성/소멸 - 7 pthread를 이용한 Thread 생성/소멸 void *thread_function (void *arg); char message[ ] = “Hello World”; int main ( ) { } int res; pthead_t a_thread; // 구조체 pthread_t 형은 pthread. h에 정의 되어 있음 void *thread_result; res = pthread_create (&a_thread, NULL, thread_function, (void *)message); Thread Creation Code if ( res != 0) { perror (“thread creation failed”); exit ( EXIT_FAILURE); } pthread_join(a_thread, thread_result); Waiting for Thread Terminating printf(“Thread joined, it returned %sn”, (char *)thread_result); printf(“Message is now %sn”, message); exit ( EXIT_SECCESS); void *thread_function(void *arg) { Thread Function Code printf(“thread_function is running. Argument was %sn”, (char *) arg); sleep( 3); strcpy(message, “Bye!”); pthread_exit (“Thank you for the CPU time”); Thread Termination Code }
다-대-일 모델 (User Level Thread) 여러 User Thread를 하나의 Kernel Thread와 연결 스레드 관리는 User Space에서 이루어짐 Ex> Solaris Green Thread Library
일-대-일 모델 (Kernel Level Thread) 하나의 User Thread와 하나의 Kernel Thread를 연결 Ex> Windows NT, OS/2
Process Manager 특징 Process/thread 생성 및 제거 Process/thread 동기화 Resource Management Process Resource 할당/해제 Abstract Computing Environment Process Manager Synchronization Scheduler CPU Process Description Resource Manager Other H/W
Resources Resource: 프로세스가 요청하여 사용할 수 있는 것 재사용 가능한 리소스 CPU, primary memory, disk space, … 재사용 불가능한 리소스 a message, input data, … 리소스의 이용이 바로 가능하지 않으면 프로세스는 Block됨 Resource Type & Units Type memory disk cpu message speaker display network
Resource Manager Resource Type마다 다른 리소스 Manager를 가짐 Ex) Speaker Resource manager, memory resource manager, …. Resource Manager는 Policy를 필요로 함 Resource의 요청에 대하여 어떻게 리소스를 할당할 것인지 결정 Ex) 오디오 스피커의 경우 공유 불가 Manager는 Scheduler와 연동하여 동작 리소스 요구는 프로세스의 상태와 관련되므로 리소스가 사용 중 일 경우 block, 사용 가능할 경우 할당되어 실행 Resource Manager Policy Request Process Blocked Processes request() Process release() Response Resource Pool
Simple State Diagram Running 프로세스/쓰레드가 스케줄을 받아 CPU에 의해 사용중인 상태 Ready CPU를 사용하기 위해 스케줄을 기다리는 상태 Blocked 리소스를 바로 사용할 수 없어 기다리는 상태, 리소스의 할당으 로 다시 Ready 상태로 전이 Resource. Request -> allocate Done Running Schedule Resource Request -> refuse Blocked Resource Allocate Ready Process/thread Start
Complex State Diagram (parent-child) ready. Active 프로세스를 활성화하기로 결정한 상태 ready. Suspended Running 프로세스의 자식 프로세스를 중지 하기로 결정한 상태 Execution blocked. Active 사용 불가능한 자원을 요청한 상태 request blocked. Suspended 프로세스가 자원을 기다리기 위해 중단된 상태에서 제어하고 있는 프 로세스가 이 프로세스를 중지하기 로 결정한 상태 yield Request suspend schedule Start suspend ready. Active activate Allocate ready. Suspended Allocate suspend activate blocked. Active blocked. Suspended
UNIX State Transition Diagram Running CPU에서 실행중 Runnable CPU의 사용을 위해 대기 Uninterruptible sleep 작업의 완료 전까지 인터럽트 되지 않아야 함 ex) 장치의 조사 Sleeping Request Wait by parent Running zombie 시그널이나 인터럽트에 의해서 다시깨어남 Traced/stopped SIGSTOP과 같은 시그널을 보내거나, 디버거의 시스템콜에 의해 Stop Zombie (Defunct) 부모가 wait()계열의 시스템 콜로 자식의 죽음을 보고 받지 못할 경우 자식은 zombie가 됨 Done Schedule Request stop I/O Request Start Sleeping Allocate Runnable I/O Complete Uninterruptible Sleep Resume Traced or Stopped
Windows NT Thread States Initialized 생성된 쓰레드들의 스케줄을 받기 전에 대기 Ready CPU에 의해 실행될 쓰레드들을 스케줄링 Standby 곧 CPU에 의해서 사용될 쓰레드 Running CPU에서 실행되고 있는 쓰레드 Waiting Create. Thread Terminated Transition Reinitialize 코드의 Paging Initialized Activate Dispatch Terminated Exit 쓰레드의 종료 Wait Ready Waiting Wait Complete Running Select Wait Complete Transition Dispatch Standby Preempt 동기화, I/O등의 수행의 완료를 기다림
- Slides: 53