[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/운영체제

[운영체제] 커널과 시스템호출

inu 2020. 3. 26. 17:44
반응형

운영체제는 하드웨어와 매우 밀접하게 연관되어 있다. 특히 CPU내의 레지스터나 메모리 입출력장치 등과 같이 장치 자체가 운영체제의 기능과 접점을 이루는 경우, 해당 장치의 구조와 기능을 잘 알고 있어야 운영체제를 이해할 수 있다. 하지만 하드웨어 전체를 이해하기란 어려움이 있으므로, 컴퓨터 구조라는 개념으로 일반화(추상화)하여 공부해보고자 한다. 앞으로 커널과 시스템 호출부터 시작해서 커널이 외부세계와 접촉하는 입출력 시스템, 입출력시스템과 커널의 접점인 인터럽트의 구조와 기능, 캐시와 기억장치의 구조 등에 대해 공부하겠다.


커널

  • 커널 : 이전에 배운 '상주모니터' 개념의 연장선 상에 있다. 운영체제의 핵심으로서 부팅 이후 메모리에 상주하는 부분이다. (사실 부팅 자체가 이러한 커널을 메모리에 탑재하는 과정이다) 상주 모니터보다 훨씬 발전하여 시분할 시스템을 제대로 지원하고 메인 메모리와 CPU, 입출력장치 등을 전적으로 관리한다. 즉, 커널은 주로 자원 관리와 자원 사용에 대한 관리를 한다.
  • 이러한 커널은 상주모니터와 마찬가지로 자신을 보호하기 위해 '시스템 호출' 기능을 제공한다. 응용프로그램이 입출력과 같은 커널의 기능을 사용할 때 이러한 시스템 호출을 통하도록 한다. (이렇게 함으로서 커널은 스스로의 코드를 보호한다.)
  • 시스템 프로그램 : 커널과 혼동되기 쉬운 개념으로, 운영체제 개발자가 기본적으로 제공하는 라이브러리나 사용 도구를 뜻한다. 편집기(vi 등), 컴파일러(gcc 등), 디버거(gdb), 쉘(ssh 등), 쉘 명령어(ls, cd, ps, grep 등) 등이 있다.

커널의 구성요소

  • 커널의 구성요소는 같은 커널에서도 기능적 측면과 형태적 측면 두가지 측면에서 살펴볼 수 있다.
  • 기능적 측면 : 부팅 단계 기능 (커널이 수행되기에 적합하도록 하드웨어를 진단하고 초기화하는 기능 & 디스크 상에 있는 커널 프로그램을 메모리 상에 적재하는 기능) / 부팅 후 기능 (프로세스, CPU, 주기억장치, 파일 시스템, 보조기억장치, 시스템클럭, 네트워크, 입출력 장치 경영 기능 & 이러한 경영 전반에 관여된 보안 및 정보보호 기능)
  • cf. 형태적 측면은 커널의 각종 기능을 수행하는 함수들이 어떻게 모여 있는지를 구분한 것이다.
  • 형태적 측면 : 시스템 호출 함수의 집합 (응용 프로그램이 시스템 호출로 사용하는 함수들) / 디바이스 드라이버 및 인터럽트 처리기의 집합 (입출력 장치가 인터럽트를 통해 작동시키는 부분) / 그 외 함수들의 집합 (대표적으로 스케쥴러가 있는데, 이와 같은 함수들은 시스템 호출 함수, 디바이스 드라이버의 함수들과 직간접적으로 연결되기도 한다. 이에 대해서는 추후에 알아보자.)

시스템 호출

  • 응용 프로그램과 커널이 만나는 접점이 되어준다. 커널 API라 부르기도 하지만 시스템 호출 또는 시스템 콜이 정확하다.
  • 우리가 흔히 사용하는 printf나 open, read, write와 같은 함수들도 결국은 시스템 호출이 이루어져 커널의 함수가 동작하는 것이다.
  • 시스템 호출은 파라미터 전달과 CPU의 명령어 수행으로 이루어진다. 시스템 호출도 결국은 함수 호출과 개념상 동일하기 때문에 파라미터 전달이 필요하다.
  • Linux나 Solaris같은 OS의 경우 특정 시스템 호출에 필요한 파라미터를 메모리 상 특정 주소에 저장해놓고, 해당 메모리의 주소를 레지스터에 기록한다. 그리고 해당 시스템 호출 함수가 수행되면 메모리의 해당 주소로 가서 해당 주소에 저장된 파라미터들을 읽는 방식으로 작동된다.
  • 시스템 호출은 하드웨어 인터럽트와 다른 소프트웨어 인터럽트(트랩)으로 발생된다. 트랩 명령어인 instruction은 X86 계열의 장치에선 int, ARM계열 장치에선 swi가 있다.
  • 이렇게 운영체제와 응용 프로그램간의 간의 연결고리가 되는 시스템 호출이 파라미터 형식이나 번호 등에 있어서 차이가 있다면 치명적인 호환성 문제를 야기할 수 있다. 따라서 ISO/IEC, IEEE가 공동으로 재정한 POSIX(Portable Operationg System Interface)를 표준으로 한다. 프로세스의 제어, 파일 조작, 주변 장치 조작, 정보관리, 통신, 보호 6개의 유형으로 시스템 호출을 나눈다.

동기식 호출과 비동기식 호출

  • 동기식 호출(Blocking call) : 특정 시스템 콜을 할 때 그 결과값이 넘어오기를 기다린 후에 다음 라인을 수행하는 것이다. 예를 들어 리드의 경우 하드디스크같은 하드웨어에서 데이터전송을 마치고, 커널이 전송을 마쳤다는 내용을 응용프로그램으로 전달하기까지 다음 라인으로 넘어가지 않고 기다린다는 것이다. (CPU가 아무일을 안하는 것은 아니다. 시분할 시스템에 의해 다른 프로세스를 수행시키고 있을 것이다.)
  • 비동기식 호출(Non-blocking call) : 시스템 콜이 이루어지는 커널에 콜만 요청해놓고 바로 다음 연산을 수행한다. 그러다 해당 시스템 콜이 종료되면 그 때 이벤트를 가져온다. 따라서 비동기식 호출의 경우에는 해당 이벤트를 처리할 함수를 파라미터로 넣도록 되어있다. 이러한 함수를 콜백함수라고 하는데, 이벤트가 온다는 것은 곧 바로 이 콜백 함수가 불리는 것이다. 콜백 함수는 시스템 콜로 전달된 데이터를 응용 프로그램이 일정 자료 구조로 저장하거나 처리하도록 한다. 이러한 비동기식 호출은 디바이스 드라이버 등에서 필요한 기능을 잘 구현해놓은 경우에만 사용할 수 있기에 시스템 호출의 사용법을 잘 익히고 나서 사용해야 할 것이다. (비동기식 호출은 시스템콜이 이루어지는 동안에도 프로세스 자체가 CPU를 사용할 수 있다.)
반응형