메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

POSIX Abstractions in Modern Operating Systems: The Old, the New, and the Missing

noriwiki


개요

POSIX규약은 Portability을 위해서 많이 사용되어 왔다. 이 논문에서는 POSIX가 세월이 흐르며 어떻게 변경되어 왔고, 현재는 어떻게 사용되고 있는지 분석한 결과를 제시하였다. 기존의 시스템 논문과는 다르게, 디자인이 중심이 되는 논문이 아니라 분석이 중심이 되는 논문이다. 논문에서는 자주 사용되는 유저 프로그램들을 Libtrack이라는 라이브러리를 통해서 분석하였다. Libtrack은 POSIX 함수들을 Wrap해서 동적 그리고 정적으로 분석할 수 있도록 저자들이 만든 분석 도구이다.

논문의 결과는 다음과 같이 요약 가능하다.

  1. POSIX는 Application에 의해서 직접 사용되는 경우보다, Framework를 통해서 사용되는 경우가 더 많다.
  2. ioctl을 사용해서 POSIX의 한계를 극복하는 경향이 있다. Graphic, sound와 같은 Driver에 직접 연관된 장치들은 IOCTL을 많이 사용하고 있다.
  3. POSIX에 새로운 API들이 만들어 지고 있지만, OS사이에 수렴하지 않고 따로 노는 경향이 강해지고 있다. 1과 연관되어서 Application들이 더이상 POSIX API를 통해서 OS에 접근하는 것이 아니라 Framework를 통해서 접근하기 때문에, 이러한 경향은 심해지고 있다.

결과 분석

어떤 함수들이 이용되고 어떤 함수들이 이용되지 않고 있는가?
Andriod와 Ubuntu 그리고 OS X에 따라서 POSIX의 사용의 대한 경향성이 다른 것을 보였다. Andriod는 다른 두 시스템과는 다르게, POSIX에 대한 의존을 줄이고 최적화된 내부 라이브러리를 이용하는 경향을 보였다. 특히 안드로이드에서는, 821개의 POSIX함수중에서 반 정도는 1%미만 그리고 13% 정도는 아예 사용되지 않고 있었다.
왜 IOCTL이 자주 사용되는 가?
이는 그래픽, 혹은 사운드처럼 POSIX가 지원하지 않는 기능들을 구현하기 위해서 사용되고 있었다. 혹은 Andriod에서 Binder처럼 Framework의 기능을 OS에 구현하기 위해서, IOCTL을 통해, 구현하기도 하였다.
POSIX에는 Modern Application이 필요로 하는 기능들이 충분히 구현되어 있는가?
POSIX는 Graphic에 대한 지원을 하지 않는다. 이는 그래픽 처리는 각 장치 제조사마다 매우 다르기 떄문에 (API 측면에서), 통일해서 POSIX으로 만들기가 어렵기 때문이다. 이러한 경우에는 Framework가 직접 IOCTL로 디바이스 드라이버와 통신하여 처리하고 있었다. 네트워크에서도 좀더 Low level의 소켓 Operation에 접근하기 위해서 IOCTL이 많이 사용되고 있었다.
어떤 POSIX의 Abstraction들이 교체되고 있는가?
IPC IPC와 같은 경우에는 Andriod에서는 IPC의 근본적인 문제들 (Filesystem-based IPC를 보안정책으로 인해서 사용할 수 없음, FD를 전송할 수 없음, Context management를 제공하지 않음, Authorization을 제공하지 않음, Referencing이 존재하지 않음)과 같은 문제로 인해서 Binder라는 특수한 API로 대체되어 사용되고 있다. Linux와 같은 경우에는 kdbus라는 것으로 한계를 극복하고 있고, OS X와 같은 경우에는 Mach IPC를 통해서 XPC API를 구현해 사용하고 있다. 정리하자면 IPC의 한계를 극복하기 위해서 각 Vedor들은 서로 비슷한 그러나 호환되지 않는 IPC매커니즘을 제공하고 있다.
File System FS와 같은 경우에는 다양한 Optimization의 방법들이 있는데, 커널은 Application specified된 것이 아니라 정해진 Operation만을 제공함으로서, Optimization에 대한 고려가 없다. (+ 이는 POSIX가 Stateful한것에서 기원한다고 생각한다. 예를 들어서 write과 같은 경우에는 무조건 다음 Read가 Consistency한 결과를 가져와야 함을 보장해야 한다.)
AIO Multithreading 환경에서 효율적인 I/O를 제공하기 위해서 AIO, IO_URING과 같은 POSIX함수들이 제공되고 있다. 특히 이러한 Polling기반의 Asynchronous API들은 Low-latency가 중요한 환경, Performance가 중요한 환경에서 많이 사용되고 있다. IPC와 마찬가지로 OS마다 상이한 매커니즘을 가지고 AIO를 구현하고 있다.
POSIX를 사용하며 부작용은 없는가?
POSIX의 잘 사용되지 않는 함수들은 관리되지 않을 확률이 높기 때문에 Attack의 도구로 사용될 수도 있다.