운영체제 서비스 (Operating System Services)
운영체제는 사용자에게 다음과 같은 서비스를 제공
- 사용자 인터페이스(User Interface)
- 명령어 인터페이스 (CLI), 그래픽 사용자 인터페이스 (GUI)
- 프로그램 실행(Program execution)
- 프로그램을 메모리에 로드, 실행, 종료
- I/O 작업(I/O operation)
- 키보드/마우스 입력, 모니터/프린터 출력
- 파일 시스템 조작(File system manipulation)
- 파일 또는 디렉토리 읽기/쓰기, 생성/삭제/검색 등
- 통신(Communications)
- 프로세스 간 정보 교환
- 오류 검출(Error detection)
- 하드웨어 (메모리 오류, power failure)
- I/O 장치 (네트워크 연결 실패, 프린터 용지 부족)
- 사용자 프로그램 (산술 오버플로우, 불법 메모리 접근)
시스템 자체의 효율적인 운영을 위한 운영체제 기능
- 자원 할당(Resource allocation)
- 다중 사용자(multi-users) 또는 다중 작업(multi-tasking)을 위한
- CPU 사이클, 메모리, 파일 저장소, I/O 장치
- Accounting
- 어떤 사용자가 얼마나 많은 자원을 사용하는지
- 보호 및 보안(Protection and security)
- 보호(Protection)
- 시스템 자원(system resource) 접근 제어
- 보안(security)
- 사용자 인증(user authentication)
- 잘못된 접근 시도로부터 방어
- 보호(Protection)
운영체제 사용자 인터페이스 (Operating System User Interface)
명령어 인터페이스 (CLI)
- 키보드 기반 인터페이스
- 쉘
- 사용자로부터 명령을 가져와 실행
- 명령 해석기(command interpreter)라고도 함
- 예: bash, csh 등
- 명령어 구현
- 쉘 내의 내장 명령어
- 예: cd, alias 등
- 별도 프로그램
- 예: ls, vi 등
- 쉘 내의 내장 명령어
- 사용자는 명령어를 암기해야 함
그래픽 사용자 인터페이스 (GUI)
- 마우스 기반 인터페이스
- 사용자 친화적인 인터페이스 제공
- 창 및 메뉴 시스템
- 아이콘이 파일, 프로그램, 동작 등을 나타냄
CLI vs. GUI
- 선택은 개인 취향에 따라 다름
- 현대 운영체제는 두 인터페이스를 모두 제공
- Microsoft Windows
- Apple Mac OS X
- Solaris
- Linux
System Calls
System call
- 운영체제에서 제공하는 인터페이스
- 프로그램이 운영체제로부터 서비스를 요청하는 방법
- 예: 하드 디스크 접근
- 예: 새로운 프로세스 생성 및 실행
- 프로세스와 운영체제 간의 중요한 인터페이스 제공
- 일반적으로 고급 언어(C 또는 C++)로 작성됨
ex) 한 파일의 내용을 다른 파일로 복사
- input 파일 이름 획득
- 화면에 프롬프트 작성
- input 수락
- output 파일 이름 획득
- 화면에 프롬프트 작성
- input 수락
- input 파일 열기
- 파일이 존재하지 않으면 중단
- output 파일 생성
- 파일이 존재하면 중단
- 루프
- input 파일에서 읽기
- output 파일에 쓰기
- 읽기 실패 시까지 반복
- output 파일 닫기
- 화면에 완료 메시지 작성
- 정상 종료
API (Application Program Interface)
- 애플리케이션 프로그램 인터페이스 (API)
- 애플리케이션 프로그래머에게 제공되는 함수 집합
- 세 가지 주요 API
- Windows용 Win32 API
- POSIX 기반 시스템(UNIX/Linux)용 POSIX API
- Java 가상 머신용 Java API
- System call 대신 API를 사용하는 이유?
- 이식성(Portability)
- 사용 용이성(Easy to use)
- 프로그래머는 system call 구현을 알 필요가 없음
- API를 따르고 운영체제가 무엇을 할지 이해하기만 하면 됨
- 운영체제의 세부 사항은 API에 의해 프로그래머로부터 숨겨짐
시스템 호출 vs. API
System call handling
ex) fork() 시스템 콜 호출 (i386-linux system)
System Call Parameter Passing(System Call 매개변수 전달)
System Call identification보다 더 많은 정보가 종종 필요합니다.
- 예: open("/etc/passwd", O_RDONLY);
- 예: read(3, buf, 4096);
- OS와 시스템 호출에 따라 정보의 유형과 양이 다릅니다.
OS에 매개변수를 전달하는 세 가지 방법
- 레지스터(register)에 매개변수를 전달합니다.
- 매개변수를 메모리의 테이블에 저장한 다음 레지스터에 테이블 주소를 전달합니다.
- 예: 리눅스와 솔라리스(Linux and Solaris)
- 프로그램이 매개변수를 스택(stack)에 푸시(push)하고 OS가 스택에서 팝(pop)합니다.
매개변수를 테이블을 통해서 전달
Types of System Calls
- 프로세스 제어 (Process control)
- 생성/종료, 로드/실행, 대기/신호 이벤트
- 예: fork(), execve(), getpid(), signal(), ...
- 파일 관리 (File management)
- 생성/삭제, 열기/닫기, 읽기/쓰기
- 예: open(), read(), write(), close(), ...
- 메모리 관리 (Memory management)
- 메모리 할당
- 예: brk(), ...
- 정보 유지 (Information maintenance)
- 타이머 또는 날짜 설정/획득, 프로세스, 파일, 또는 장치 속성 설정/획득
- 예: time()
- 통신 (Communications)
- 연결 생성/삭제, 메시지 송수신
- 예: socket(), bind(), connect(), ...
Operating System Design and Implementation(운영 체제 설계 및 구현)
설계 목표 (Design goals)
- 하드웨어와 시스템 유형 선택
- batch, time sharing, 단일/다중 사용자, 분산, real-time
- 요구 사항
- 사용자 관점
- 사용하기 편리하고, 쉽고, 신뢰할 수 있으며, 안전하고, 빠름
- 시스템 관점
- 설계, 구현 및 유지 관리가 쉬움
- 유연하고, 신뢰할 수 있으며, 오류가 없고, 효율적임
- 사용자 관점
정책(policy)과 메커니즘(mechanism)의 분리
- 메커니즘 (Mechanism): 어떻게 할 것인가?
- CPU 보호를 위한 타이머 구성
- 세금을 통한 사회 갈등 해소
- 정책 (Policy): 무엇을 할 것인가?
- 타이머를 얼마나 오랫동안 설정해야 하는지?
- 빈민층에 세금 감면, 고소득자에게 특별세금 부과
- 또 다른 예
- 특정 프로그램 유형에 우선순위(priority)를 부여하는 메커니즘
- I/O 집약적인 프로세스(I/O intensive process)가 CPU 집약적인 프로세스(CPU Intensive process)보다 우선 순위가 높은 정책
구현 (Implementation)
- 초기에는 어셈블리 언어로 작성되었습니다.
- MS-DOS -> 인텔 8088 어셈블리 언어
- 현재는 C, C++와 같은 고급 언어로 작성됩니다.
- 리눅스, 윈도우
- 속도 감소, 큰 저장 공간 요구, 작성하기 쉬움, 높은 이식성
- 운영 체제의 성능
- 어셈블리 언어 구현보다 자료 구조와 알고리즘이 중요합니다.
- 메모리 관리, CPU 스케줄링 등
- 어셈블리 언어 구현보다 자료 구조와 알고리즘이 중요합니다.
Operating System Structures
단순 구조 (Simple structure)
- Interface와 levels of functionality가 잘 분리되지 않았음
- 애플리케이션이 I/O 루틴에 직접 접근할 수 있음
- 애플리케이션 실패 시 시스템 전체가 충돌할 수 있음
- 예: MS-DOS, 초기 유닉스
계층 구조 (Layered structure)
- OS는 여러 Layer로 나뉩니다.
- 가장 낮은 layer (layer 0)는 하드웨어입니다.
- 가장 높은 layer (layer N-1)는 사용자 인터페이스입니다.
- 디버깅이 쉽지만 Layer 정의가 어렵고 비효율적입니다.
마이크로커널 구조 (Microkernel structure)
- 커널에서 "사용자" 공간으로 가능한 많은 것을 이동합니다.
- 사용자 모듈 간 메시지 전달을 통한 통신
- 예: 파일 서버를 통한 파일 접근
- 확장 및 포팅이 쉬움
- 신뢰할 수 있고 보안이 높음 (커널 모드에서 실행되는 코드가 적음)
- 성능 저하
- 사용자 모듈과 커널 간의 빈번한 통신 때문이다.
- 예: Mach, QNX, Windows NT
모듈 구조 (Module structure)
- 대부분의 현대 운영 체제는 커널을 모듈로 구현합니다.
- 객체 지향 접근 방식을 사용합니다.
- 각 핵심 구성 요소는 분리되어 있습니다.
- 각 구성 요소는 알려진 인터페이스를 통해 서로 통신합니다.
- 필요에 따라 커널에 로드됩니다.
- 예: 솔라리스, 리눅스, 맥 OS X
시스템 부팅(System boot)
- 커널을 어떻게 로드하나요?
- 부트로더(Bootloader)
- 진단 실행, 시스템 초기화.
- 커널을 찾아 메모리에 로드하고 시작합니다.
- Small system
- 부트로더와 운영 체제를 ROM에 저장합니다.
- Large system (예: PC)
- 부트로더를 ROM에, 운영 체제를 디스크에 각각 저장합니다.
- boot block에 간단한 bootloader ➔ 복잡한 bootloader ➔ kernel
- 부트로더(Bootloader)
System Boot in Linux
- 리눅스 기반 PC 부팅 과정
'Computer Science > 운영체제' 카테고리의 다른 글
[운영체제] 06. Synchronization Tools (0) | 2024.06.19 |
---|---|
[운영체제] 05. CPU Scheduling (0) | 2024.06.19 |
[운영체제] 04. Threads & Concurrency (0) | 2024.06.18 |
[운영체제] 03. Process (0) | 2024.06.18 |
[운영체제] 01. Introduction to Operating System (0) | 2024.06.18 |