-
[Unix] fork(), vfork(), Copy On Write, exec()ComputerScience/운영체제 2020. 6. 14. 18:26
유닉스에서 fork()와 exec()를 배웠다.
도대체 fork(), exec()는 무엇일까?
간단히 Process Control을 해준다고 보면 된다.
fork()
fork()는 현재 부모 프로세스를 메모리상에서 복사한 자식 프로세스를 만드는 과정.
이러한 과정에서 자식은 부모의 변수, 스택 ,힙의 내용을 복사하게 된다. 이 때, PCB또한 복사된다.
PCB는 프로세스를 지원하고 관리하기 위한 정보들이 담긴 데이터 구조체이다.
부모와 자식의 주소공간은 다르다.
부모 프로세스는 원래대로 실행되고, fork()를 이용해 생성된 프로세스도 다음 라인부터 실행된다.
fork()의 return값은 proceeid를 출력하게 되는데
fork()의 return 값이
0이면 자식 프로세스
0보다 크면 부모 프로세스
-1이면 fork()의 실패이다.
pit t pid; pid = fork(); //process id가 return된다. 똑같은 프로세스가 하나 더 생긴 것 if(pid==0) //자식 프로세스가 할 일 else if(pid >0) //부모 프로세스가 할 일 else //fork()의 실패
fork()가 성공하는 순간 똑같은 코드가 2번 수행된다고 보면 되는데
부모프로세스는 else if(pid>0) 아래의 코드를 수행하고
자식프로세스는 if(pid==0) 아래의 코드를 수행한다.
vfork()
child process를 생성하고 부모는 block시킨다. 즉, 자식에서 일이 다 수행되어야 한다. 메모리를 복사하지 않고 공유한다. vfork()는 자식과 부모가 같은 주소 공간을 가리키기 때문에 그래서 vfork()가 수행되어 자식에게서 변경된 값들은 부모 프로세스에서도 변경되어 나타난다. 작업을 끝나고 exit()나 _exit()를 해주어야 한다.
[exit()는 사용자 공간에서 지원되는 라이브러리 제거 함수, _exit()는 커널에서 지원하는 제거 함수. 대게 _exit()를 쓴다]
Copy On Wirte(COW) : write할 때 copy하라
그런데 요즘은 vfork()보다는 Copy On Write 기법을 사용한다. 간단하게 설명하면 프로세스 생성 시, 모든 자원을 복사하는 것이 아니고 변경사항이 생길 때에만 복사하도록 구현하고 있다. 그래서 vfork()보다는 COW를 지원하는 fork()를 많이 사용한다.
즉, 대게 공유 상황에서 참조만 하고 있는 상황이 많은데 변경이 이루어져야 하는 경우에 한해서 데이털르 복사하고, 복사 된 데이터에 국한적으로 변경이 발생하기 때문에 최대한 메모리를 절약할 수 있는 구현법
exec()
exec()함수는 현재 프로그램의 텍스트, 데이터, 스택 영역에 exec()함수의 인자로 전달된 프로그램의 텍스트, 데이터, 스택 영역을 덮어 씌우는 함수. 즉, exec계열의 함수를 사용하면 새오룬 프로세스를 현재 프로세스 위치에 덮어 쓰므로 현재 프로세스는 종료된다고 보면 된다.
그래서 현재 프로세스를 지우고 싶지 않다면 fork()후 , 자식 프로세스한테 exec()를 해주는 것이다.
'ComputerScience > 운영체제' 카테고리의 다른 글
[운영체제] Atomic연산, CAS(CompareAndSwap)에 대하여, ABA문제 (0) 2020.06.14 [운영체제] 스핀락(Spinlock)은 무엇인가? (0) 2020.06.14 [운영체제] 뮤텍스(Mutex), 세마포어(Semaphore) 그리고 모니터(Monitor) (0) 2020.06.14 [운영체제]데드락을 회피할 수 있는 자원할당 그래프, 은행원 알고리즘 (0) 2020.06.13 [운영체제] 데드락(Dead lock), 교착상태가 뭐지? + 해결방법 (0) 2020.06.13