본문 바로가기
운영체제

시스템 콜

by LaTale 2020. 7. 7.

앞서 OS의 목적 2가지를 user convenience(유저 편의성)와 system efficiency(시스템 효율성)이라 했다.

유저 편의성을 위해 GUI나 파일 관리 뭐 이런 것들이 있고, 시스템 효율성을 위해 자원 배치나, protection 등이 있다.


시스템 콜 역시 유저 편의성을 위함이다.

유저가 커널의 자원들 그러니까 하드웨어들을 사용할 때 보다 편하게 도와주는 역할을 한다. 단순히 도와주는 역할에서 끝나는 것이 아니라 유저가 하드웨어를 직접 사용하는 것을 방지해주기도 한다.


즉, 시스템 콜은 유저와 커널 사이의 OS 안에 있다. (사실 커널도 OS 안에 있긴 하다.)


또 앞서 printf와 wirte의 차이점을 살짝 보고 넘어갔는데 정확히 짚고 넘어가자면 printf는 라이브러리 함수이고, write는 시스템 콜 함수이다. 이 둘을 정확하게 구분해야한다.


라이브러리 함수는 사용자들이 많이 사용할 기능들을 미리 함수로 만들어 놓은 것이다. 즉 시스템 콜을 묶어놓은 것이라고 할 수 있겠다.

위 그림으로 쉽게 이해할 수 있다.


시스템 콜은 호출 시 커널 모드로 전환되며 실행되고, 별도로 유저 모드에서 메모리 할당이 필요하다. 


예를 들어 time()이라는 시스템 콜은 호출 시 커널 모드로 전환되어 커널에서 시스템의 시간 정보를 읽어와 time_t 타입으로 리턴해준다. 

그런데 유저 모드에서 커널에서의 메모리 저장 공간을 그대로 사용할 수는 없으니 time_t 타입으로 메모리를 할당해주어야만 한다. (만약 할당하지 않고 그냥 사용하려 하면 세그멘테이션 오류가 발생한다.)


뭐 이부분은 그냥 그렇다 치고 핵심적인 부분은 역시 커널 모드로 전환된다는 것이다.

위 그림을 통해 작동 과정을 한눈에 확인할 수 있다.


앞서의 interrupt vector와 유사하다. write()라는 시스템 콜이 도착하면 system call interface는 시스템 콜마다 할당되어 있는 serial number를 확인한 후 그에 매칭되는 주소값을 찾아가 write() 함수를 실행하고 그 리턴 값을 다시 돌려준다.


이 때 user application 부분이 위 라이브러리의 위쪽 부분이라고 생각하면 된다.


일반적인 함수의 경우 호출할 때 파라미터들을 스택에 저장하는 반면 시스템 콜은 파라미터를 레지스터나 메인 메모리에 저장하는 것도 재미있는 사실이다.



시스템 콜을 5가지로 분류하기도 하고 더 자세하게 21가지로 분류하기도 하는데 이거에 대해서는 굳이 설명하진 않겠다. 과제로 하나하나 찾아봤는데 찾긴 어렵지 않으니 궁금하다면 직접 찾아보기를 바란다.


그냥 끝내버리면 조금 아쉬우니 다른 과제였던 시스템 콜만으로 파일을 복사하는 코드를 살짝 소개하고 끝내겠다.


코드 내의 각 시스템 콜에 대해서는 자세히 설명하진 않을터이니 궁금하다면 직접 찾아보기를 바란다.


#include<fcntl.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> int main(){ char buffer[128]; int infile, outfile; int num; infile = open("./test", O_RDONLY); outfile = open("./copytest", O_WRONLY | O_CREAT, S_IWUSR | S_IWGRP | S_IRUSR | S_IRGRP | S_IROTH); num = read(infile, buffer, 128); write(outfile, buffer, num); close(infile); close(outfile); return 0; }


각 부분에서 에러 핸들링을 하지 않았기에 간단하게 나온다. 그냥 단순하게 시스템 콜의 나열이니 각 시스템 콜에 대해서만 알고 있다면 별도의 설명이 필요없을 것이라 생략하도록 하겠다.


실행해보면 정상적으로 실행됨을 확인할 수 있다.

'운영체제' 카테고리의 다른 글

프로세스 생성  (0) 2020.07.12
프로세스  (0) 2020.07.11
OS Structure, Hardware Protection  (0) 2020.07.07
메모리  (0) 2020.07.06
interrupt의 도착 이후  (0) 2020.04.13