- 관점
- os가 제공하는 서비스에 초점
- 사용자와 프로그래머에게 제공하는 인터페이스에 초점
- 시스템의 구성요소와 상호 연결에 초점
2.1 OS Services
사용자에게 도움을 주기위한
- User Interface
- program execution 프로그램 수행
- 프로그램을 mem에 적재 → 실행
- 정상/비정상 종료
- I/O operation 입출력 연산
- file sys. manipulation 파일 시스템 조작
- 파일 생성, 삭제, 읽기, 쓰기, 찾고 정보 열거
- 권한 관리
- 디렉터리
- communication 통신
- 프로세스 사이에서
- 네트워크 상의 다른 컴퓨터의 프로세스
- 구현
- 공유 메모리
- 메세지 전달 msg. passing (패킷)
- error detection 오류 탐지
시스템의 효율적 작동을 위한
- 자원할당 resource allocation
- cpu 스케쥴링
- 멀티 프로세싱 → 자원 할당 중요
- 기록 작성 logging
- 어떤 프로그램이 어떤 종류 자원 얼마나 사용하는지
- 보호 protection, 보안 security
2.2 User and OS interface
2.2.1 Command interpreter
- 사용자가 처음 로그인 할 때
- shell
- 명령 인터프리터 해석기
- 우리가 친거를 시스템콜로 번역하는 해석기 약간 컴파일러 느낌~!
- 사용자가 지정한 명령 가져와서 실행
- 방식
- 커맨드 인터프리터가 직접 실행 코드를 가지는 경우
- 인터프리터가 직접 시스템 콜 호출
- sys. prog.에 의해 명령을 구현
rm file.txt
1. rm 이라는 파일 찾기 → 메모리 적재 → 매개변수 file.txt 로 수행
2. rm 이라는 파일 내의 코드를 이용
2.2.2 Graphical UI
2.2.3 Touch screen interface
- 제스처
- Springboard 터치스크린 인터페이스
2.2.4 Choice of Interface
- shell scripts
- cli 기반
- 자주 이용되는 작업 파일에 작성해서 반복 실행
2.3 Sys. calls
- os에 의해 사용가능하게 된 서비스에 대한 인터페이스 제공
2.3.2 App. programming interface
- API - application programming Interface
- api에 따라 프로그램 설계
- 매개변수, 반환값 → 프로그래머가 사용 가능한 함수의 집합 명시
- Windows API, POSIX API, Java API
- POSIX → unix, linux, mac os
- 개발자 대신 api가 실제 시스템 콜 호출
- RTE 실행시간 환경 Run Time Env.
- SW + library + loader
- sys. call interface 제공
- os 인터페이스는 API에 의해 숨겨지고, RTE에 의해 관리됨
- os에 매개변수 전달
- 레지스터 내에 전달
- 레지스터보다 매개변수가 많으면? → mem내의 블록에 parm 저장하고, 그 주소를 reg에
- stack
2.3.3 types of Sys. calls
2.3.3.1 프로세스 제어 process control
- end, abort
- load, execute
- create, finish
- attribtes 획득, 설정
- 시간 기다림
- event wait, signal event
- 메모리 할당 및 자유화
2.3.3.2 파일 조작 file manipulation
- create file, delete file
- open, close
- read, write, reposition
- 파일 속성 획득 및 설정
- 디렉터리
2.3.3.3 장치 조작 device mgt
- request devices, release devices
- read, write ,reposition
- 장치 속성 획득, 설정
- 논리적 attach, detach
2.3.3.4 정보 유지 보수 information maintenance
- 시간, 날짜 설정&획득
- 시스템 데이터의 설정, 획득
- 프로세스, 파일, 장치 속성 획득&설정
- timeprofile
- 프로그램이 사용한 시간의 양
- tracing facility 추적 설비, 정규 타이머 인터럽트 필요
2.3.3.5 통신 comm.
- 통신 연결 생성, 제거
- 메세지 송신, 수신
- 상태 정보 전달
- 원격 장치 attach, detach
- 공유 메모리
- 다른 프로세스가 소유한 메모리 영역에 접근
- 메모리 접근 제한을 해제하는 것에 상호 동의 필요
- 동일한 위치에 동시에 write 하지 않음 보장
- 메세지 전달 모델
- 통신 전에 반드시 open
- 프로세스 “이름”을 알아야
- 호스트 이름, 프로세스 이름 → 식별자
- 소량의 데이터 교환
2.3.3.6 보호 protection
- get, set file permissions
2.4 system services
- = system utility
- prog 개발과 실행을 위해 더 편리한 환경 제공
- 파일 관리
- 상태 정보
- 날짜, 시간, 사용가능한 메모리, 디스크, 사용자 수 ...
- 성능, 로깅 및 디버깅 정보
- 파일 변경
- 프로그래밍 언어 지원
- 프로그램 적재와 수행
- 메모리 적재
- absolute loader, relocatable loader, linkage editor, overlay loader...
- 디버깅시스템
- 통신
- 메세지, 웹서핑, 이메일 ,로그인, 파일 전송 ...
- 백그라운드 서비스
- = 서비스, 서브 시스템, daemon
- 프로세스 스케쥴러, 시스템 오류감시 서비스, 출력 서버
2.5 linkers and loader
- 프로그램: 디스크에 binary 파일 → 메모리에 프로세스로
- 재배치 가능한 오브젝트 파일 relocatable obj. file
- 소스 파일 → 컴파일 → 오브젝트 파일
- 임의의 물리적 메모리에 적재
- 표준 c 라이브러리, 수학 라이브러리...
- obj. file 들 → 링커 → 하나의 binary 실행 파일
- 로더
- binary 실행 파일 → 로더 → 메모리에 적재
- 동적 링크
- DLL Dynamic Linked Library
- 오브젝트 파일 링크를 run time에 메모리에 적재
- 메모리 절약
- ELF Executable and Linkable Format
2.6 Why app. are OS specific
- OS 마다 고유한 시스템콜이 다르다
- 범 OS prog 사용법
- 인터프리터 언어 → 각 운영체제에 맞게 실행타임에 번역
- 가상머신 → RTE의 일부인 가상머신
- os 고유의 이진파일 생성하는 api 사용 → 이식
- 크로스 플랫폼 어려움
- ABI: Applicaiton Binary Interface
- 이진 코드의 구성요소가 특정 os 와 상호작용 할 수 있는 방법 정의
- 주소 길이, 시스템 콜 매개변수 전달 법, 런타임 스택 구성 ...
- 아키텍처 수준의 API → CPU 별로
2.7 OS Design and Implmentation
2.7.1 Design Goals
- 시스템의 목표와 명세 정의
2.7.2 Mechanisms and Policies
- 기법 mechanisms으로 부터 정책 policy를 분리
- mechaninsms = how
- policy = what
- cpu 스케쥴링 문제
- 어떻게 할당하지? → 메커니즘
- 무엇을 할당하지? → 정책
2.7.3 Implementation
- 어셈블리
- 최근엔 c, c++
- 고급프로그래밍 언어로 운체 개발 → 다른 하드웨어로 이식 쉬워짐
- 좋은 자룍조, 알고리즘 → 운체 발전
2.8 OS Structures
2.8.1 Monolithic Structure
- 커널의 모든 기능을 단일 주소 공간에서 실행되는 단일 정적 이진 파일에 넣는 것
- UNIX
- 커널 + sys. prog.
- 커널 = 인터페이스 + 장치 드라이브
- 이 모든걸 하나의 주소에 두기엔 너무 큼
- Linux
- 단일 주소 공간에서 커널 모드로 전부 실행 → monolithic
- but, 런타임 중에 커널 수정 가능 → module식
- 성능 뛰어남
2.8.2 Layered Approach
- 느슨하게 결합된 sys
- 모듈 방식
- 한 모듈의 수정이 다른 모듈에 영향 X
- 계층적 접근 방식
- 구현과 디버깅 간단
- 첫 번째 층이 완벽하다 → 다음 층 구현
- TCP/IP에 사용
- 오버헤드 커서 os에는 사용 어려움. 층을 명확히 정의하기도 어려움
2.8.3 Michrokernels
- 중요하지 않은 구성요소 커널에서 제거 → 별도의 주소 공간
- 분리된 기능간의 통신 → 메시지 이용
- HW 간 이식이 쉽고, 보안성과 신뢰성 높음
- 오버헤드 큼
- MacOs에 사용. 초기 윈도우 발목잡은 주 원인
2.8.4 Modules
- Loadable Kernel Mouldes, LKM 적재가능 커널 모듈
- 커널이 핵심 갖고있고, 부가적 서비스는 모듈통해 링크
- 서비스 동적 구현
- 모듈이 다른 모듈 호출 가능 → 계층구조보다 유연
2.8.5 Hybrid Sys.
- macOS , iOS
- Android
2.9 Building and Booting an OS
2.9.1 OS Generation
- 시스템의 크기, 일반성, 하드웨어 구성 변경의 난이도
2.9.2 Sys. Boot
- 부팅: 커널을 적재하여 컴퓨터를 시작하는 과정
- 부트스트랩 프로그램/부트로더 라는 작은 코드가 커널 위치 찾음
- 커널이 메모리에 적재되고 시작됨
- 커널이 하드웨어 초기화
- 루트 파일 시스템이 마운트
- 부트 로더
- BIOS (비휘발성 펌웨어)에 위치
- 부트 블록 적재하는 작업 함
- 부트 블록: 전체 os 메모리에 적재
- 분리 해둔 것
- UEFI: Unified Extensible Firmware Interface
- 메모리 적재 + 시스템 상태 확인(점검)
2.10 OS Debugging
- HW, SW에서 sys 오류 발견하고 수정하는 행위
- 성능 조정 performance tuning도 디버깅에 포함 (병목현상 제거)
2.10.1 Failure Analysis
- log file: 사용자에게 문제 발생했다는 오류 기록
- core dump: 프로세스가 사용하던 메모리 캡처
- crash: 커널 장애
- crash dump: 커널이 사용한 메모리 캡처
- Counter
- 시스템콜 횟수, 장치에 수행된 작업 수 등 추적
- Tracing 추적
2.10.4 BCC
- 디버깅 환경 제공
- 안정성 해치지 않고 디버깅 해야함
- BPF Compiler Collection → eBPF의 프론트엔드 인터페이스
- Linux 시스템을 위한 추적 기능 제공하는 툴 킷
- eBPF: extended Berkeley Packey Filter
- 트래픽 필터링
- 특정 이벤트 캡처
- 시스템 성능 관찰