
이번 시간에는 운영체제의 구조가 어떻게 이루어져 있는지 좀 더 자세하게 알아보고자 한다.
아래 그림을 통해 운영체제의 구조에 대해 천천히 살펴보도록 하겠다.

응용 프로그램이 OS기능을 사용하기 위한 표준 인터페이스.
조금 쉽게 설명하자면, 개발자에게 제공되는 고수준의 인터페이스다.
예를 들어 카카오 지도를 사용하기 위해서 "카카오 지도를 보여줘"라는 명령(API)를 호출하면 카카오가 내부에서 복잡한 지도 데이터를 처리하고 결과만 보여주는 것이다.
printf("Hello")
//라고 되어있는 것도 C표준 라이브러리 API를 사용한 것이다.
//내부적으로는 'write()'라는 system call을 사용한 것.
사용자 프로그램이 운영체제의 기능을 사용하고 싶을 때 요청하는 특별한 함수 호출.
사용자 모드 프로그램이 커널 모드의 OS 기능을 요청하는 것.
- 파일을 열거나 저장할 때
- 데이터를 읽고 쓸때
- 프로세스를 생성하거나 종료할 때

<두 모드로 나누는 이유>
운영체제에서 system call을 통해 커널에 명령을 내릴 때, 사용자 프로그램이 커널에 전달해야 하는 정보 즉, 매개변수가 있다. 이 매개변수들은 여러가지 전달 방식으로 전달 될 수 있다. - 데이터의 크기, 특성에 따라 달라짐

왼쪽은 맨 처음 부팅할때고, 오른쪽은 프로그램을 실행 상태이다. 프로그램 실행시 free memory의 부분을 차지하는 것을 볼 수 있다.
멀티태스킹이 불가능하다.

사용자 영역 - 위층
: 사용자들이 이용하는 프로그램(shell, compiler, interpreter)이 있다.
System Call Interface
: 사용자 프로그램이 커널 기능을 요청할 때 통하는 '창구'역할.
: 파일을 읽고싶으면 system call을 통해 요청한다.
Kernel
: 하드웨어와 연결되는 직접적인 부분.
: 파일 시스템 관리, CPU 스케쥴링, 메모리 관리, 입출력 처리 같은 복잡한 기능들을 담당한다.
Hardware Interface
: 터미널, 디스크, 메모리 등 실제 하드웨어와 연결되는 부분.
: 커널이 이걸 통해 물리적 장치들과 소통하게 된다.
- 커널에 최소한의 기능만 유지
- 파일 시스템, 장치 드라이버, 네트워크 스택등은 사용자 공간에서 서비스로 실행한다.
<특징>
<장점>
<단점>
- 모든 OS 기능이 단일 커널 공간에 통합된다.(파일 시스템, 드라이버 등)
<특징>
<장점>
<단점>
운영체제의 핵심 기능을 동적으로 로드 가능한 모듈로 분리하여 설계하는 방식이다. Monolithic의 문제점(복잡성, 유연성 부족)을 해결하기 위해 등장했다.
<특징>
객체지향 설계 : 각 모듈은 독립적인 객체처럼 작동하며, 명확한 인터페이스를 통해 다른 묘듈과 상호작용한다.
분리된 코어 컴포넌트 : 커널의 핵심 기능(프로세스, 메모리 관리)와 추가 기능(드라이버, 파일 시스템)을 분리한다.
명확한 인터페이스 : 모듈간 통신은 사전 정의된 API를 통해 이루어진다.
동적 로딩 : 모듈을 실행중에 필요에 따라 메모리에서 올리거나 제거할 수 있다.
<장점>
유지보수 좋음
메모리 효율 올라감 : 사용하지 않는 모듈은 로드하지 않는다.
안정성 : 결함이 발생한 모듈만 재시작 하면 됨.
하드웨어 지원 : 새로운 장치 드라이버를 재부팅 없이 추가할 수 있다.
<동작 원리>
커널 초기화: 기본 기능만으로 최소한의 커널을 부팅.
모듈 탐지: 하드웨어 또는 시스템 요구사항을 분석하여 필요한 모듈을 식별.
모듈 로드: 해당 모듈을 메모리에 적재하고 커널 기능에 통합.
모듈 관리: 사용 중인 모듈은 lsmod(Linux) 명령어로 확인.