Application, OS, H/W 관계
도서관으로 비유하자면,
- 운영체제 = 도서관
- 응용 프로그램 = 시민
- 컴퓨터 하드웨어 = 책
- API = 신청서
- 운영체제의 역할:
- 시민 → 도서관에게 책(자원) 요청
- 도서관 → 시민에게 책(자원) 빌려줌
- 기한되면, 도서관이 책(자원) 회수.
실제로,
- 운영체제는 응용 프로그램이 요청하는 메모리를 허가, 분배한다.
- 운영체제는 응용 프로그램이 요청하는 CPU시간을 제공한다.
- 운영체제는 응용 프로그램이 요청하는 IO Devices사용을 허가/제어한다.
운영체제는 사용자 인터페이스를 제공
- 쉘(Shell) - 응용 프로그램
- 사용자가 운영체제 기능과 서비스 조작할 수 있도록 인터페이스 제공하는 프로그램.
- 쉘은 두 종류로 분류: 터미널 환경(CLI)과, GUI환경
사용자에게 인터페이스 제공하기 위해서 별도의 Shell 프로그램을 제공
운영체제는 응용 프로그램을 위해서도 인터페이스를 제공
- API(Application Programming Interface) 형태로 제공
- 보통은 라이브러리(Library) 형태로 제공
- 운영체제에 요청할만한 API들을 묶어서 제공함. 간단하게, C Library. 대부분 운영체제가 처음에 API를 특정 언어용으로 만들어서 제공하고 가장 기본적인 언어가 C언어다 보니 C언어의 API로 제공한다.
전체적인 맥락에서 보면, API는 요청서들이다.
사용자/응용 프로그램이 OS에 자료를 요구할 때 내는 신청서들 같은 존재.
운영체제는 사용자와 응용 프로그램을 위해 인터페이스 제공
시스템 콜
운영체제는 시스템 콜을 제공
- 시스템 콜 또는 시스템 호출 인터페이스
- 운영체제가 운영체제 각 기능을 사용할 수 있도록 시스템 콜이라는 명령 또는 함수를 제공
- API 내부에는 시스템콜을 호출하는 형태로 만들어지는 경우가 대부분이다.
즉,
- API: 각 언어별 운영체제 기능 호출 인터페이스 함수 (각 언어별 인터페이스)
- 시스템콜: 운영체제 기능을 호출하는 함수
전체적인 흐름을 보면
- 운영체제는 사용자든 응용 프로그램이든 외부에서 컴퓨터 하드웨어 자원을 쓰기 위해 필요한 요청서(시스템 콜)를 제공한다. 그런데 시스템 콜 사용법이 복잡하다.
- 그래서 편리를 위해, 해당 시스템 콜을 이용한 각 언어별 라이브러리(API)를 사용하여 운영체제 기능을 요청할 수 있는 인터페이스를 제공한다.
- 이 API를 묶어 놓은 라이브러리를 기반으로 해서 어플리케이션이나 쉘이라는 프로그램을 만든다.
- 사용자는 이 프로그램으로 컴퓨터를 사용한다.
중간 정리
- 운영체제는 컴퓨터 하드웨어와 응용 프로그램을 관리한다.
- 사용자 인터페이스를 제공하기 위해 쉘 프로그램을 제공한다.
- 응용 프로그램이 운영체제 기능을 요청하기 위해서, 운영체제는 시스템 콜을 제공한다.
- 보통 시스템 콜을 직접 사용하기 보다는, 해당 시스템 콜을 이용해서 만든 각 언어별 라이브러리(API)를 사용한다.
CPU Protection Rings
- CPU도 권한 모드 가지고 있다. 2가지 모드.
- 사용자 모드(user mode): 응용 프로그램이 사용
- 커널 모드(kernel mode: OS가 사용. 특권 명령어 실행과 원하는 작업 수행을 위한 자원 접근을 가능하게 하는 모드.
시스템콜은 커널 모드로 실행
- 커널 모드에서만 실행 가능한 기능들이 있음.
- 커널 모드로 실행하려면, 응용 프로그램은 반드시 시스템 콜을 사용해야함(거쳐야함).
- 그러면, 시스템 콜은 운영체제를 제공 해준다.
- 응용 프로그램이 함부로 전체 컴퓨터 시스템을 헤치지 못함.
비유하자면,
등본은 동사무소에서 특별한 신청서를 써야함, 직원분은 특별한 권한을 가지고, 등본 출력 명령을 실행하고 발급을 해줌.
예시
사용자 프로그램 ⇄ 헤더 파일 ⇄ 커널
- open()이라는 함수는 <unistd.h>라는 헤더 파일을 가지고 있는 라이브러리 안에 선언되어 있는 함수.
- 헤더 파일 안에 open()이라는 함수가 선언되어 있고,
- 결과적으로, open()코드 안에는 커널 안으로 들어가서 sys_open()함수를 호출하라도록 되어 있다.
마무리 정리
- 운영체제는 시스템 콜 제공
- 프로그래밍 언어별로 운영체제 기능을 활용하기 위해, 시스템 콜을 기반으로 API제공
- 응용 프로그램은 운영체제 기능 필요시, 해당 API를 사용해서 프로그램을 작성
- 응용 프로그램이 실행되서 → 운영체제 기능이 필요한 API를 호출하면 → 시스템 콜이 호출되서 → 커널모드로 변경되어 → OS 내부에서 해당 명령이 실행되고 → 다시 응용 프로그램으로 돌아간다.