운영체제[OS] 2. OS Structures
이 글은 고려대학교 김민호 교수님의 운영체제강의를 토대로 작성한 글입니다.
This post is based on the operating system lecture by Prof. Minhoe Kim of Korea University.
# Chapter 2: Operating-System Structure
사용자 인터페이스 (UI): 대부분의 운영 체제는 명령줄 인터페이스(CLI), 그래픽 사용자 인터페이스(GUI), 터치스크린 인터페이스,
일괄처리 인터페이스 등 다양한 유형의 사용자 인터페이스를 제공합니다.
프로그램 실행: 운영 체제는 프로그램을 메모리에 로딩하고 실행하며,
프로그램이 정상적으로 종료되거나 오류로 인해 종료될 때까지 실행을 관리합니다.
입출력 (I/O) 작업: 실행 중인 프로그램은 파일이나 프린터, 스캐너와 같은 입출력(I/O) 장치와 데이터를 주고받을 수 있습니다. 운영체제는 이러한 I/O작업을 관리하여 프로그램이 하드웨어와 직접 통신하지 않아도 되게 해주며, 프로그램 간의 데이터 교환을 지원합니다.
- 파일 시스템 조작: 파일 시스템은 컴퓨터 저장소를 논리적으로 조직하는 방법이며, 사용자가 파일을 쉽게 관리할 수 있도록 해줍니다. 운영 체제는 다음과 같은 파일 시스템 관련 기능을 제공합니다.
- 파일 및 디렉터리 읽기/쓰기: 프로그램은 파일의 내용을 읽거나 새로운 내용을 쓸 수 있습니다. 또한 디렉터리 구조를 탐색하여 원하는 파일을 찾을 수 있습니다.
- 파일 및 디렉터리 생성/삭제: 프로그램은 새로운 파일이나 디렉터리를 만들 수 있으며 더 이상 필요하지 않은 파일이나 디렉터리를 삭제할 수 있습니다.
- 파일 검색: 프로그램은 파일 이름이나 내용을 기준으로 파일을 검색할 수 있습니다.
- 파일 정보 열람: 프로그램은 파일의 크기, 수정 시간, 소유권 등과 같은 파일 정보를 확인할 수 있습니다.
- 권한 관리: 운영 체제는 특정 사용자 또는 프로그램만 특정 파일에 액세스할 수 있습니다.
- 통신: 컴퓨터는 단일 프로그램만 실행하는 것이 아니라 여러 프로그램이 동시에 실행될 수 있습니다. 이러한 프로그램 간에는 서로 정보를 주고받을 필요가 종종 생깁니다. 운영체제는 다음과 같은 방법을 통해 프로세스 간 통신을 지원합니다.
- 공유 메모리: 프로세스 간에 메모리 공간을 공유하여 데이터를 직접 주고받을 수 있습니다.
- 메세지 전달: 운영 체제를 통해 메세지를 주고받는 방식입니다. 프로그램은 메세지를 보내고 메세지를 받을 수 있으며, 운영 체제는 메세지를 안전하게 전달하는 역할을 합니다.
- CPU 및 메모리 하드웨어
- 입출력 장치(프린터, 디스크 드라이브 등) - 사용자 프로그램
- 운영 체제는 이러한 오류를 효과적으로 감지하고 적절한 조치를 취해야 시스템의 안정성을 유지할 수 있습니다.
- 디버깅 도구: 운영 체제는 프로그램 개발 및 문제 해결을 돕는 디버깅 도구를 제공할 수 있습니다. 이러한 도구를 사용하여 프로그램 실행 과정을 추적하고 오류의 원인을 파악할 수 있습니다.
자원할당 : 컴퓨터 시스템은 일반적으로 여러 사용자와 프로그램이 동시에 실행됩니다.
이러한 상황에서 운영 체제는 각 사용자와 프로그램에게 필요한 리소스를 효과적으로 할당해야 합니다.
할당되는 리소스의 종류는 다음과 같습니다. - CPU 사용 시간 (CPU cycles), 메인 메모리 , 파일 저장 공간 , 입출력 장치
리소스 사용 기록 (Logging): 운영 체제는 각 사용자와 프로그램이 어떤 종류의 리소스를 얼마나 많이 사용했는지를 기록합니다.
보호 및 보안: 컴퓨터 시스템은 일반적으로 여러 사용자가 사용하며 네트워크에 연결되어 있을 수도 있습니다. 이러한 환경에서 사용자 데이터의 보호와 시스템 자체의 보안이 매우 중요합니다. 운영 체제는 다음과 같은 방식으로 시스템을 보호합니다.
보호 (Protection): 시스템 자원에 대한 모든 액세스를 제어하여 승인되지 않은 사용이나 프로그램이 시스템 리소스를 사용하지 못하도록 합니다.
사용자 인증(User Authentication): 시스템에 접속하려는 사용자의 신원을 확인합니다.
사용자는 유효한 계정 정보를 입력하여 자신의 정체성을 증명해야 시스템을 사용할 수 있습니다.
외부 I/O 장치 보호: 외부에서 시스템에 연결된 입출력 장치(예:하드 드라이브)에 대한 무단 액세스를 차단합니다.
1. 명령줄 인터페이스 (CLI): CLI는 텍스트 기반의 인터페이스입니다. 사용자는 키보드를 통해 명령어를 입력하고, Enter 키를 눌러 명령을 실행합니다. CLI는 과거 초기 컴퓨터 시스템에서 주로 사용되었으며, 지금도 시스템 관리자나 파워 유저들이 특정 작업을 위해 사용합니다.
2.그래픽 사용자 인터페이스 (GUI): GUI는 현재 가장 일반적인 사용자 인터페이스입니다. GUI 아이콘, 메뉴, 윈도우 등의 그래픽 요소를 사용하여 사용자에게 친숙한 환경을 제공합니다. 사용자는 마우스와 키보드를 사용하여 아이콘을 클릭하거나 메뉴를 선택하여 프로그램을 실행하고 작업을 수행할 수 있습니다.
3.터치스크린 인터페이스: 모바일기기에서 주로 사용되는 인터페이스입니다. 사용자는 터치스크린을 직접 터치하거나 스와이프하는 제스처를 사용하여 프로그램을 실행하고 작업을 수행합니다.
❖ 명령 인터프리터 (Command Interpreter): CLI의 핵심은 명령 인터프리터(또는 쉘)입니다.
명령 인터프리터는 사용자가 입력한 명령을 해석하고 실행하는 프로그램입니다.
- 위치: 명령 인터프리터는 운영 체제 커널(핵심)의 일부로 구현되기도 하고, 별도의 시스템 프로그램으로 구현되기도 합니다.
- 여러 종류의 쉘: 명령 인터프리터는 여러 종류가 존재하며, 쉘(shell)이라고도 불립니다.
- Linux에서는 BASH(Bourn-Again SHell), CSH(C SHell), KSH(Korn Shell), TCSH 등이 대표적인 쉘입니다.
- Windows에서는 CMD(command Prompt)가 대표적인 쉘입니다.
- 사용자로부터 명령을 받아서 실행하는 것이 주된 목적입니다.
- 때로는 내장된 명령일 수도 있고,
- 때로는 그냥 프로그램 이름일 수도 있습니다.
- 새로운 기능을 추가하는 것은 쉘 수정이 필요하지 않습니다.
그래픽 사용자 인터페이스(GUI)는 사용자 친화적인 데스크톱 화면을 기반으로 하는 인터페이스입니다.
- 핵심 구성 요소:
- 마우스, 키보드, 모니터: 일반적으로 사용자가 GUI와 상호 작용하는 데 필요한 기본적인 입력 및 출력 장치이빈다.
- 아이콘: 파일, 프로그램, 작업 등을 시각적으로 표현합니다.
- 사용자 상호 작용:
- 사용자는 마우스를 사용하여 아이콘이나 버튼 위에 커서를 올려놓으면 도움말과 같은 추가 정보를 볼 수 있습니다.(정보 제공)
- 마우스 버튼을 클릭하면 프로그램 실행, 파일 열기, 명령 실행 등 다양한 작업을 수행할 수 있습니다. (기능 실행)
- 운영체제와 GUI: 현대 운영 체제는 대부분 명령줄 인터페이스(CLI)와 그래픽 사용자 인터페이스(GUI)를 모두 지원합니다.
- Microsoft Windows : 그래픽 사용자 인터페이스(GUI) 기반이지만 명령 프롬프트(CLI) - "command" shell 도 제공합니다.
- Apple Mac OS: "Aqua"라는 그래픽 사용자 인터페이스(GUI)를 사용하지만 내부적으로는 유닉스 커널을 사용하여 명령줄 인터페이스 또한 사용할 수 있습니다.
- 리눅스: 기본적으로 명령줄 인터페이스(CLI)를 사용하지만 KDE, GNOME과 같은 선택적 그래픽 사용자 인터페이스(GUI)를 설치하여 사용할 수 있습니다.
터치스크린 기기가 등장하면서 기존의 사용자 인터페이스 방식에도 변화가 필요했습니다.
마우스 사용이 불가능하거나 적합하지 않은 터치스크린 기기에서는 다음과 같은 특징을 가진 인터페이스를 사용합니다.
Q. GUI가 사용자 친화적이라면 왜 여전히 명령줄 인터페이스(CLI)를 사용할까요?
GUI는 배우기 쉽고 사용하기 편리하도록 설계되었습니다.
그러나 CLI에는 여전히 다음과 같은 장점이 있어 특정 상황에서 더 적합하게 선택될 수 있습니다.
- CLI를 사용하는 이유:
- 효율성: 숙련된 사용자에게는 CLI가 훨씬 빠를 수 있습니다. 복잡한 작업을 스크립트로 자동화하고 반복적인 작업을 몇 번의 키 입력으로 수행할 수 있습니다.
- 정확성: 특정 작업에는 매우 구체적인 명령이 필요하며 CLI는 시스템에 대한 더 세밀한 제어를 제공합니다.
- 원격 관리: 많은 서버 및 네트워크 장치는 CLI를 사용하여 원격으로 구성 및 관리됩니다.
- 자세한 정보: CLI는 종종 GUI에 비해 시스템 프로세스 및 오류에 대한 더 자세한 정보를 제공합니다. 유연성: 일부 구성 옵션은 CLI를 통해서만 사용할 수 있습니다.
- GUI를 사용하는 이유:
- 사용 편의성: GUI는 일반적으로 배우고 사용하기가 더 쉽습니다. 특히 초보자에게 아이콘과 메뉴가 더 직관적입니다.
- 시각적 표현: 복잡한 데이터 구조 또는 파일 계층은 GUI에서 더 쉽게 시각화할 수 있습니다. 멀티태스킹: GUI를 사용하면 창을 사용하여 다양한 프로그램과 작업 간을 쉽게 전환할 수 있습니다.
- 접근성: 시각 장애나 손동작 제한이 있는 사용자에게는 화면 읽기 및 단축키와 같은 기능이 있는 GUI가 더 접근성이 높을 수 있습니다.
- 결론적으로 CLI와 GUI 모두 장단점이 있습니다. 최적의 선택은 특정 작업과 사용자의 편의 수준에 따라 다릅니다.
❖ 프로그래밍 인터페이스란?
- 운영 체제가 제공하는 서비스에 대한 프로그램 개발 인터페이스입니다.
- 프로그램은 이 인터페이스를 통해 운영 체제의 기능을 호출하고 시스템 자원을 이용할 수 있습니다.
- 프로세스가 운영 체제와 상호작용하는 유일한 방법입니다.
프로그래밍 인터페이스의 주요 특징:
- 대부분 하이 레벨 프로그래밍 언어 (C,C++)로 작성됩니다.
- 하지만 프로그램은 보통 직접 시스템 호출을 사용하기보다는 더 높은 수주의 응용 프로그램 프로그래밍 인터페이스(API)를 통해 운영 체제 서비스에 접근합니다.
❖시스템 호출(System Call) 대신 API를 사용하는 이유:
- 시스템 호출은 하드웨어와 밀접하게 관련된 저수준 명령입니다. 프로그램 개발자가 이러한 명령을 직헙 사용하는 것은 번거롭고 실수할 가능성도 높습니다.
- API는 시스템 호출을 간편하게 사용할 수 있는 방법을 제공하며 구현 세부 사항을 숨겨 개발자의 부담을 줄여줍니다.
주요 프로그래밍 인터페이스:
- Win32, Win64 API (윈도우): 마이크로소프트 윈도우 운영 체제에서 사용되는 API입니다.
- POSIX API (포직스 기반 시스템): 리눅스, 유닉스, 맥 OS X 등 POSIX 호환 운영 체제에서 사용되는 표준 API입니다.
- Java API (자바 가상 머신): 자바 프로그래밍 언어에서 사용되는 API입니다. 자바 프로그램은 자바 가상 머신(JVM)에서 실행되며, 이 API를 통해 JVM과 상호 작용합니다.
파일의 내용을 다음 파일로 복사하는 시스템 호출 시퀀스는 다음과 같다.
- 시스템 호출 번호 및 시스템 호출 테이블
- 각 시스템 호출에는 고유한 식별자로서 일반적으로 숫자가 할당됩니다.
- 운영 체제는 커널 내부에 시스템 호출 테이블(SCT)을 유지 관리합니다. 이 테이블은 시스템 호출 번호를 기반으로 시스템 호출 핸들러 함수를 색인하는 역할을 합니다.
- 시스템 호출 인터페이스는 운영 체제 커널에서 의도된 시스템 호출을 호출하고 시스템 호출의 상태 및 반환 값 등을 반환합니다.
- 호출자는 시스템 호출이 어떻게 구현되어있는지에 대해 알 필요가 없습니다.
- 단지 API를 준수하고 호출 결과로 운영 체제가 무엇을 할 것인지를 이해하면 됩니다.
- 프로그래머에게 운영 체제 인터페이스의 대부분 세부 사항이 API에 의해 숨겨집니다.
- 시스템 호출 작동 방식
- 애플리케이션이 운영 체제 서비스를 필요로 할 때 특정 CPU 명령어 (시스템 호출 명령어)를 트리거합니다.
- 이 명령어는 트랩이나 예외를 발생시켜 제어를 애플리케이션에서 커널로 전환합니다.
- 커널은 애플리케이션에서 시스템 호출 번호를 검색합니다.
- 커널은 시스템 호출 번호를 사용하여 시스템 호출 테이블(SCT)을 색인합니다.
- 색인에 따라 커널은 커널 내부에 있는 적절한 시스템 호출 핸들러 함수를 찾습니다.
- 커널은 시스템 호출 핸들러 함수를 실행하여 요청된 작업을 수행합니다 (예: 파일 읽기, 메모리 할당).
❖ 시스템 호출 매개변수 전달 방식
시스템 호출을 이용하여 커널에 서비스를 요청할 때, 단순히 어떤 시스템 호출을 원하는지 나타내는 것 외에도 추가적인 정보가
필요한 경우가 많습니다. 전달되는 정보의 정확한 종류와 양은 운영 체제와 시스템 호출에 따라 다양하지만,
매개변수를 운영 체제에 전달하는 일반적인 방법은 세 가지가 있습니다.
1. 레지스터 전달(가장 간단한 방법)
- 가장 간단한 방법은 매개변수를 CPU 레지스터에 직접 저장하여 전달하는 것입니다.
- 이 방법은 빠르고 효율적이지만, 레지스터의 수가 제한되어 있기 때문에 전달할 수 있는 매개변수의 개수가 한정됩니다.
- 만약 시스템 호출에 필요한 매개변수의 개수가 레지스터의 개수를 초과하는 경우 다른 방법을 사용해야 합니다.
2.블록 또는 테이블 전달
- 두 번째 방법은 메모리 상의 특정 블록이나 테이블에 모든 매개변수를 저장하고, 그 블록 또는 테이블의 주소를 레지스터에 저장하여 전달하는 방식입니다.
- 리눅스와 솔라리스 운영 체제는 이러한 방법을 사용합니다.
- 이 방법을 사용하면 레지스터의 수 제한을 극복하고 더 많은 매개변수를 전달할 수 있습니다.
3.스택 전달
- 세 번째 방법은 프로그램에서 매개변수를 스택에 저장한 후 시스템 호출 명령을 실행하는 것입니다.
- 운영 체제는 시스템 호출 처리 과정에서 스택에서 매개변수를 가져옵니다.
- 이 방법은 블록 또는 테이블 전달과 마찬가지로 전달할 수 있는 매개변수의 개수나 길이에 제한이 없습니다.
시스템 호출은 크게 여섯 가지 종류로 분류할 수 있습니다. 각 종류는 운영 체제가 제공하는 서비스를 나타냅니다.
- 프로세스 제어 (Process control)
- 파일 관리 (File management)
- 장치 관리 (Device management)
- 정보 관리 (Information maintenance)
- 통신 (Communications)
- 보호 (Protection)
- 프로세스 생성, 종료
- 종료(end), 중지(abort)
- 로딩(load), 실행(execute)
- 프로세스 속성 가져오기, 설정하기
- 시간 대기
- 이벤트 대기, 이벤트 신호
- 메모리 할당 및 해제
- 에러 발생 시 메모리 덤프
- 버그 확인, 단일 단계 실행을 위한 디버거
- 프로세스 간 공유 데이터 접근 관리를 위한 락(lock)
- 파일 생성, 삭제
- 파일 열기, 닫기
- 읽기, 쓰기, 위치 변경
- 파일 속성 가져오기, 설정하기
- 장치 요청, 해제
- 읽기, 쓰기, 위치 변경
- 장치 속성 가져오기, 설정하기
- 논리적 장치 연결 또는 분리
- 시간 또는 날짜 가져오기, 설정하기
- 시스템 데이터 가져오기, 설정하기
- 프로세스, 파일, 또는 장치 속성 가져오기, 설정하기
- 통신 연결 생성, 삭제
- 메시지 전송, 수신 (메시지 전달 모델, 호스트 이름 또는 프로세스 이름 기반)
- 클라이언트에서 서버로
- 공유 메모리 모델: 메모리 영역 생성 및 액세스 권한 얻기
- 상태 정보 전송
- 원격 장치 연결 및 분리
- 리소스에 대한 액세스 제어
- 권한 가져오기, 설정하기
- 사용자 액세스 허용, 거부
❖ 시스템 서비스는 프로그램 개발 및 실행을 위한 편리한 환경을 제공합니다. 일부 시스템 서비스는 단순히 시스템 호출에 대한 사용자 인터페이스 역할을 하지만, 다른 서비스는 훨씬 더 복잡합니다. 시스템 서비스는 다음과 같은 범주로 분류할 수 있습니다.
• 파일 조작
• 상태 정보(때때로 파일에 저장된다)
• 프로그래밍 언어 지원
• 프로그램 로딩 및 실행
• 통신
• 애플리케이션 프로그램
❖ 사용자 관점에서 운영 체제는 실제 시스템 호출보다는 시스템 프로그램에 의해 더 많이 정의됩니다. 시스템 호출은 운영 체제의 기본 서비스지만 일반적으로 이러한 호출과 직접 상호작용하지 않습니다. 대신 시스템 프로그램은 이러한 시스템 호출을 사용하여 사용자에게 친숙한 방식을 더 높은 수준의 서비스를 제공합니다.
❖ 파일 관리
• 파일 및 디렉터리 만들기, 삭제, 복사, 이름 바꾸기, 인쇄, 덤프, 목록 표시 등과 같이 파일 시스템을 일반적으로 조작하는 기능을 제공
❖ 상태 정보
- 시스템 정보 요청:
- 날짜, 시간, 사용 가능한 메모리 양, 디스크 공간, 사용자 수 등 시스템 상태에 대한 일반적인 정보를 제공합니다.
- 세부 성능, 로깅, 디버깅 정보 제공:
- 시스템 상태를 보다 상세하게 제공하는 프로그램도 있습니다. 이러한 프로그램은 일반적으로 출력을 터미널이나 다른 출력 장치로 포맷팅하여 출력합니다.
- 레지스트리: 일부 시스템은 레지스트리를 구현하여 구성 정보를 저장하고 검색합니다.
❖ 파일 수정
• 텍스트 편집기: 파일 만들기 및 수정을 위한 도구입니다.
• 파일 내용 검색 또는 텍스트 변환을 위한 특수 명령: 텍스트 파일의 내용을 검색하거나 변환하는 데 사용되는 특수 명령들입니다.
❖ 프로그래밍 언어 지원
• 컴파일러, 어셈블러, 디버거, 인터프리터: 일부 시스템에서 프로그래밍 언어를 지원하는 도구를 제공합니다.
❖ 프로그램 로딩 및 실행
• 절대 로더, 재배치 로더, 오버레이 로더, 고급 언어 및 머신 언어 디버깅 시스템: 프로그램을 메모리에 로딩하고 실행하는 데 필요한 도구들입니다.
❖ 통신
• 프로세스, 사용자 및 컴퓨터 시스템 간에 가상 연결을 만드는 메커니즘을 제공합니다.
• 사용자 간 메시지 전송, 웹 페이지 탐색, 전자 메일 보내기, 원격 로그인, 컴퓨터 간 파일 전송 등을 지원합니다.
❖ 애플리케이션 프로그램
• 시스템에 직접 관련되지 않은 사용자가 실행하는 프로그램입니다.
• 운영 체제의 일부로 간주되지 않습니다.
• 명령줄, 마우스 클릭, 터치 등을 통해 실행됩니다.
❖ 주요 내용 정리:
- 시스템 서비스는 파일 관리, 상태 정보 제공, 파일 수정, 프로그래밍 언어 지원, 프로그램 로딩 및 실행, 통신 등과 같은 다양한 기능을 제공합니다.
- 이러한 서비스는 사용자에게 친숙한 방식으로 시스템 기능에 쉽게 접근할 수 있도록 도와주는 시스템 프로그램을 통해 일반적으로 투명하게 처리됩니다.
- 애플리케이션 프로그램은 시스템 서비스와는 별개로 사용자가 직접 실행하는 별도의 프로그램 카테고리입니다.
❖ 소스 코드는 어떤 물리적 메모리 위치에도 로드될 수 있도록 설계된 오브젝트 파일로 컴파일 된다. - Relocatable Object File
❖ 링커는 이러한 파일들을 하나의 이진 실행 파일로 결합한다.
• 또한 라이브러리를 가져온다.
❖ 프로그램은 바이너리 실행 파일로 보조 저장 장치에 상주한다.
❖ 실행되기 위해 로더에 의해 메모리로 가져와야 한다.
• 재배치(링킹 및 로딩)는 프로그램 부분에 최종 주소를 할당하고 프로그램의 코드와 데이터를 해당 주소와 일치하도록 조정한다.
❖ 오브젝트 및 실행 파일에는 표준 형식이 있으므로 운영 체제가 이를 로드하고 시작하는 방법을 알고 있음
❖ 운영 체제의 설계와 구현은 "해결 가능한" 문제가 아니지만, 일부 접근 방법이 성공적으로 입증되었습니다.
❖ 다양한 운영 체제의 내부 구조는 크게 다를 수 있습니다.
❖ 설계를 시작할 때 목표와 명세를 정의함으로써 시작합니다.
• 하드웨어 선택, 시스템 유형에 따라 영향을 받음
❖ 사용자 목표 및 시스템 목표
• 사용자 목표: 운영 체제는 사용하기 편리하고, 학습하기 쉽고, 신뢰할 수 있으며, 안전하고, 빠르게 작동해야 함
• 시스템 목표: 운영 체제는 설계, 구현 및 유지 관리하기 쉽고, 유연하면, 신뢰성 있으며, 오류가 없으며, 효율적이어야 한다.
❖ 세분화하는 것에 있어 중요한 원칙
정책(Policy): 무엇을 할 것인가?
메카니즘(Mechanism): 어떻게 할 것인가?
❖ 메카니즘은 어떤 일을 하는 방법을 결정하고, 정책은 무엇을 할 것인가를 결정한다.
• 정책과 매커니즘의 분리는 매우 중요한 원칙이며, 정책 결정이 나중에 변경될 경우 최대한의 유연성을 제공한다.
❖ 운영 체제의 명시 및 설계는 소프트웨어 엔지니어링의 매우 창조적인 작업이다.
❖ 구현: 최근에는 다양한 언어로 작성된다.
❖ 다양한 변형이 있음
• 초기 운영 체제는 어셈블리어로 작성됨
• 그 후 Algol, PL/1과 같은 시스템 프로그래밍 언어 사용
• 현재는 C, C++ 등이 주로 사용됨
❖ 실제로는 보통 언어의 혼합 사용
• 최하위 수준은 어셈블리어
• 주된 부분은 C 언어
• 시스템 프로그램은 C, C++로 작성되거나 PERL, Python, 쉘 스크립트와 같은 스크립팅 언어로 작성됨
❖ 보다 고수준의 언어는 다른 하드웨어로 이식하기가 더 쉽지만, 실행이 느릴 수 있음
❖ 에뮬레이션은 원래 하드웨어가 아닌 하드웨어에서 운영 체제를 실행할 수 있게 함
❖ 일반 목적의 운영 체제는 매우 큰 프로그램임
❖ 다양한 방법으로 구조화될 수 있음
• 모놀리식 구조 - 단순한 구조 (MS-DOS), 더 복잡한 (UNIX)
• 계층 구조
• 마이크로 커널 - Mach
• 모듈식 커널
❖ UNIX - 초기 UNIX 운영 체제는 하드웨어 기능에 제한을 받아 구조화가 제한되어 있었습니다.
UNIX OS는 두 가지 분리 가능한 부분으로 구성됩니다.
- 시스템 프로그램
- 커널
- 시스템 호출 인터페이스 아래, 물리적 하드웨어 위에 있는 모든 것으로 구성됩니다.
- 파일 시스템, CPU 스케줄링, 메모리 관리 및 기타 운영 체제 기능을 제공하며, 하나의 수준에 대해 많은 기능을 제공합니다.
Layered structure
❖ 운영 체제는 여러 개의 레이어(수준)로 나누어지며, 각 레이어는 하위 레이어 위에 구축됩니다.
최하위 레이어(레이어 0)는 하드웨어이고, 최상위 레이어(N 레이어)는 사용자 인터페이스입니다.
❖ 모듈성을 갖추고 있어 각 레이어가 하위 레이어의 기능(연산)과 서비스만 사용하도록 선택됩니다.
❖ 장점: 구축 및 디버깅의 단순성
❖ 사용 사례: 컴퓨터 네트워크, 웹 애플리케이션
Microkernels
❖ 커널을 가능한 가볍게 만듭니다.
• 커널에서 "사용자" 공간으로 많은 부분을 이동시킵니다.
• 사용자 모듈 간에 메시지 전달을 사용하여 통신이 이루어집니다.
• Carnegie Mellon 대학의 Mach OS가 이 방식을 채택했습니다.
❖ 장점:
• 마이크로커널을 확장하기가 더 쉬움
• 새로운 아키텍처로 운영 체제를 이식하기가 더 쉬움
• 더 신뢰할 수 있음 (더 적은 코드가 커널 모드에서 실행됨)
• 보안이 더 강화됨
❖ 단점:
• 사용자 공간에서 커널 공간으로의 통신에 대한 성능 오버헤드; 두 사용자 수준 서비스가 통신할 때 메시지가 다른 주소로 복사됨
Modular Kernel Structure
❖ 많은 현대 운영 체제에서는 로드 가능한 커널 모듈(LKM)을 구현합니다. 커널에는 핵심 구성 요소 집합이 있으며 부팅 시간이나
실행 시간 중에 추가 서비스와 동적으로 연결됩니다.
• 객체 지향적 접근 방식 사용
• 각 핵심 구성 요소는 별도로 구성됨
• 각 구성 요소는 알려진 인터페이스를 통해 다른 구성 요소와 통신함
• 필요할 때마다 커널 내에서 로드 가능함
❖ 전체적으로는 계층과 유사하지만 더 유연함
❖ 모듈형 커널 접근 방식은 계층 구조 방식과 유사합니다.
• 모듈형 커널 접근 방식은 서브시스템이 서로 상호 작용할 수 있도록 carefully constructed 인터페이스를 통해 동작합니다.
❖ 그러나, 모듈형 커널 접근 방식은 계층 구조 방식과 다릅니다.
• 계층적 커널은 하위 레이어의 서브시스템이 상위 레이어의 연산을 호출할 수 없도록 엄격한 순서를 부여합니다.
• 모듈형 커널 접근 방식에서는 이러한 제약이 없으며, 모듈은 제한 없이 서로 호출할 수 있습니다.