'시스템 호출'에 해당되는 글 1건

  1. 2013.01.03 2-2. 운영체제 구조 : 시스템 호출
카테고리 없음2013. 1. 3. 15:40

시스템 호출(System call)


정의 : 프로세스가 운영체제와 통신하기 위한 유일한 방법.


앞에서 운영체제가 제공하는 서비스들을 살펴보았는데, 이런 서비스에 대한 프로그래밍 인터페이스(Programming Interface : PI)를 제공하는 것이 바로 시스템 호출이다. 시스템 호출은 특정 저수준 작업(하드웨어를 직접 접근하는 작업 등)은 어셈블리 명령을 사용하여 작성되어야 하지만, 일반적으로 C, C++같은 고급 언어로 작성된 루틴 형태로 제공된다.


일단 시스템 호출이 어떻게 사용되는지를  알아보자.


시스템 호출 과정


<파일의 내용을 다른 파일에 복사하는 시스템 호출 순서>


위에서 보듯, 간단한 프로그램이라도 운영체제를 많이 사용하게 된다. 어쩌면 종종 초 당 수천 개의 시스템 호출을 수행하게 된다. 하지만 대부분의 사용자들은, 이 정도로 상세하게 알지 못한다. 대부분의 응용 프로그램 개발자들은 응용 프로그래밍 인터페이스(Application Programming Interface, API)에 따라 프로그램을 설계한다. 호출자는 시스템 호출이 어떻게 구현되고 실행 중 무슨 작업이 일어나는지 아무 것도 알 필요가 없다. 단지 API를 준수하고 시스템 호출의 결과로 운영체제가 무엇을 해 줄 것인지만 이해하면 된다. 따라서 운영체제 인터페이스에 대한 대부분의 자세한 내용은 API에 의해 프로그래머로부터 숨겨지고 실행시간 지원 라이브러리에 의해 관리된다. 실행시간 지원 시스템은 운영체제가 제공하는 시스템 호출에 대한 연결로서 동작하는 시스템 호출 인터페이스를 제공한다. 시스템 호출 인터페이스는 API함수의 호출을 가로채어 운영체제 시스템 호출을 부른다. 간단하게 정리하자면 System call Interface는 커널에 서비스를 요청하거나 하드웨어를 조작하고자 하는 명령이 발생하면 인터럽트(Software Interrupt)를 읽어 해당 함수를 호출하여 주는 것을 말한다. 다음 그림을 보면 이해가 더 쉽다.





< open() 시스템 호출을 호출한 사용자 응용의 처리 >


위 그림은 API를 준수하여 작성된 사용자 응용 프로그램이 있을 때, 해당 프로그램에서 open 시스템 콜을 호출하는 명령어가 있다고 하자. 해당 명령어는 목적에 맞는 시스템 콜을 미리 정의되어 있는 라이브러리에서 캐치한다. 라이브러리가 시스템 호출 색인과 매개변수를 받으면 소프트웨어적인 인터럽트를 발생시킨다. 여기서 말하는 라이브러리가 바로 시스템 호출 인터페이스라고 보시면 된다.

추가적으로 설명을 하자면 그림의 아래보이는 사각형은 시스템 호출 함수들이 색인되어 테이블에 저장된 것이라고 보면 된다. 앞에서 라이브러리가 시스템 호출 색인을 받는다고 하였는데, 테이블에서 색인 번호에 해당하는 시스템 콜 함수를 불러온다고 생각하면 될 것이다.




< 시스템 호출 in C language >


시스템 호출 - 매개변수 전송


위 그림에서 볼 수 있듯, 시스템 호출 시에 매개변수가 전달되기도 한다. 운영체제는 이 매개변수를 전달하기위해서 일반적으로 세 가지 방법을 사용한다.


1. 레지스터를 통한 전송

- 매개변수가 레지스터로 직접 전달되나, 레지스터 크기보다 더 많은 매개변수가 존재하므로 좋지 않은 방법.


2. 블록 or 테이블을 통한 전송

- 매개변수가 메모리 내의 블록이나 테이블에 저장되고, 해당 주소가 레지스터의 매개변수로 전달된다.


3. 스택을 통한 전송

- 매개변수는 프로그램에 의해 스택에 넣어지고(push), 운영체제에 의애 꺼내진다.(pop off)


보통 운영체제는 두 번째 방법을 선호하는데, 이 접근법은 전달되는 매개변수들의 개수나 길이를 제한하지 않기 때문이다.



시스템 호출의 유형


시스템 호출은 다음과 같이 다섯 가지 유형으로 나뉠 수 있다.


1) 프로세스 제어

2) 파일 관리

3) 장치 관리

4) 정보 유지

5) 통신



Posted by twinjh