ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 커널 구조, 그리고 시스템 콜과 라이브러리 함수의 차이
    OS 2011. 10. 1. 23:06
    운영체제(OS)란 컴퓨터를 작동시키고 자원을 관리하여 사용자의 응용프로그램이 효율적으로 실행될 수 있는 환경을 제공하는 자원 관리 프로그램을 말한다.
    이때 운영체제가 관리해야 할 자원은 크게 물리적인 자원과 추상적인 자원으로 구분할 수 있다.

    물리적인 자원 : CPU, 메모리, 디스크, 터미널, 네트워크 등 시스템을 구성하고 있는 요소와 주변 장치
    추상적인 자원 : 물리적인 자원을 운영체제가 관리하기 위해 추상화시킨 객체. 즉, CPU를 추상화 시킨 태스크(tesk)와 스레드(thread), 메모리를 추상화시킨 세그먼트와 페이지, 디스크를 추상화시킨 파일과 inode, 네트워크를 추상화시킨 통신 프로토콜과 패킷 등



    <리눅스 운영체제의 구조>
     
    리눅스에서 사용자가 명령이나 프로그램들을 실행하면 리눅스 커널에서 제공되는 시스템 콜이나 라이브러리 함수 등 일종의 API들을 통해 커널의 기능을 수행하도록 설계되어 있다. 따라서 이 시스템 콜과 라이브러리의 이용방법을 잘 숙지하면 어떤 사용자든 리눅스 커널이 제공하는 기능을 이용할 수 있다.



    일반적으로 시스템 콜이란 커널의 자원을 사용자가 사용할 수 있도록 미리 만들어 놓은 함수들을 말한다. 사용자 프로그램이 사용자 모드에서 실행되다가 시스템 콜을 호출하면 커널 모드로 전환하여 실행된다.

    이에 비해 라이브러리 함수란 사용자들이 많이 사용할 것 같은 기능들, 예를 들어 문자열 처리, 표준 입출력, 수학 관련 공식 등을 미리 함수로 만들어 놓은 것으로 이 함수를 호출해도 사용자 프로그램은 사용자 모드에서 실행된다.


    소스를 보자.

    <mysystem.c>

    time()은 시스템 콜로 호출되면 커널 모드로 전환하고, 커널에서 시스템의 시간 정보를 읽어 사용자 프로그램에 그 값을 전달해 준다. time()와 같은 시스템 콜은 사용자 프로그램에서 커널의 메모리 공간을 직접 이용할 수 없으므로, 사용자 프로그램에서 메모리 공간을 할당해야 한다.



     
    <mylib.c>


    ctime() 라이브러리 함수는 time() 시스템 콜을 통해 확인된 초 단위의 시간 정보를 사람들이 쉽게 확인할 수 있는 문자 형식으로 변환시켜 주는 함수로 처리 결과를 char *로 반환한다. 즉, 주소 형태로 반환한다. 따라서 포인터 변수 등을 이용하여 결과를 처리해야 한다. 

    소스 코드를 보면 time_str이라는 포인터 변수가 선언되고 특별한 메모리 할당 없이도 ctime() 함수의 반환값을 정상적으로 처리하고 있다.

    ctime() 함수는 라이브러리 함수로 사용자 모드에서 처리되는 함수이다. 이 함수를 호출하면 사용자 공간(스택)에 메모리 공간을 할당하고 문자 형식으로 변환된 시간 정보를 저장한다. 따라서 사용자 프로그램은 자신의 공간에 할당된 그 부분을 포인터 변수를 통해 참조할 수 있다. 그리고 라이브러리 함수를 이용하는 경우에는 사용자 프로그램에서 별도의 공간을 만들지 않아도 함수의 처리 결과를 이용할 수 있다.



    시스템 콜과 라이브러리 함수의 차이점을 정리하자면 다음과 같다.

     구분 시스템 콜  라이브러리 함수
     수행 공간 커널 모드  사용자 모드 
     메모리 할당 여부 별도로 사용자 모드에서 메모리 할당 필요  라이브러리 함수에서 할당된 메모리 이용 가능 
Designed by Tistory.