시스템 콜 (System Call)
시스템 콜 : 운영체제 커널의 기능을 사용하기 위해 사용자 프로그램이나 응용 프로그램이 호출하는 인터페이스
시스템 콜은 프로세스가 운영체제의 커널 모드로 전환되어 특정 기능을 수행하고, 이후 다시 사용자 모드로 돌아가 프로그램이 실행되는 원리로 동작한다.
시스템 콜 사용
- 운영체제가 제공하는 다양한 서비스와 리소스에 접근하기 위해 사용
ex) 파일 시스템 접근, 네트워크 통신, 메모리 관리, 프로세스 관리 등 - 시스템 콜은 운영체제의 기능을 사용하기 위해 특정 함수를 호출하는 형태로 제공된다.
시스템 콜 호출 방식
- 프로그래밍 언어의 라이브러리 함수나 시스템 인터페이스를 통해 간접적으로 호출
시스템 콜의 종류
1. 파일 관련 시스템 콜
- open() : 파일을 열고 사용하기 위한 시스템 콜
- read() : 파일에서 데이터를 읽어오는 시스템 콜
- write() : 데이터를 파일에 쓰는 시스템 콜
- close() : 파일을 닫는 시스템 콜
2. 프로세스 관련 시스템 콜
- fork() : 현재 프로세스를 복제하여 새로운 프로세스를 생성하는 시스템 콜
- PCB를 포함한 부모 프로세스의 code, data, heap, stack 부분이 대부분 그대로 상속된다.
- 부모 프로세스와 자식 프로세스는 독립적으로 실행되며 각자의 고유한 PID를 갖는다.
- 자식 프로세스가 또 fork()를 사용하여 손자 프로세스까지 만들 수 있다.
- 부모 프로세스에서 wait(NULL) 함수가 호출되면 자식 프로세스가 끝날 때 까지 기다린 후에 진행한다.
- 장점
- 프로세스의 생성 속도가 빠름 : 기존 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠르다.
- 프로세스 병렬 처리 : fork() 시스템 콜을 사용하여 프로세스를 복제하면 부모 프로세스와 자식 프로세스가 독립적으로 실행될 수 있다. 이를 통해 여러 개의 프로세스가 병렬로 작업을 처리할 수 있으며, 시스템 자원을 효율적으로 활용할 수 있다. 이때, 자식 프로세스는 부모 프로세스와 동일한 코드와 데이터를 상속받기 때문에 별도의 초기화 과정이 필요 없다.
- 자원 공유 : 부모 프로세스와 자식 프로세스는 동일한 파일 디스크립터, 네트워크 연결 등의 자원을 공유한다. 이를 통해 자식 프로세스는 별도의 초기화 과정 없이 부모 프로세스가 이미 열어둔 파일이나 네트워크 연결을 곧바로 사용할 수 있다. 이는 자원의 중복 생성을 방지하여 시스템 자원을 효율적으로 활용하는 데 도움을 준다.
- 실패 시 롤백 기능 : fork() 시스템 콜은 새로운 프로세스를 생성하는 과정에서 실패할 경우 복구 기능을 제공한다. 실패 시에는 새로운 프로세스가 생성되지 않고 이전 상태를 유지하게 된다. 이는 안정성과 신뢰성을 보장하는 데 도움을 준다.
- 프로세스의 생성 속도가 빠름 : 기존 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠르다.
- exec() : 현재 프로세스의 메모리 공간에 새로운 프로그램을 로드하여 실행하는 시스템 콜
- exec() 시스템 콜을 통해 운영체제는 기존 프로세스를 종료하지 않고 다른 프로그램을 실행할 수 있다.
- exec()를 사용하는 목적 : 프로세스의 구조체를 재활용하기 위해서
- exec() 시스템 콜을 사용하지 않았을 때 : PCB를 생성하고, 메모리에서 충분한 공간을 확보하는 과정이 필요하다. 또한, 프로세스가 종료된 후에는 사용한 메모리를 정리하기 위해 상위 프로세스와 부모-자식 관계를 설정해야 한다.
- exec() 시스템 콜을 사용했을 때 : 이미 생성된 PCB, 메모리 영역, 부모-자식 관계 등을 그대로 활용할 수 있어서 편리하다.
- exec() 시스템 콜을 호출하면 현재 프로세스의 코드 영역을 지우고, 새로운 코드로 대체한다. 또한, 데이터 영역이 새로운 프로그램의 변수로 초기화되며, 스택 영역은 리셋된다.
- exec() 시스템 콜 호출을 통해 코드 영역이 대체되지만, PCB의 중요한 정보인 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 정보는 변하지 않는다. 하지만, 프로그램 카운터 레지스터 값과 다른 레지스터 값, 사용한 파일 정보 등은 모두 리셋된다. 즉, 새로운 프로그램의 실행 흐름이 시작된다.
- exit() : 현재 프로세스를 종료하는 시스템 콜
3. 메모리 관련 시스템 콜
- brk() : 프로세스의 데이터 세그먼트 크기를 변경한는 시스템 콜
- mmap() : 파일이나 장치를 메모리에 매핑하여 사용하는 시스템 콜
- munmap() : 메모리 매핑을 해제하는 시스템 콜
4. 네트워크 관련 시스템 콜
- socket() : 네트워크 소켓을 생성하는 시스템 콜
- bind() : 소켓에 주소를 할당하는 시스템 콜
- listen() : 연결 요청을 대기하는 시스템 콜
- accept() : 연결 요청을 수락하는 시스템 콜
- connect() : 서버에 연결을 요청하는 시스템 콜
- send() , recv() : 데이터를 송수신하는 시스템 콜
'Computer Science > Operating System' 카테고리의 다른 글
[OS] IPC (Inter Process Communication) (0) | 2023.05.28 |
---|---|
[OS] PCB (Process Control Block) & Context Switching (0) | 2023.05.28 |
[OS] 인터럽트(Interrupt) (0) | 2023.05.22 |
[OS] 프로세스(Process) & 스레드(Thread) (0) | 2023.05.21 |
[OS] 운영체제란? (0) | 2023.05.21 |