[운영체제] fork() 시스템 호출, exec() 시스템 호출

2024. 12. 12. 20:31STUDY/운영체제

728x90
반응형

이 글은 '쉽게 배우는 운영체제' 서적을 기반하여 작성되었습니다.

 

프로세스는 프로그램을 실행할 때 새로 생성된다. 프로세스는 새로 생성하는 방법뿐만 아니라 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 방법도 있다. 

 

fork() 시스템 호출의 개념

 

fork() 시스템 호출은 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. 커널에서 제공하는 이 프로세스는 복사하는 일종의 시스템 호출이다. fork() 시스템 호출을 사용하면 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어 진다. 이를 통해 처음 프로세스를 실행하는 속도보다 빠르게 실행할 수 있다.

예를 들어 구글의 웹 브라우저인 크롬에서 어떤 페이지를 보다가 ctrl + n 키를 누르면 크롬이 하나더 실행된다. 이는 새로운 크롬을 실행하는 것이 아니라 현재의 크롬 프로세스를 복사한 것이다.

이렇게 프로세스가 복사될 때 기존의 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 되며, 두 프로세스는 부모-자식 관계로 연결된다.

위 이미지를 보듯 fork() 시스템 호출을 하면 PCB를 포함한 부모 프로세스의 영역의 대부분을 자식 프로세스가 복사된다. 단, PCB의 일부 내용은 변경된다.

  • PID가 변경된다. 그림에서 부모 프로세스의 PID는 326이고 자식 프로세스의 PID는 368이다.
  • 메모리 위치가 다르므로 메모리 관련 정보가 바뀐다.
  • PPID와 CPID가 바뀐다. 위 그림처럼 부모 프로세스에는 CPID에 자식 프로세스의 PID인 368이 들어간 것을 볼 수있다.

 

exec() 시스템 호출의 개념

exec() 시스템 호출은 기존의 프로세스를 새로운 프로세스로 전환하는 함수다.

exec() 시스템 호출을 사용하는 목적은 프로세스의 구조체를 재활용하기 위함이다. 새로운 프로세스를 만들려면 PCB를 만들고 메모리 자리를 확보하는 과정이 필요하다. 이때 exec() 시스템 호출을 사용하면 이미 만들어진 PCB, 메모리 영역, 부모 - 자식 관계를 그대로 사용할 수 있어 편리하다.

exec() 시스템 호출의 동작 과정은 간단하다. exec()시스템을 호출을 하면 코드 영역에 있는 기존 내용을 지우고 새로운 코드로 바꿔버린다. 또한 데이터 영역이 새로운 변수로 채워지고 동적 할당 영역은 리셋된다. PCB 내용중 PID 과 PPID, CPID, 메모리 관련 사항은 변하지 않지만 PC값을 비롯한 각종 레지스터와 사용한 파일 정보가 모두 리셋된다.

 

 

 

TODO : 프로세스간 계층 구조

 

https://kylo8.tistory.com/entry/OS-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98-%EC%83%9D%EC%84%B1%EA%B3%BC-%EB%B3%B5%EC%82%AC-fork-exec-%EC%8B%9C%EC%8A%A4%ED%85%9C%ED%98%B8%EC%B6%9C

728x90
반응형