운영체제는 사용자가 프로그램을 편리하게 사용할 수 있는 환경을 제공한다. 운영체제가 제공하는 서비스는 다음과 같다.
- 사용자 인터페이스 제공 : CLI, GUI, 터치 스크린
- 프로그램 수행
- 입출력 연산
- 파일 시스템 조작
- 통신 : 프로세스간 통신(공유 메모리 & 메시지 전달 기법)
- 오류 탐지
- 자원 할당
- 기록 작성(로깅)
- 보호와 보안
앞서 운영체제는 유저모드와 커널모드, 두 가지 모드를 제공한다고 배웠다. 유저모드에서 커널모드로 접근하기 위해 제공하는 인터페이스를 시스템 콜이라고 한다.
시스템 콜은 프로세스 제어
, 파일 조작
, 장치 조작
, 정보 유지 보수
, 통신
, 보호
의 범주로 나눌 수 있다고 한다.(이 정도면 사용자 인터페이스를 제외하고 OS의 모든 기능)
예시로 살짝 들면 프로세스 제어와 관련된 시스템 콜은, Windows의 createProcess(), ExitProcess(), WaitForSingleObject() / Unix의 fork(), exit(), wait()등이 있다.
컴퓨터 시스템의 구성요소는 하드웨어
<-> 운영체제
<-> 응용프로그램
<-> 사용자
로 되어있다. 운영체제와 응용프로그램 사이에 시스템 서비스라는 개념이 있는데, 시스템 서비스는 프로그램 개발과 실행을 위해 더 편리한 환경을 제공해주며, 시스템 콜 인터페이스도 이 범주에 속한다.
- 파일 관리 및 변경
- 상태 정보 : 날짜, 메모리 공간 정보 등을 제공
- 프로그래밍 언어 지원 : 컴파일러, 어셈블러 디버거 등
- 프로그램 적재 및 수행
- 통신 : 컴퓨터 시스템들간의 통신 - 가상접속(원격 로그인 등)
- 백그라운드 서비스
시스템 서비스는 디스크에 저장된 프로그램을 프로세스로 만들기 위해 컴파일러, 링커, 로더를 사용한다.
커널의 모든 기능을 단일 정적 이진 파일에 넣는 방식이다. 장점은 커널 안에서의 통신 속도가 빠르고, 오버헤드가 없다는 것이다.(당연함. 한 파일에 다 쑤셔넣음.) 단점은 새로운 기능을 확장하기가 어렵다. 한 부분을 변경하면 다른 부분에도 영향을 끼칠 수 있기 때문이다.
기능을 한 곳으로 몰아넣어 확장이 어렵다면, 기능을 계층으로 구분해서 계층별로 확장하기 쉬운 구조로 만들 수 있다. 운영체제또한 기능을 계층 별로 나눠 설계할 수 있다. 단, 각 계층을 어떤 기준으로 나눌 것인지 적절히 기준을 선정해야 하고, 계층간의 오버헤드가 발생할 수 있음을 고려해야 한다.
커널의 기능들을 사용자 수준 프로그램으로 분리한 구조. 커널은 메모리 관리, CPU 스케줄링 등 최소한의 기능을 가지게 되고, 파일 시스템 관리나 장치 드라이버 인터페이스등의 기능은 커널에서 분리돼 별도의 모듈로 제공한다.
각 모듈은 사용자 수준 프로그램으로 구현된다. 사용자 공간에서 존재하는 서비스들이 커널을 통해 통신을 주고받게 된다. (어떤 서비스들을 사용자 공간에 둘 것인지는 의견이 많이 갈리는 듯)
장점은 모듈별로 확장이 가능하다는 것, 단점은 계층적 구조와 똑같이 각 서비스간의 통신 비용이 존재한다는 것이다.
(책에서는 그 비용으로 메시지 복사 비용
과 프로세스 전환
비용을 주로 꼽았는데 macOS의 Mach 마이크로 커널은 모든 커널 확장을 단일 주소 공간으로 결합해서 해결했다고 한다. 근데 이걸 해결 방법이라고 볼 수 있나? 책에서도 이거 때문에 Mach는 순수한 마이크로커널은 아니라고 말하고 있긴함. 어렵다. 모르겠음.)
커널은 핵심 기능만 제공하고, 나머지 기능들은 모듈로 분리하여 동적으로 구현한다. 이를 적재가능 커널 모듈LKM)이라고 부르고, LKM에 의해 제공되는 기능이 더 이상 요구되지 않으면 메모리와 자원을 할당 해제하기 위해 언로드시킬 수 있다고 한다. (근데 무슨 기준으로 언로드?)
인터페이스를 사용해 커널과 다른 서비스들을 연결한다는 점에서 계층 구조와 닮았으나, 한 모듈에서 임의로 다른 모듈을 호출할 수 있다는 점에서 계층 구조보다 유연하다고 한다. (근데 얘네도 막 양방향으로 의존하고 그런 건 힘들지 않을까?) 마이크로 커널과도 유사하게 느껴지나, 메시지 전달을 호출할 필요가 없기에 더 효율적이라고 한다. (메시지를 어떤 형태로 주고 받는지 더 찾아보면 좋을듯 - 시스템콜인터페이스 & IPC)