운영체제는 사용자가 컴퓨터를 효과적으로 사용하도록 컴퓨팅 자원을 직접적으로 관리한다. 따라서 응용 프로그램은 운영체제가 제공하는 인터페이스를 통해서 컴퓨팅 자원을 이용하는데, 이러한 인터페이스를 시스템 콜이라고 부른다.
커널 모드 vs 사용자 모드
운영체제는 커널 모드(Kernel Mode)와 사용자 모드(User Mode)로 나뉘어 구동된다.
- Kernel Mode
- 운영체제가 CPU를 사용하는 모드, 하드웨어를 제어하는 명령어 (Privileged Instructions)를 실행
PC 레지스터가 운영체제가 존재하는 부분을 가리킴- 시스템 콜을 통해 커널 모드로 전환된다.
- User Mode
- 사용자 애플리케이션 코드가 실행되는 모드
PC 레지스터가 사용자 프로그램이 올라가 있는 메모리 위치를 가리킴- 해당 모드에서는 하드웨어 (디스크, I/O 등)에 접근할 수 없다.
💡 시스템 콜이 필요한 이유?
응용 프로그램으로 대표되는 유저 프로세스는 유저 모드에서 실행되기 때문에 커널의 기능을 직접 사용할 수 없다. 커널 모드로 전환 후에 해당 작업을 수행할 수 있다. 만약 해커가 악의적으로 하드웨어를 조작하거나, 사용자가 실수로 하드웨어를 조작하는 경우 시스템 전체에 큰 장애가 발생할 수 있다. 이를 막기 위해 이러한 명령들은 커널 모드에서만 실행할 수 있도록 설계되었다.
System Call
시스템 콜은 이러한 커널 모드의 기능을 사용자 모드가 사용 가능 하게 해 준다.
즉, 응용 프로그램이 하드웨어에 접근해 필요한 기능을 사용할 수 있도록 해주는 인터페이스이다.
- 프로그래밍 언어는 시스템 콜을 편리하게 사용하기 위한 수단으로 API를 제공한다.
- 각 시스템 콜에는 번호가 할당되고, 시스템 콜 인터페이스는 시스템 콜 번호와 시스템 콜 핸들러 함수 주소로 구성되는 시스템 콜 테이블을 유지한다.
다양한 기능의 시스템 콜을 제공한다. 이중 프로세스 제어 시스템 콜 중 fork, exec, wait에 대해 정리했다.
- 프로세스 제어
- 파일 조작
- 장치 조작 (Device Manipulation)
- 정보 유지
- 통신
- 보호
프로세스 제어 시스템 콜
- fork(), exec() : 프로세스 생성과 관련 있는 명령
- wait() : 프로세스(parent)가 만든 다른 프로세스(child)가 끝날 때까지 기다리는 명령
fork()
- 새로운 프로세스를 생성
- fork가 실행되는 순간 프로세스가 하나 더 생긴다. 이때 생긴 child 프로세스는 fork를 만든 프로세스와 동일한 복사본을 가지게 된다.
- 이러면 OS는 똑같은 2 개의 프로그램이 동작한다고 생각하고 fork()가 return 될 차례라고 생각한다. 그 때문에 새로 생성된 Child 프로세스는 main에서 시작하지 않고 if 문부터 시작하게 된다.
- 스케쥴러가 어떤 프로세스를 먼저 수행할지는 확신할 수 없다. (보장하지 못함)
wait()
- Child 프로세스가 종료될 때까지 기다리는 작업
- wait을 통해서 Parent 프로세스를 Child 프로세스가 실행이 끝날 때까지 기다리게 할 수 있다.
- Parent가 먼저 실행되더라도 wait()는 Child가 끝나기 전에는 return 하지 않으므로 반드시 Child가 먼저 실행된다.
exec()
- 단순 fork()는 동일한 프로세스의 내용을 여러 번 반복 동작할 때 사용한다.
- 만약 Child 프로세스에서 Parent 프로세스와 다른 동작이 하고 싶을 때는 exec를 사용한다.
- exec가 실행되면, execvp(실행 파일, 전달 인자) 함수는 Code Segment(프로세스의 주소 공간 중)에 실행 파일의 코드를 읽어와서 덮어 씌운다.
- 이후 heap, stack, 다른 메모리 영역이 초기화되고 OS는 덮어 씌워진 메모리 영역을 그냥 실행한다. 즉, 새로운 프로세스를 생성하지 않고 현재 프로그램에 wc라는 파일을 실행한다. 그로 인해 execvp() 이후 부분은 실행되지 않는다.
'CS' 카테고리의 다른 글
[CS 스터디] 스택 오버플로우 (Stack Overflow), 힙 오버플로우 (Head Overflow) (0) | 2023.07.21 |
---|---|
[CS 스터디] PCB (Process Control Block) (0) | 2023.07.21 |
[Java] HashMap (0) | 2023.07.20 |
[알고리즘] 최대 공약수 구하기 - 유클리드 호제법 (0) | 2023.07.18 |
[CS 스터디] 프로세스 주소 공간 (0) | 2023.07.17 |