운영체제 서비스
운영 체제가 사용자에게 제공하는 서비스
- 유저 인터페이스
명령줄 인터페이스(CLI), 그래픽 사용자 인터페이스(GUI) - 프로그램 실행
프로그램을 메모리에 로드하고 실행 후 종료 - I/O 작업
키보드/마우스 입력, 모니터/프린터 출력 - 파일 시스템 조작
파일 또는 디렉터리 읽기/쓰기, 파일 만들기/삭제/검색 등을 수행 - 통신
프로세스 간에 정보를 교환 - 오류탐지
하드웨어(메모리 오류, 전원 장애)
I/O 장치(네트워크 연결 오류, 프린터에 용지 부족)
사용자 프로그램(산술 오버플로, 잘못된 메모리 액세스)
시스템 자체의 효율적인 운영을 위한 OS 기능
- 자원 할당(Resource allocation)
다중 사용자 또는 다중 작업의 경우
CPU 주기, 메모리, 파일 스토리지 및 I/O 장치 - 회계(Accounting)
사용자가 사용하는 리소스의 양과 종류. - 보호 및 보안(Protection and security)
보호 : 시스템 리소스에 대한 액세스 제어
보안 : 사용자 인증, 잘못된 액세스 시도로부터 방어
운영 체제 사용자 인터페이스
명령줄 인터페이스(CLI)
- 키보드 기반 인터페이스
- Shells
사용자로부터 명령을 가져와 실행
명령 인터프리터로 호출
예) bash, csh 등 - 명령 구현
셸 내에 내장된 명령 : 예) cd, alias 등
별도 프로그램 : 예) ls, vi 등 - 사용자는 명령을 기억해야 한다.
그래픽 사용자 인터페이스(GUI)
- 마우스 기반 인터페이스
- 사용자 친화적인 인터페이스.
창, 메뉴 시스템, 아이콘(파일, 프로그램, 작업 등)
CLI vs GUI
- 개인의 취향
- 최신 OS는 두 가지 인터페이스를 모두 제공
마이크로소프트 윈도우
애플 맥 OS X
솔라리스
리눅스
시스템 콜
시스템 콜
- OS에서 제공하는 인터페이스
- 프로그램이 운영 체제에서 서비스를 요청하는 방법.
예) 하드 디스크 액세스
예) 새 프로세스 생성 및 실행 - 프로세스와 운영 체제 간에 필수적인 인터페이스를 제공한다.
- 일반적으로 고급 언어(C 또는 C++)로 작성된다.
예) 한 파일의 내용을 다른 파일에 복사
Acquire input file name write prompt to screen ← accept input ← Acquire output file name write prompt to screen ← accept input ← Open the input file ← if file doesn’t exist, abort ← Create the output file ← if file exists, abort ← Loop read from input file ← write to output file ← Until read fails Close output file ← Write completion message to screen ← Terminate normally ← |
API
응용 프로그램 인터페이스(Application Program Interface; API)
- 응용 프로그램 프로그래머가 사용할 수 있는 기능 집합
- 가장 일반적인 세 가지 API
Windows용 Win32 API
POSIX 기반 시스템(UNIX/Linux)용 POSIX API
Java 가상 시스템의 Java API - 시스템 콜 대신 API를 사용하는 이유
휴대성(Portability)
사용하기 편리
프로그래머는 시스템 콜 구현을 알 필요가 없다.
- API를 준수하고 OS가 무엇을 할 것인지 이해하면 된다.
- OS에 대한 자세한 내용은 API에 의해 프로그래머에게 숨겨진다.
System call vs. API
System call handling
- fork() 시스템 콜 호출(i386-linux 시스템)
시스템 콜 매개 변수 전달
시스템 콜 식별보다 더 많은 정보가 필요한 경우가 많다
- 예) open ("/etc/passwd", O_RDONLY);
open은 정보 두개가 필요 - 예) read (3, buf, 4096);
read는 정보 세개가 필요 - 정보의 종류와 양은 OS와 시스템 콜에 따라 다르다.
OS에 매개 변수를 전달하는 세 가지 방법
- 레지스터에 매개 변수를 전달
- 메모리 테이블에 파라미터를 저장한 다음 레지스터에 테이블 주소를 전달
예) Linux, Solaris - 프로그램으로부터 매개 변수를 스택에 push하고 OS으로부터 스택에서 pop off
테이블을 통해 매개 변수 전달
시스템 콜 유형
프로세스 관리
- 생성/실행, 로드/실행, 대기/신호 이벤트
- 예) fork(), execve(), getpid(), signal()
파일 관리
- create/delete, open/close, read/write
- 예) open(), read(), write() close()
메모리 관리
- 메모리 할당
- 예) brk()
정보 유지
- get/set timer or date, get/set process, file, or device attributes
- 예) time()
통신
- create/delete connection, send/receive message
- 예) socket(), bind(), connect(), …
운영 체제 설계 및 구현
설계 목표
- 하드웨어 및 시스템 유형 선택
batch, time sharing, 단일/다중 사용자, 분산, real-time - 요구 사항들
사용자 뷰 : 사용하기 편리하고, 쉽고, 신뢰할 수 있고, 안전하고, 빠르다.
시스템 뷰 : 설계, 구현, 유지보수가 용이 / 유연성, 안정성, 오류 없음, 효율성
정책과 메커니즘의 분리
- 메커니즘(mechanism): 어떻게 할 수 있을까?
CPU 보호를 위한 타이머 구성
예) 세금을 통한 사회갈등 해소 - 정책(policy): 무엇을 해야 할까?
타이머는 얼마나 설정해야 하나?
예) 빈민층에 세금감면(-30%), 고소득자에 특별세금 부과(+30%) - 또 다른 예
특정 유형의 프로그램에 우선 순위를 부여하는 메커니즘
I/O 집약적 프로세스가 CPU 집약적 프로세스보다 우선 순위가 높다.
실행
- 초기에는 어셈블리어로 작성
MS-DOS → Intel 8088 어셈블리어 - 이제 C, C++와 같은 고급 언어로 작성
리눅스, 윈도우
속도 저하, 대용량 스토리지 요구사항 감소
쓰기 쉽고 휴대성이 높음 - OS의 성능
어셈블리어 구현보다는 데이터 구조와 알고리즘이 중요
메모리 관리, CPU 스케줄링 등
운영 체제 구조
단순구조
- 인터페이스와 기능 수준이 잘 구분되어 있지 않다.
- 애플리케이션은 I/O 루틴에 직접 액세스할 수 있다.
- 응용 프로그램이 실패할 경우 전체 시스템 충돌이 발생할 수 있다.
- 예) MS-DOS, 초기 UNIX
계층 구조
- 여러 계층(레벨)
- 맨 아래 계층(계층 0)은 하드웨어
- 가장 높은 계층(계층 N-1)은 사용자 인터페이스
- 디버깅하기는 쉽지만 계층을 정의하기는 어렵고 효율적이지 않다.
마이크로커널 구조
- 커널에서 "사용자" 공간으로 이동
- 메시지 전달이 있는 사용자 모듈 간의 통신
예) 파일 서버를 통한 파일 액세스 - 확장과 이식이 용이하다.
- 신뢰할 수 있고 안전하다.(커널 모드에서 실행되는 코드 수 감소)
- 성능 저하 : 사용자 모듈과 커널 간의 빈번한 통신 때문에
- 예) Mach, QNX, Window NT
모듈 구조
- 대부분의 현대 운영 체제는 커널을 모듈로 구현한다.
- 객체 지향 접근법
- 각 핵심 구성요소는 별도
- 각각은 알려진 인터페이스를 통해 다른 사용자와 대화
- 각각은 필요에 따라 커널에 로드
- 예) Solaris, Linux, Mac OS X
시스템 부팅
커널 로드 방법
- 부트로더(Bootloader) : 진단을 실행하고 시스템을 초기화
커널을 찾아 메모리에 로드한 다음 시작 - 소형 시스템 : 부트로더 및 OS를 ROM에 저장
- 대형 시스템(예: PC) : 부트로더는 ROM에, OS는 디스크에 각각 저장
부트 블록의 단순 부트로더 → 복잡한 부트로더 → 커널
Linux의 시스템 부팅
Linux 기반 PC의 시스템 부팅
- BIOS 실행
- 부트로더 실행(커널 적재)
- 커널 실행
- 루트 파일시스템 마운트 : 커널이 init, daemon, shell 등을 로딩
요약
- 마이크로소프트 윈도우, 애플 맥 OS, 리눅스와 같은 현대 운영 체제는 CLI(명령줄 인터페이스)와 GUI(그래픽 사용자 인터페이스)를 모두 제공한다.
- 시스템 콜은 프로세스와 운영 체제 간의 인터페이스이며 프로세스가 운영 체제에서 서비스를 요청하는 방법을 제공합니다.
- 애플리케이션 프로그래머는 시스템 콜보다 API를 사용하는 방법을 이해해야 한다.
- 현대의 운영 체제는 C나 C++와 같은 고급 언어로 작성된다.
'운영체제' 카테고리의 다른 글
[OS] 동기화 도구 (0) | 2023.04.03 |
---|---|
[OS] CPU 스케줄링 (0) | 2023.03.27 |
[OS] 쓰레드와 프로세스 (0) | 2023.03.20 |
[OS] 프로세스 (0) | 2023.03.13 |
[OS] 정의, 구조, 작업, 구성 요소 (0) | 2023.03.06 |