-
시스템 호출이란?
시스템 호출은 운영체제가 제공하는 서비스에 대한 인터페이스를 제공하고 프로세스가 운영체제와 통신하는 유일한 방법이다. 특정 저수준 작업은 어셈블리 명령을 사용하여 작성되는데, 이러한 호출은 일반적으로 C와 C++ 언어로 작성된 루틴형태로 제공된다.
- 예) cp in.txt out.txt(I/O system call)
프로그래밍 언어들을 위한 실행시간 지원 시스템은 시스템 호출 인터페이스를 제공한다. 시스템 호출 인터페이스는 API 함수의 호출을 가로채어 필요한 운영체제 시스템 호출을 부른다. 시스템 호출 과정에서 요구되는 필요한 정보가 사용자 모드에서 커널 모드로 전달되어야 한다. 일반적으로, 각 시스템 호출에는 고유의 번호가 할당되는데 시스템 호출 인터페이스는 이 번호에 따라 색인되는 테이블을 유지하고 이 테이블을 보면서 운영체제 커널이 원하는 시스템 호출을 부르고, 시스템 호출의 상태와 반환 값을 돌려준다.
사용자는 이런 내부 과정이 어떻게 돌아가는지 알 필요가 없다. 알아봤자 너무 복잡하다. 이 내부 과정은 API를 호출함으로써 몰라도된다. API가 다 알아서 해주기 때문이다. 그래서 프로그래머들은 직접적인 시스템 호출보다 고급 API를 더 선호한다. 프로그램의 호환성을 해결해주고 시스템 호출 보다 사용하기가 쉽기 때문이다.
시스템 호출의 매개변수 전달 방법
운영체제에 매개변수를 전달하는 방법은 크게 세 가지가 있다.
- 매개변수를 레지스터에 넣어 전달한다. 그러나 레지스터 개수보다 매개변수의 개수가 더 많을 때가 있다. 이런 문제가 생겼을 때는 밑에 두 가지 방법으로 해결한다.
- 매개변수를 메모리 내 블록[혹은 테이블]에 저장하고, 블록의 주소를 레지스터에 매개변수로 넣어 전달한다.
- 프로그램에 의해 매개변수가 스택에 (push)넣어지고 운영체제에 의해 (pop)꺼내어진다.
운영체제는 블록이나 스택 방법을 선호하는데, 이는 전달되는 매개변수 개수나 길이를 제한하지 않기 때문이다.
시스템 호출의 유형
운영체제는 시스템 콜을 통해 다음 여섯 가지 사항을 제어할 수 있다.
프로세스 제어
- 정상적 끝내기 비정상적 중지
- 프로세스를 메모리에 적재, 실행
- 프로세스 생성 및 종료
- 프로세스 속성 획득 및 설정
- 이벤트를 기다리고 알림
- 메모리 할당 및 free
파일 관리
- 파일 생성, 열기, 읽기, 쓰기, 위치 변경, 닫기 및 삭제
- 파일 속성 획득 및 설정
- 장치 관리
- 장치 요청, 읽기, 쓰기, 위치 변경, 해제
- 장치 속성 획득 및 설정
- 장치의 논리적 부착 또는 분리
정보 유지
- 시간과 날짜의 설정과 획득
- 시스템 자료의 설정과 획득
- 프로세스, 파일, 장치 속성의 획득과 설정
통신
- 통신 연결의 생성, 제거
- 상태 정보의 전달
- 메시지의 송신, 수신
- 원격 장치의 부착 및 분리
- 통신의 두 가지 모델
- 메시지 전달 모델 : 통신하는 두 프로세스가 정보를 교환하기 위해 직접 메시지를 송수신한다.
- 공유 메모리 모델 : 프로세스는 다른 프로세스가 소유한 메모리 영역에 대한 접근을 위해 시스템 콜을 사용한다. 두 프로세스가 지정된 메모리 영역을 공유한다.
보호
- 컴퓨터가 제공하는 자원에 대한 접근 제어
- 허가 권한의 설정과 획득