티스토리 뷰

반응형

지난 OS 수업에서 Process syncronization을 설명하다가 교수님이 다음날 12시까지가 기한인 깜짝 과제를 내주셨다.

바로 fork() 함수를 사용하여 부모 프로세스에서 자식 프로세스를 생성해 보는 것.

한번도 사용해 본적 없는 함수였는데 이번 기회에 공부 할 수 있어서 나름 괜찮았고 term 프로젝트 진행 할때 도움이 될거 같아서 공부 했던 내용을 남기 고자 한다.

또한, fork() 함수를 사용 하면서 이와 유사한 vfork() 함수도 같이 알게 되었는데 둘에 대해서 알아 보도록 하자.

 

 

 

-fork()

리눅스 환경에서 제공되는 C언어 함수.

fork() 를 실행하면 부모와 동일한 동작을 하는 자식 프로세스가 생성된다.

fork 함수 호출 이후 코드부터 각자의 메모리를 사용해 실행됨.

 

#include<unistd.h>

pid_t fork();

 

성공시 부모프로세스에서는 자식 프로세스의 PID 값을 반환.

자식에서는 0 값 반환

실패시 음수값(-1) 반환

 

=단점

오버헤드 시간이 길어질 수 있다.

 

-vfork()

fork 와 마찬가지로 새로운 프로세스를 생성하는 함수.

vfork는 부모프로세스와 자원을 공유함.

fork()의 단점인 프로세스구조체를 할당받는 시간과 메모리(오버헤드)를 낮춤으로써 고안됨. 

자원복사가 이루어지지 않기 때문에 기존 fork 보다 빠르게 프로세스를 생성하고,

자원에 대한 race condition이 발생하지 않도록 부모프로세스는 자식프로세스가 종료되거나 execve 호출전까지 block됨.

 

#include<unistd.h>

int vfork();

 

데드록(deadlock)을 피하기위해 , vfork() 의 도중에 child가 되는 프로세스에는, SIGTTOU 시그널이나SIGTTIN 시그널이 송신되지 않음. 그 대신에 출력, 또는, ioctl(2) 호출이 허가되어 입력하려고 하면 EOF 가 됨.

 

+)vfork(2) 문제점

1. 프로세스가 그 부모를 간섭하지 않는 것이 고수준 언어에서는 실제로 매우 어려움.

2. 리눅스 2.2 버전들은 vfork() 구현에 있어 경쟁상태에 취약하여 서비스 부인공격을 초래가능. 

 

권한을 갖는 프로세스가 사용자 명령들을 실행시키기 위해 리눅스에서 vfork(2), execve(2) 쌍을 사용한다면,

자식 프로세스가 사용자의 UID로 이미 동작하고 있지만 아직 execve로 들어가지 않는 동안 경쟁상태가 존재.

사용자는 SIGSTOP과 같은 시그널을 보낼수 있게 되고 권한이 없는 프로세스가 권한을 갖는 프로세스에게 정지하도록 시킬수 있으며 권한을 갖는 프로세스에 서비스 부인 공격을 초래할 수 있다.

 

 

+)deadlock

교착상태. 두개 이상의 프로세스가 서로 상대방의 작업이 끝나기 만을 기다리기 때문에 결국 아무것도 못하는 상태. 

 

 

 

References

https://wiki.kldp.org/HOWTO/html/Secure-Programs-HOWTO/avoid-vfork.html

반응형
Comments
댓글쓰기 폼