파게로그

System Calls 본문

콤퓨타 왕왕기초/OS

System Calls

파게 2020. 11. 28. 05:52

2.3 System Calls

 

시스템 콜은 운영체제에 의해서 사용 가능한 서비스에 대한 인터페이스를 제공한다. 이러한 calls는 일반적으로 C 또는 C++로 쓰인 함수로서 가능한데, 그럼에도 일부 low-level tasks(예를 들어, 하드웨어가 직접적으로 접근되어야 하는 작업)는 assembly-language instructions을 사용하여 쓰여야 할 수 있다.

 

2.3.1 Example

시스템 콜이 사용되는 것을 기술하기 위한 예시: 하나의 파일로부터 데이터를 읽어, 그 데이터를 다른 파일로 복사하는 간단한 프로그램

이 프로그램에서 처음 필요한 것은 두 파일의 이름: input file과 output file

이러한 이름은 많은 방법을 통해 특정될 수 있는데, 운영체제의 설계에 따른다. 하나의 접근은 명령의 일부로서 두 파일의 이름을 전달하는 것이다 - 예를 들어 UNIX의 cp 명령에서는: cp in.txt out.txt // 또 하나의 접근은 사용자에게 이름을 물어보는 것이다. interactive system에서, 이러한 접근은 일련의 system calls를 요구하는데, 첫 번째는 화면에 prompting message를 띄우는 것이고, 두 번째는 두 파일을 정의하는 문자들을 키보드로부터 읽어들이는 것이다.

두 파일의 이름이 얻어지고나면, 프로그램은 input file을 열어야 하고, output file을 생성하고 열어야 한다. 각각의 작동은 다른 system call을 요구한다. 각각의 system call에 대한 가능한 error conditions는 handle되어야 한다. 예를 들어, 프로그램이 input file을 열고자 했을 때, 그러한 이름을 가진 파일이 없거나 그 파일에 대한 접근이 제한되어 있을 수 있다. 이러한 경우에는, 프로그램은 에러 메시지를 출력해야 하고(또다른 일련의 system calls), 그리고 비정상적으로 종료해야 한다(another system call). 만약 input file이 존재한다면, 새로운 output file을 생성해야 한다. 같은 이름의 파일이 이미 존재할 수 있다. 이 상황은 프로그램의 중단(a system call)을 유발할 수 있고, 또는 우리가 기존 파일을 삭제하고(another system call) 새로운 파일을 만들 수 있다(yet another system call). 또다른 선택권으로는, interactive system에서, (prompting message를 출력하는 시스템 콜과 터미널로부터 응답을 읽어들이는 일련의 시스템 콜을 거쳐) 사용자에게 기존 파일을 교체할 것인지 프로그램을 중단할 것인지 물어보는 것이 있다.

두 파일이 모두 set up되면, input file로부터 읽어들이고(a system call) output file에 쓰는(another system call) loop로 진입하게 된다. 읽고 쓰는 각 작업은 가능한 다양한 에러 상황과 관련된 상태 정보를 반환해야 한다. 입력에서는, 프로그램이 파일의 끝에 도달했거나 읽기에서 (parity error과 같은) 하드웨어 failure가 있다는 것을 발견할 수 있다. 쓰기에서는 출력 장비에 따라 다양한 에러(예를 들어, 디스크에 충분한 여유 공간이 없다는 에러)를 마주칠 수 있다.

최종적으로 파일 전체가 복사된 후 프로그램은 모든 파일을 닫고(two system calls), 콘솔이나 윈도우에 메시지를 쓰고(more system calls), 최종적으로 정상적으로 종료(the final system call)할 것이다.

 

2.3.2. Application Programming Interface

볼 수 있듯이, 간단한 프로그램조차 상당한 수준으로 운영체제를 사용한다. 빈번하게, 시스템은 초당 수천 개의 시스템 콜을 실행한다. 그러나 대부분의 프로그래머들은 이러한 상세한 수준을 보지 못한다. 전형적으로, application developers는 application programming interface(API)에 따라 프로그램을 설계한다. API는 application programmer에게 주어진 많은 function들을 명세하는데, 이는 각 function에 전달될 인자와 프로그래머가 기대하는 return values를 포함한다. application programmers에게 가장 흔한 3개의 API는 Windows systems를 위한 Windows API, POSIX-based system을 위한 POSIX API(virtually 모든 버전의 UNIX, Linux, macOS를 포함함), 그리고 JVM 위에서 동작하는 Java API이다. 프로그래머는 운영체제가 제공하는 코드의 라이브러리를 통해 API에 접근할 수 있다. UNIX와 Linux의 경우 C언어로 쓰인 프로그램의 경우, 라이브러리는 libc라 불린다. 주목할 것은, 명시되지 않으면, 본문에 쓰인 시스템 콜의 명칭들은 모두 총칭적인 것이다. 각 운영체제는 각 시스템 콜에 대해 자신만의 명칭을 가지고 있다.

무대 뒤에서, API를 구성하는 functions는 일반적으로 application programmer를 대표하여 실제의 시스템 콜을 불러일으킨다. 예를 들어, Windows function인 CreateProcess()는(놀랍지 않게도, 새 프로세스를 만들기 위해 쓰인다) 실제로 Windows 커널에서 NTCreateProcess() 시스템 콜을 invoke한다.

'콤퓨타 왕왕기초 > OS' 카테고리의 다른 글

운영체제 서비스  (0) 2020.11.24
1.10~1.13  (0) 2020.11.23
보호 및 보안  (0) 2020.11.23
프로세스 관리  (0) 2020.11.17
운영체제의 작동  (0) 2020.11.17
Comments