버티의 블로그
[운영체제 #01] Operating System Structures 본문
OS Services and Interfaces
운영체제는 사용자에게 다양한 서비스를 아래와 같이 제공한다.
- 사용자 인터페이스 : Command Line (CLI), Graphics User Interface (GUI), 터치 스크린 등
- CLI : 명령 인터프리터(Command Interperter)중 하나로, 사용자가 직접 명령을 입력할 수 있는 인터페이스
→ 커널이나 시스템 프로그램에 의해 구현된다. - 쉘 : CLI의 한 종류로, 사용자가 OS 서비스에 접근하기 위한 인터페이스
→ 명령어를 받아 해석한 뒤 OS에 커널을 실행한다. - GUI : 마우스, 키보드, 모니터 등과 상호작용 가능한 그래픽 요소를 제공하는 사용자 인터페이스
- CLI : 명령 인터프리터(Command Interperter)중 하나로, 사용자가 직접 명령을 입력할 수 있는 인터페이스
- 프로그램 실행 : 프로그램을 메모리에 로드하고 실행
- I/O 작업 : 실행 중인 프로그램이 파일 입출력 장치를 요구 시 제공
- 파일 시스템 관리 : 파일과 디렉터리를 읽고, 쓰고, 생성하고, 삭제하는 등의 작업
- 통신 : 프로세스 간 정보 교환, shared memory나 message passing 방식을 사용
- 에러 탐지 : 가능한 에러를 항상 의식하고 이에 맞는 조치를 준비
- 자원 할당 : 다수의 프로세스가 동시에 실행 시, 각각에 자원을 할당
- 기록 작성(Logging) : 어떤 프로그램이, 어떤 종류의 자원을, 얼마나 많이 사용한지를 모두 기록
위의 서비스들은 사용자의 command에 따라 하나가 선택되고, 시스템 호출과 사용자 인터페이스를 거쳐 전달된다.
쉘은 유저에게 명령어를 요청(prompt)한 상태로 기다리다가, 명령어를 받아온다.
만약 간단한 명령어면 쉘 자체에서 명령어를 해석해서 실행한다. (첫번째 output)
그게 아니라면 명령어별로 맞는 작업에 따라 OS내의 서비스들과 상호작용하여 실행한다. (두번째 output)
예시로, ls의 경우 OS내 서비스(사진에는 UNIX Kernel and Device Drivers)의 File System에게
현재 디렉터리에 대한 정보를 요청하고 받아와서 사용자에게 출력하게 된다.
이런식으로, 쉘은 자식 processor을 만들어서 작동한다는 점에서 전형적인 multi-processor라고 할 수 있다.
Ways to Develop an Application
시스템 호출(System Calls) : 앞서 봤던 유저 인터페이스를 프로그래밍 하기 위해 제공되는 프로그래밍 인터페이스
- 프로그램이 OS 커널에 서비스를 요청하는 방식으로, 운영체제의 기본적인 기능(파일 시스템 접근, 프로세스 관리, 네트워킹 등)에 접근할 수 있게 해준다. 따라서 이는 low-level의 추상화를 제공한다고 볼 수 있다.
- 프로세스 컨트롤에 관련된 시스템 호출은 다음과 같다.
- Create Process, Terminate Process (프로세스 생성, 프로세스 종료)
- End, Abort (프로그램 끝내기, 프로그램 정지)
- Load, Execute (프로그램 적재, 프로그램 실행)
- Get process attributes, Set process attributes (프로세스 속성 획득, 프로세스 속성 결정)
프로세스 속성 : 프로세스 우선순위, 시간 등을 뜻함 - Wait for time, Wait event, Signal event (일정 시간만큼 대기, 이벤트 전까지 대기, 이벤트 신호 전송)
- Allocate and free memory (메모리를 할당하고 해제)
API(Application Program Interface) : 사용자의 에플리케이션 사용을 위해 운영체제가 제공하는 기능을 제어할 수 있도록 만든 인터페이스
프로그램이 직접 시스템을 호출하는 방식이 아닌, 소프트웨어 간 일종의 '다리' 역할을 한다고 생각하면 쉽다.
API를 통해 서로 다른 서비스 간의 상호작용이 가능해진다.
그래서 API는 high-level의 추상화를 제공한다고 할 수 있다.
보통 시스템 호출보다는 API를 더 자주 사용하는데,
그 이유는 시스템 호출이 다소 복잡하고 어려운거에 반해 API는 쉽고 이식성도 좋기 때문이다.
따라서 개발자들은 주로 API에 따라 프로그램을 설계한다.
라이브러리 : 소프트웨어를 만들 때 쓰이는 클래스나 함수들의 모임으로, 개발자가 제작하는 응용프로그램의 부품 형태로 사용할 수 있게 만들어져 배포되는 기능 모듈이다.
- 정적 라이브러리 : 컴파일러가 소스 파일을 컴파일할 때 참조되는 프로그램 모듈이다.
- 동적 라이브러리 : 프로그램 실행 도중 필요할 때 불러쓰는 프로그램 모듈이다.
프레임워크 : 특정 목적의 응용프로그램을 제작하기 쉽게끔 일련의 작업 흐름을 미리 만들어 놓은 재사용 가능한 모듈 형태의 반제품이다.
Program Execution
- 컴파일러 : 소스 코드를 받아 문법/구조적인 에러를 찾고 object file로 변환 (코드 하나당 파일 한개)
- 링커 : 정적 라이브러리와 같이 여러 object file들을 묶어서 실행 가능한 파일로 변환
- 로더 : 실행 가능한 파일을 경로에서 찾아 적재하고 동적 라이브러리를 불러와 Processing
- 이때 로더가 프로그램(Load Module)을 메모리에 올릴 때 항상 같은 주소에 올리진 않는다.
- 즉, 로더는 메모리 내 가용 가능한 곳이기만 하면 배치한다. (Relocation)
OS Design and Implementation
OS 설계 시 고려해야 할 사항들
- User goals : 유저가 사용하기 편하고, 쉽고, 빠르고, 안전하게 설계
- System goals : 유연하고, 신뢰 가능하고, 에러가 없고, 효율적이고, 공정하게 설계
- Policy : 무엇을 해야하는지 (What will be done?)
- Mechanism(Algorithm) : policy를 어떻게 적용할것인지 (How to do it?)
OS 구조의 구현
- No OS : 오직 유저 프로그램 하나만 돌아간다. (Ex. Arduino)
- Original UNIX : 커널과 시스템 프로그램 2가지로 구성된다.
- Layered Approach : Layer 순서대로 access (아래 Layer에서 서비스를 받고, 위 Layer에게 서비스를 제공)
- 즉, 2단계 이상 떨어진 Layer은 access도 안되고, 영향도 받지 않는다.
- Microkernels : 커널의 일부 기능들이 user space(application)에 존재 = 작아진 커널
- 이 유저 모듈들은 커널의 메세지(message passing)를 통해 통신한다.
- 새로운 OS 구조에 porting 하기가 용이하다는 장점이 존재 : 확장하기 쉽게 설계
- Mach가 대표적인 예시이다.
- Hybrid System : 오늘날 대부분의 OS구조
- macOS, iOS structure : Mach와 BSD(Unix)를 합친 Darwin 구조 Kernel environment를 Core OS로 사용
- Android structure : Linux kernel 기반이지만 약간 다르다.
- Hardware Abstraction Layer가 여기서의 핵심적인 특징인데, OS가 다양한 하드웨어에 대해 동일한 인터페이스를 사용할 수 있게 추상화를 제공하는 계층이다.
- Linux Kernel은 모든 하드웨어와 직접적으로 상호작용하며 메모리관리, 프로세스관리, 네트워킹 등 하드웨어적으로 필요한 운영을 담당한다.
'전공 공부 > 운영체제' 카테고리의 다른 글
[운영체제 #06] I/O Systems (0) | 2024.04.19 |
---|---|
[운영체제 #05] Computer System Operation (0) | 2024.04.18 |
[운영체제 #04] Threads (0) | 2024.04.16 |
[운영체제 #03] Interprocess Communication (0) | 2024.04.09 |
[운영체제 #02] Processes (2) | 2024.04.04 |