Unix Process Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1
유닉스기반다중서버구현방법 클라이언트들이동시에접속할수있는서버 서비스를동시에처리할수있는서버프로세스생성을통한멀티태스킹 (Multitasking) 서버의구현 select 함수에의한멀티플렉싱 (Multiplexing) 서버의구현쓰레드를기반으로하는멀티쓰레딩 (Multithreading) 서버의구현 2
Program 이란 Process 의정의 Process 란 C, C++, Java 와같은프로그램언어로작성된소스코드 Running program 생성된프로세스는운영체제의의해할당된고유한 ID를지닌다. (ps u) 하나의프로그램내에서여러개의프로세스가동시에실행될수있다. main memory hard disk Process 1 read Program 1 CPU Process 2 Process 3 read read Program 2 Program 3 Process 4 read Program 4 3
Process 의모드 Process는 User mode 또는 Kernel mode에서실행사용자모드 사용자의권한으로명령이실행커널모드 커널의권한으로실행 하드디스크를읽기위한 read() 함수 void main() { char buf[512]; int n = read(0, buf, 512}; n++; User mode 에서실행 Kernel mode 에서실행 User mode 에서실행 } exit(0); Kernel mode 에서실행 4
Process 의상태 Running state ( 실행상태 ) 프로세스가 CPU 서비스를받을수있는상태 Waiting state ( 블록상태 ) 입출력처리와같은어떤조건을기다리는상태 Stop state ( 중단상태 ) 특정시그널을커널로부터받아프로세스의동작이정지된상태 Zombie state ( 좀비상태 ) 프로세스의실행은끝났으나여전히메모리에존재하는상태 running state zombie state waiting state stop state 5
Process 의메모리배치 프로세스는일정한메모리를배정받아사용 ( 프로세스이미지 ) 프로그램실행에필요한어셈블러코드, 변수가저장 원칙적으로한프로세스는다른프로세스의메모리영역에접근불가 C 프로그램과이미지의내용 #include<stdio.h> #include<stdlib.h> 메모리영역 메모리내용및변수들 extern char **environ; int init_global_var = 3; int unint_global_var; int main(int argc, char **argv) { int auto_var; static int static_var; register int reg_var; char *auto_ptr; auto_ptr = malloc(10); return 0; } //extern 변수 // 초기화된 global 변수 // 초기화되지않은 global 변수 // 자동변수 //static 변수 //register 변수 // 자동변수 // 메모리 10byte 할당 환경변수와명령행인자영역 데이터영역 stack heap *environ 내용 argc, argv, auto_var, reg_var, auto_ptr malloc() 이할당한 10 byte 초기화안된영역 unint_global_var, static_var 초기화된영역 init_global_var = 3 코드영역 어셈블된프로그램코드 6
Stack and Heap Stack 현재호출되어실행중인함수의코드와환경정보를저장 main() 에서 printf() 를호출하였다면 main() 이차지하는영역위에 printf() 를처리하기위한메모리가할당되고 printf() 가수행 printf() 가리턴되면 printf() 와관련된영역은삭제되고프로세스의수행은 main() 으로돌아감함수내부에서임시로사용되는자동변수도스택영역에할당 Heap 스택은사용하던메모리가함수의종료와함께사라짐이문제를해결하기위해리턴되어도사라지지않도록한영역이힙 malloc() 함수를사용한영역은힙에저장 7
Stack func() 호출 process int main() { char *ptr; ptr = func(); } char *func() { char arr[10]; return arr; } 10 byte 배열할당 Address return Stack 영역 8
Heap func() 호출 process int main() { char *ptr; ptr = func(); free(ptr) } char *func() { char *arr; arr = malloc(10); return arr; } free(ptr) 호출 10 byte 배열할당 Address return heap 영역 9
메모리CPU Process 의생성과종료 프로세스 1 프로세스 2 프로세스 N 메모리 프로세스 1 의이미지 프로세스 2 의이미지 O/S 프로세스 3 의이미지.. 프로세스 N 의이미지 10
fork() 새로운프로세스를만들기위해주로사용 fork() 를호출한프로세스의이미지를복사하여새로운프로세스를생성원본프로세스의모든메모리공간 ( 데이터영역, heap, stack) 을그대로복사 부모 / 자식프로세스부모프로세스 : fork() 를호출한프로세스 fork() 의리턴값 : 자식프로세스의 PID 자식프로세스 : fork() 에의해새로생성된프로세스 fork() 의리턴값 : 0 프로세스의공유부모와자식프로세스는변수를서로공유하지않음개설한파일이나소켓은프로세스이미지외부에존재하므로공유 11
fork() 부모 / 자식프로세스의실행과리턴값 Parent process PID = 100 fork() * 자기자신을복제 * 메모리영역은독립 *PID 는다름 * 완전히복제된두개의 Process 가실행된다. Parent process PID = 100 return 값 = 101 Child process PID = 101 return 값 = 0 12
fork 함수호출을통한프로세스의생성 fork 함수호출을통한프로세스의생성은복사에의한생성이다. 원본프로세스 #include <sys/types.h> #include <unistd.h> pid_t fork(void); PID = fork(); if (PID == 0) child_work(); Fork 에의한복사 // child process 에서처리 1.. 2.. 3. pid=fork() 4. 5. 복사본프로세스 1.. 2.. 3. pid=fork() 4. 5. 리턴값은복사본프로세스 ID 리턴값은 0 else parent_work(); // parent process 에서처리 13
fork 함수호출을통한프로세스의생성 int a=10; a=10 Data 영역 int a=10; a=10 Data 영역 int main() { pid_t pid; int b=20; pid = fork();. } pid=1133 b=20 Stack 영역 int main() { pid_t pid; int b=20; pid = fork();. } pid=0 b=20 Stack 영역 원본프로세스 복사본프로세스 14
Process 의종료 종료조건 main() 함수에서 return 되는경우 exit() 함수를호출할경우프로세스종료 signal을받은경우 exit() 프로세스가자신을종료시키는데사용열려있던모든파일을닫기위해자동으로 close() 함수를호출 15
예제확인 #1 실행파일 fork.c 실행결과 16
예제확인 #2 실행파일 fork_test.c pid_t getpid(void) pid_t getppid(void) // 자신의 PID 를얻음 // 부모프로세스의 PID 를얻음 17
예제확인 #3 파일명 tcp_talkserv.c tcp_talkcli.c 프로그램설명토크서버에서는먼저 listen() 을호출하고 accept() 를호출하여클라이언트와연결하고연결이이루어지면 fork() 를호출부모프로세스는사용자의키보드입력을받아클라이언트에게전송자식프로세스는클라이언트가보내온메시지를화면에출력 strstr 문자열안에특정문자열이존재하는지여부를체크하는함수이다. char * strstr(const char * string, const char * strcharset); string에서 strcharset을검색해해당문자열위치를포인터로리턴한다. 18
예제확인 #3 19
실습과제 #4 새로운프로세스를생성하고이프로세스에서 10초간격으로현재의시간을클라이언트에게전송하는프로그램작성 TCP 이용 UDP 이용 20