Operating System Services
📌운영체제 서비스
1. 사용자 인터페이스
2. 프로그램 실행
3. 입출력 연산
4. 파일 시스템 조작
5. 통신
6. 오류 탐지
7. 자원 할당
8. 회계
9. 보호, 보안
통신 (추가적으로)
한 프로세스가 다른 프로세스와 정보를 교환해야할 필요가 있을 때 , 이러한 통신을 실행하기 위해 두 가지 방법을 사용한다
1. 동일한 컴퓨터에서 실행되고 있는 프로세스들 사이에서 일어난다
2. 컴퓨터 네이트워크에 의해 함께 묶여 있는 서로 다른 컴퓨터시스템 상에서 실행되는 프로세스들 사이에서 일어난다
통신은 공유 메모리를 통해서 구현될 수도 있고 메세지 전달 기법에 의해서 구현될 수도 있다
(메세지 전달 기법의 경우 정보의 패킷들이 운영체제에 의해 프로세스들 사이를 이동한다)
사용자의 편의를 제공하기 위해 사용자 인터페이스 제공
유저 인터페이스 (User Interface)
- Command-Line Interface (CLI)
- Graphical User Interface (GUI)
OS 서비스는 시스템 자체의 효율적인 운영을 위해 기능을 제공한다
OS User Interface - CLI
CLI를 통해 직접 명령 입력 가능
- 사용자로부터 명령을 가져와 실행한다
CLI 구현
때때로 커널에 명령이 내장되어있다
- 새로운 기능을 추가하려면 CLI 수정이 필요하다
때로는 시스템 프로그램의 이름만 있는 경우도 있다
- 다양한 CLI( shell 이라고 함)
- CLI가 명령을 인식하지 못함
- 새 기능을 추가하는 데 CLI가 필요하지 않음
* 새로운 명령어를 추가하려면 새로운 운영체제로 바꿔야한다 (CLI에서 명령어 추가 불가능)
OS User Interface - GUI
사용자 친화적인 인터페이스
- Xerox Palo Alto Research Center에서 발명
- 일반적으로 마우스, 키보드 및 모니터
- 아이콘은 파일, 프로그램, 디렉토리 등을 나타낸다
- 개체 위의 다양한 마우스 버튼은 다양한 작업을 한다
OS User Interface – CLI & GUI
오늘날 많은 시스템에 CLI와 GUI 인터페이스가 포함되어있다.
- 마이크로소프트 윈도우 -> CLI cmd가 있는 GUI
- Apple Mac OS X -> UNIX와 Aqua GUI가 있다
- 유닉스와 리눅스에는 선택적 GUI가 있는 CLI가 있다 -> KDE, 그놈 데스크탑 등
📌인터페이스: 서로 다른 두 시스템을 연결해주는 것 , 커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할
OS Programming Interface - System Calls
💡System calls (중요)
- 운영체제가 응용프로그램에게 운영체제의 기능을 제공하기 위한 수단
- 운영체제가 제공하는 서비스에 대한 인터페이스를 제공한다
- 운영체제와 응용프로그램 간의 상호작용을 위한 프로그래밍 인터페이스
- 대부분 high-level 응용 프로그래밍 인터페이스(API)를 통해서 프로그램에 접근한다. (시스템 콜을 직접적으로 하기 보다)
- 모든 응용프로그램은 System call를 꼭 사용한다
API(Application Programming Interface)
- 각 함수에 전달되어야 할 매개변수들과 프로그래머가 기대할 수 있는 반환 값을 포함하여 응용 프로그래머가 사용 가능한 함수의 집합을 명시한다
- 하드웨어나 운영체제와 관계없이 응용프로그램에게 서비스 및 기능 제공-> 소스의 호환성 제공
- Win32, POSIX API, JAVA API 가장 일반적인 API 3가지
- 소프트웨어 애플리케이션이 서로 통신하여 데이터, 특징 및 기능을 교환할 수 있도록 하는 일련의 규칙 또는 프로토콜
대부분의 응용 개발자들은 API에 따라 프로그램을 설계한다
대부분의 POSIX와 Wind32 API는 UNIX, Linux 및 Windows 운영체제가 제공하는 고유의 시스템 호출과 유사
System Call Implementation
일반적으로 시스템 콜은 숫자와 연결된다
- 시스템 콜 인터페이스는 숫자에 따라 인덱스 된 테이블을 유지 관리한다.
- 시스템 호출 인터페이스는 운영 체제 커널에서 의도한 시스템 호출을 호출하고, 시스템 호출의 상태와 기타 반환 값들을 반환한다.
호출자는 시스템 콜이 어떻게 구현되는 지에 대해 알 필요가 없다
- 단지 API를 준수하고 시스템 콜의 결과로 OS가 수행할 작업을 이해하면 된다.
표준 C 라이블러리 예시
표준 C 라이브러리는 많은 버전의 UNIX와 linux를 위한 시스템 콜 인터페이스를 제공한다
- C 프로그램에서 printf() 함수를 호출하고, 이 printf() 함수는 내부적으로 라이브러리 함수인 write() 시스템 콜을 호출한다
-> 라이브러리가 화면에 출력하기 위해 시스템 콜을 함
📌 라이브러리와 API 차이점
라이브러리
특정 기능을 수행하기 위해 미리 작성된 코드의 집합
API
API는 애플리케이션 간의 상호 작용을 가능하게 하는 인터페이스
서로 다른 소프트웨어 시스템이 통신할 수 있도록 정의된 규칙과 프로토콜
Types of System Calls
시스템 콜 유형
프로그램에서 운영체제의 기능을 이용하기 위해서 사용한다
운영체제는 프로세스 메모리 파일시스템 등을 관리한다
프로세스 제어 (Process Control)
- 프로세스 생성 및 종료
- 끝내기 (end), 중지(abort)
- 적재(load), 실행(execute)
- 프로세스 속성 획득, 설정
- 메모리 할당 및 반납
- 이벤트 대기 및 신호 전달
📌프로세스란?
실행 중인 프로그램( 시스템 내 작업 단위)
여러가지 자원( cpu,메모리,I/O장치, 파일 등 )들을 필요로 함 쓰다가 운영체제로 반납
프로세스 종료 시 리소스 해제
파일 관리
- 파일 생성 및 삭제
- 파일 열기, 닫기, 읽기, 쓰기, 위치 변경
- 파일 속성 획득 및 설정
장치 관리
- 장치 요청 및 방출
- 읽기, 쓰기, 위치 변경
- 장치 속성 획득 및 설정
- 장치의 논리적 부착 또는 분리
정보 유지 관리
- 날짜와 시간을 설정과 획득
- 시스템 데이터 설정과 획득
- 프로세스, 파일 , 장치 속성의 획득 및 설정
통신
- 통신 연결 생성 및 삭제
- 메시지 전송 및 수신
- 상태 정보 전달
- 원격 장치의 부착 및 분리
통신 모델엔 메세지 전달과 공유 메모리의 두가지 일반적인 모델이 있다
메세지 전달 모델에서는 통신하는 두 프로세스가 정보를 교환하기 위해 서로 메세지를 주고 받는다
통신이 이루어지기 전에 연결이 반드시 열려야한다
read message와 write message 시스템 콜에 의해 메세지를 교환한다
공유 메모리 모델에선 프로세스는 다른 프로세스가 소유한 메모리 영역을 생성하고 접근하기 위해 시스템 콜을 사용한다
프로세스들은 이러한 공유 영역에서 데이터를 읽고 씀으로써 정보를 교환할 수 있다
System Programs
시스템 프로그램이란?
운영 체제(OS)에서 제공되며 다양한 기능과 서비스를 제공한다. 이러한 프로그램은 사용자 및 응용 프로그램에 대한 편리한 환경을 제공한다
- 파일 조작: 파일 생성, 복사, 이동, 삭제, 이름 변경 및 디렉터리 조작과 같은 파일 및 디렉터리 관리 작업을 수행하는 도구를 제공한다
- 파일 수정: 파일 내용을 편집하고 변경할 수 있는 편집기 또는 텍스트 편집 프로그램을 포함한다.
- 상태 정보: 시스템 및 하드웨어 정보, 네트워크 연결 상태, 프로세스 상태 및 리소스 사용량 등의 시스템 상태 정보를 확인하는 도구를 제공한다
- 프로그래밍 언어 지원: 다양한 프로그래밍 언어를 지원하는 컴파일러, 디버거, 개발 환경 및 런타임 라이브러리를 제공하여 개발자가 소프트웨어를 개발하고 실행하는 데 도움을 준다
- 프로그램 로딩 및 실행: 프로그램을 메모리에 로드하고 실행하는 데 필요한 도구 및 서비스를 제공한다.
- 통신: 네트워크 통신을 지원하는 도구 및 서비스를 포함한다. 이로써 컴퓨터 및 응용 프로그램 간에 데이터를 교환하고 통신할 수 있다
응용 프로그램
일반 사용자 및 응용 프로그램 개발자를 위해 유용한 응용 프로그램을 제공한다. 예를 들어, 워드 프로세서, 이미지 뷰어, MP3 플레이어, 게임 등이 있다
* 일부 운영 체제에서는 레지스트리(Registry)라고 불리는 데이터 저장 및 관리 시스템을 구현
레지스트리는 주로 Windows 운영 체제에서 사용되며, 시스템 및 응용 프로그램 설정 정보, 구성 데이터 및 관련 정보를 저장하고 검색하는 데 사용된다
Operating System Design & Implementation
운영체제 설계 및 구현
목표를 정하는 것부터 시작한다
사용자 목표
- 사용자 목표는 운영 체제가 사용하기 편리하며, 쉽게 배울 수 있고, 안전하며 빠르게 작동해야 한다는 것
시스템 목표
- 시스템 목표는 운영 체제가 설계, 구현 및 유지 관리하기 쉽고, 유연하며, 신뢰성 있으며, 오류가 없으며, 효율적으로 작동해야 한다는 것
하드웨어 바로 위에서 동작하므로 하드웨어의 영항을 많이 받는다.
- 운영 체제(OS)는 컴퓨터 시스템의 하드웨어 특성 및 시스템 유형(일괄 처리, 시분할, 실시간, 단일 사용자, 다중 사용 자)에 따라 영향을 받는다
- 하드웨어가 어떻게 되는가에 따라서 운영체제 설계가 달라진다.따라서 하드웨어를 고려해서 OS 설계를 해야한다.
- 하드웨어에서 돌아가기 때문에 신뢰도가 높아야 함
다양한 요구 사항 및 해결책
- 다른 운영 체제의 내부 구조는 크게 다를 수 있다
정책(policy)과 메커니즘(mechanism)의 분리 중요
- 정책 (Policy): 무엇을 할 것인가?
- 메커니즘 (Mechanism): 어떻게 할 것인가?
- 정책은 장소나 시간에 따라 변경될 수 있음 : 정책은 특정 장소나 시점에서 다른 정책으로 변경될 수 있다. 이는 다양한 요구 사항 또는 환경 조건에 따라서 정책이 다르게 설정될 수 있다는 것을 의미한다
- 나중에 정책 결정을 변경할 수 있다면 최대한의 유연성을 제공함: 정책과 메커니즘을 분리하는 것은 정책 변경이 필요한 경우에 메커니즘을 변경하지 않고도 쉽게 정책을 조정할 수 있도록 해준다. 이는 시스템을 최대한 유연하게 유지하고 정책 변경에 따른 복잡성을 최소화하는 데 도움이 된다
전통적으로는 어셈블리 언어로 작성-> 현재는 고급 언어로 작성(C나 C++같은)
고급 언어가 사용되는 이유
- 코딩이 빠르고 간결함: 고급 언어는 더 간단하고 읽기 쉬운 구문을 가지고 있으며, 개발자가 빠르게 코드를 작성하고 유지 관리할 수 있도록 도와준다. 더 빠르게 개발할 수 있으므로 개발 프로세스가 더 효율적으로 진행된다
- 이해와 디버깅이 쉬움: 고급 언어는 더 추상적이며, 인간이 이해하기 쉽도록 설계되었다. 이는 코드를 작성하고 디버그하는 데 도움이 되며, 논리 오류를 찾고 수정하기가 더 쉽다
- 이식성이 용이함: 고급 언어로 작성된 코드는 다양한 플랫폼 및 운영 체제에서 더 쉽게 이식될 수 있다. 이식성은 코드를 다른 시스템 또는 환경으로 쉽게 이동할 수 있는 능력을 의미하며, 이는 비용 절감과 개발 생산성 향상에 기여한다
고급 언어를 사용해서 얻는 단점
- 속도 저하
- 저장 공간 요구량 증가
Operating System Structure
운영체제를 만드는 방법
단순 구조
- MS-DOS
- UNIX
계층 구조
마이크로커널 접근 방식
모듈 접근 방식
하이브리드 접근 방식
Simple Structure : MS-DOS
- 가장 적은 메모리 공간을 사용하여 가장 많은 기능을 제공하도록 작성됨
- 모듈로 분할되지 않음
- MS-DOS는 일부 구조가 있지만 인터페이스와 기능 수준은 잘 분리되어 있지 않음
- Intel 8088은 듀얼 모드를 제공하지 않았으며 따라서 하드웨어 보호가 불가능했음 (일반 사용자들이 하드웨어를 건드리기 때문에)
Resident system program : 램 상주 프로그램
프로그램이 돌아가기 위해서는 프로그램이 램(메인 메모리)에 올라가야함 , 실행이 끝나면 메인 메모리에서 내려오는 것
램 상주 프로그램은 실행이 끝나도 계속 램에 남아 있는 것
램 상주 프로그램은 이미 내려와 있기 때문에 실행을 바로 시킬 수 가 있다( 디스크에서 메모리 로드하는 시간이 필요없음)
다른 프로그램 a라는 프로그램을 실행시키다가 램 상주 프로그램을 실행시킴
프로그램 카운트만 바꿔주면 바로 램 상주 프로그램 실행시킬 수 있음
롬바이어스에 리눅스나 윈도우 운영체제가 올라가서 사용됨
ms dos는 운영체제를 거치지 않고 직접 롬바이어스를 호출해서 사용할 수 있게끔 설계됨
single-tasking(단일 작업)
이 운영 체제 환경에서는 한 번에 하나의 작업만 수행할 수 있다. 다시 말해, 동시에 여러 프로그램을 실행시키지 않고 하나의 작업을 실행하는 방식을 의미한다
- 프로그램을 메모리에 로드하고, 커널을 제외한 모든 것을 덮어쓴다
- 프로그램 종료 시, 명령 해석기가 다시 시작된다
Simple Structure : UNIX
유닉스로 넘어오면서 멀티 태스킹 사용
시스템 프로그램과 커널을 구별
UNIX 운영 체제는 두 가지 분리 가능한 부분으로 구성된다.
- 시스템 프로그램
- 커널
커널
- 시스템 호출 인터페이스 아래부터 물리적 하드웨어 위까지로 구성된다.
- 파일 시스템, CPU 스케줄링, 메모리 관리 및 기타 운영 체제 기능을 제공한다.
-> 커널은 하나의 레벨에서 많은 기능을 수행한다 (monolithic 구조)
사용자가 로그인하면 사용자의 선택한 셸(shell)을 호출
Multitasking (다중 작업) -> 동시에 여러개의 프로그램을 메모리에 올려놓고 cpu가 왔다갔다 하면서 실행한다
- 셸이 fork() 시스템 호출을 실행하여 프로세스 생성
- 프로그램을 프로세스로 로드하기 위해 exec() 실행
- 셸은 프로세스가 종료될 때까지 대기하거나 사용자 명령을 계속 실행
Layered Approach
운영 체제는 여러 계층으로 나누어진다
- 각 계층은 하위 계층 위에 구축된다.
- 가장 하위 계층 (계층 0)은 하드웨어
- 가장 높은 계층 (계층 N)은 사용자 인터페이스
모듈성을 통해 각 계층은 하위 계층의 함수 (작업) 및 서비스를 사용한다
레벨 1->2->3이 될 수록 기능을 추가하고 확장한다.
복잡한 기능을 잘 쪼개서 레이어로 나눈 다음 점진적으로 구현
->운영체제가 점점 복잡해지면서 계층을 나누기 힘들어짐
Microkernel Approach
필수가 아닌 컴포넌트를 커널에서 제거하고 시스템 및 사용자 수준의 프로그램으로 구현한다.
- 더 작은 커널을 위해 커널에서 사용자 공간으로 이동한다.
- 일반적으로 운영 체제가 가져야 되는 비용으로서 파일을 관리한다든지 여러 가지 디바이스를 관리한다든지 이런것도 포함이 됐었는데 이것들을 유저 레벨로 빼버림.
마이크로커널은 최소한의 프로세스 및 메모리 관리와 통신 기능을 제공한다.
- 통신은 사용자 모듈 간에 마이크로커널을 통한 메시지 패싱을 통해 이루진다.
- MACH는 마이크로커널의 예시
장점
- OS 확장이 용이하며 커널 수정이 필요 없음
- 새로운 아키텍처로의 OS 이식이 쉬움, 수정해야 할 커널 크기가 작음
- 더 신뢰성 있음. 각 서비스 및 모듈이 분리되어 있기 때문에, 하나의 서비스의 오류가 전체 운영 체제의 충돌을 일으키지 않는다. 이로써 운영 체제의 신뢰성이 향상됨.
단점
- 사용자 공간에서 커널 공간으로의 통신 성능 오버헤드
Modular Approach (마이크로커널과 잘 구분할 것)
리눅스가 사용하는 방식
대부분의 현대 운영 체제는 로드 가능한 커널 모듈(loadable kernel modules)을 구현한다.
- 커널에는 핵심 구성 요소가 있음
- 추가 서비스는 모듈을 통해 제공됨
각 모듈은 필요할 때 커널 내에서 로드 가능
- 모듈의 dynamic load 동적 로드 (런타임에 로드) 및 링크
- 새로운 기능을 추가하기 쉬움
*실행하기 전 로드 static load
모듈은 독립된 프로그램이 아니다
모듈(함수들의 집합)들을 필요에 따라서 메모리에 올리거나 올리지 않을 수 있음 (추가도 가능)
마이크로커널과 유사한 특성을 가지지만
- 메시지 패싱을 사용하지 않고 모든 모듈이 다른 모듈을 호출할 수 있어 더 효율적
- 다양한 파일 시스템 지원 가능
- 다양한 장치 지원 가능
마이크로커널과 비슷한 모듈화와 확장성을 제공하면서도, 모듈 간의 효율적인 직접 호출 및 다양한 파일 시스템 및 장치 지원을 통해 특정 요구 사항을 충족할 수 있도록 설계되었다
💡 모듈러는 다 커널레벨에서 돌아간다 유저 레벨이 아니다
모듈들을 필요에 따라서 없앨 수도 있다
프로그램이 실행되기 위해서는 메모리 위에 올라가야한다. 부팅할 때 메모리를 올리면 모듈러에 해당되는 부분이 올라오겠지만 나머지 모듈들이 있다. 그 모듈들은 부팅할 때 필요에 따라서 올릴 수도 있고 안 올릴 수도 있다.
모듈들을 부팅하는 과정 중에 혹은 실행 중에 어떤 모듈들을 추가할 수도 있고 혹은 기존에 이미 실행되고 있던 모드들을 뺄 수도 있다.
Hybrid Approach
현대 운영 체제는 단일한 모델로만 설명되기 어렵다
실제로 많은 운영 체제가 다양한 아키텍처 및 설계 원칙을 혼합하여 구현된다
- Linux 및 Solaris 커널은 단일 커널 및 모듈화 접근법 사용
- Windows는 모노리식 커널 및 마이크로커널 접근법 사용
더 많은 예시
- 데스크톱 PC용 Mac OS, 모바일 디바이스용 iOS, 그리고 안드로이드 운영 체제
'💾 lecture > 운영체제' 카테고리의 다른 글
[OS] Chapter 6 : Process Synchronization (0) | 2023.10.28 |
---|---|
[OS] Chapter 5: CPU Scheduling (0) | 2023.10.18 |
[OS] Chapter 4: Multithreaded Programming (0) | 2023.10.14 |
[OS] Chapter 3: Processes (0) | 2023.10.13 |
[OS]chapter 1: Introduction (0) | 2023.10.08 |