User Interface : 거의 모든 운영체제는 UI를 제공한다. CLI와 GUI가 있다.
Program execution : 시스템은 프로그램을 메모리에 적재해 실행할 수 있어야 한다. 프로그램은 정상적이든 비정상적이든 실행을 끝낼 수 있어야 한다.
I/O Operation : 실행중인 프로그램은 입출력을 요구할 수 있다. 이것은 입출력 장치가 연관 될 수 있다. 효율과 보호를 위해 사용자들은 통상 입출력 장치를 운영체제를 통해 제어한다.
File system manipulation : 프로그램은 파일을 쓰거나 지울수 있고 운영체제는 이에 대한 접근제어를 제공한다.
Commnunication : 다른 프로세스와 통신하기 위해 프로세스간 통신과 네트웍을 통한 다른 컴퓨터에서 통신을 할 수 있다. 통신은 공유메모리를 통해서 구현될 수도 있고 메시지 전달기법에 의해 구현될 수 있다.
Error detection : 운영체제는 가능한 모든 오류를 항상 의식하고 있어야 한다. 하드웨어 에러, 프로그램 에러가 포함된다.
Resource allocation : 작업이 실행될때 자원을 할당해줘야 한다. 운영체제는 여러 종류의 자원을 관리한다.
Accounting : 사용자가 컴퓨터 자원을 얼마나 사용하는지 추적할수 있다. 통계 또는 개선을 위해 시스템을 재구성 하기 위해서도 자원 사용량 추적이 필요하다.
Protection and security : 시스템 자원에 대한 접근 통제를 말한다. 침입 탐지를 포함한다.
유저 OS 인터페이스
Command interpreter
어떤 운영체제는 커널에 커맨드 인터프리터를 포함하고 있다. 여러 커맨트 인터프리터를 제공하는 시스템에서 인터프리터는 Shell로 불린다.
커맨드 인터프리터의 중요한 기능은 사용자가 지정한 명령을 가져와서 그것을 실행하는 것이다. 그 방법은 두가지가 있다.
커맨트 인터프리터가 명령할 코드를 포함하고 있는 경우다. 디렉토리 이동이 그 예다.
시스템 프로그램에 명령어를 구현하는 것이다. 파일 삭제 명령어가 그 예다.
Graphical user interface
키보드뿐만 아니라 마우스와 함께 데스크톱이라 칭하는 화면내의 아이콘을 클릭하여 운영체제와 상호작용한다.
System calls
시스템 콜은 운영체제 서비스에 대한 인터페이스를 제공한다.
이러한 호출은 대부분 C또는 C++로 작성된 루틴형태로 제공한다.
간단한 프로그램이라도 운영체제의 기능을 아주 많이 사용한다. (예- 파일 복사)
대부분의 개발자들은 API에 따라 프로그램을 설계한다.
API는 각 함수에 전달할 매개변수와 반환값을 포함한다.
API는 개발자가 사용 가능한 함수의 집합이다.
시스템 호출을 직접 사용하는것보다 API를 사용하는것을 선호하는 이유는 호환성과 관련이 있다. API에 따라 프로그램을 설계하면 기대하는 시스템에서 컴파일되고 실행할 수 있다.
시스템 호출을 사용하면 보다 많은 매개변수나 저수준의 예외처리가 필요해 API보다 사용하기 까다롭다.
Runtime support system은 운영체제가 제공하는 system call의 인터페이스를 제공한다.
Runtime support system : 컴파일러와 함께 제공되는 라이브러리레 내장된 함수의 집합
이 system call 인터페이스는 API함수의 호출을 가로채 필요한 system call을 호출한다.
개발자는 systemcall이 어떻게 구현되고 실행 중간에 무슨 작업을 하는지 알 필요가 없다. API를 준수하고 system call의 결과로 운영체제가 무엇을 할 것인지만 이해하면 된다.
System call은 시스템마다 다른 방법으로 발생한다.
운영체제에 매개변수를 전달하기 위한 방법은 세가지가 있다.
매개변수를 레지스터 내 전달하는 방법
매개변수를 메모리 내 블록이나 테이블에 저장하고 그 주소를 레지스터에 전달하는 방법
매개변수를 stack에 push하고 pop하는 방법.
System call의 유형
System call의 다섯가지 중요한 범주 : 프로세스 제어, 파일 관리, 장치 관리, 정보 유지보수, 통신, 보호
Process control
end, abort : 실행중인 프로그램은 정상적인 종료 (end) 또는 비정상적으로 멈출 수(abort)있어야 한다. 프로그램에 문제가 발생해 오류를 유발할 경우 메모리 덤프가 수행되고 오류 메시지가 생성된다. 메모리 덤프는 디버거에 의해 검사될 수 있다.
load, execute : 프로그램을 실행하고 있는 프로세스나 작업이 다른 프로그램을 load하하고 execute하길 원할 수 있다. 사용자의 명령에 프로그램을 실행하는것을 허용한다.
create process, terminate process, : 프로세스나 작업을 생성하고 종료할 수 있다.
process 속성의 설정과 획득 : 프로세스나 작업의 우선순위, 최대허용시간 등의 속성을 결정하고 재설정 할 수 있다.
대기 (wait for time) : 프로세스나 작업의 실행을 기다릴 수 있다.
wait event, signal event : 특정 이벤트를 기다리거나 이벤트가 발생했을때 신호를 보낼 수 있다.
메모리 할당과 해제
File management
file 생성과 삭제
open, close
read, write, reposition(위치변경)
file 속성의 설정과 획득
Device management
입출력 장치와 파일들 간에는 유사성이 매우 높아 UNIX를 포함한 많은 운영체제가 이 둘을 통합한 file device structure로 결합해 사용한다. 이 경우 같은 system calleㅡㄹ이 파일과 장치에 대해 사용된다.
장치를 요청, 장치를 해제 : 프로세스나 작업이 독점적인 장치 사용을 보장받기 위해 요청하고 사용 후에는 해체할 수 있다.
read, write, reposition
장치 속성의 설정과 획득
장치의 논리적 attach와 detach
Information maintenance
시간과 날짜의 설정과 획득
많은 운영체제는 프로그램의 time profile을 제공한다. time profile은 그 프로그램이 특정 위치 혹은 위치의 집합에서 실행한 시간의 양을 말한다. time profile은 tracing facility나 정규 타이머 인터럽트를 필요로 한다. timer interrupt가 발생할 때 마다 프로그램 카운터의 값이 기록된다. 따라서 timer interrupt가 충분하면 프로그램의 여러 부분에서 소비한 시간의 통계를 얻을 수 있다.
시스템 데이터의 설정과 획득
프로세스, 파일, 장치 속성의 설정과 획득
Communication
통신모델에는 메시지 전달과 공유 메모리 두가지 일반모델이 있다. 메시지 전달은 통신하는 두 프로세스가 정보를 교환하기 위해 서로 메시지를 주고 받는다. 공유 메모리는 다른 프로세스가 소유한 메모리 영역에 대한 접근을 위해 system call을 사용하는 방법이다. 공유영역에서 여러 프로세스가 데이터를 읽고 씀으로써 정보를 교환할 수 있다.
연결 생성, 삭제 :
메시지 송수신 :
상태 정보 전송 :
원격 장치의 attach, detach :
Protection
자원에 대한 접근제어.
System program
파일 관리
상태 정보 : 어떤 프로그램들은 시스템에 날짜, 시간, 메모리와 디스크 사용량, 사용자 수 등을 묻는다. 이런 정보들을 제공한다.
파일 변경
프로그래밍언어 지원
프로그램 적재와 실행 : 프로그램이 실행되려면 메모리에 적재해야한다. 시스템은 absolute loader, relocatable loader, linkage editor, overlay loader 등을 제공할 수 있다.
통신
백그라운드 서비스 : 모든 시스템은 부팅시 특정 시스템 프로그램을 시작시킬 수 있는 방법을 가지고 있다. 시스템 프로그램 프로세스는 서비스, 서브시스템 또는 데몬으로 알려져있다.
운영체제 설계 및 구현
운영체제를 설계하고 구현할때 성공적이 접근방법들이다.
설계 목표
시스템의 목표와 명세를 정의하는 일이다.
하드웨어와 시스템 타입에 영향을 받는다.
사용자 목적과 시스템 목적 두가지 그룹으로 나뉜다.
운영체제는 설계, 구현, 유지보수를 고려해야한다.
적응성, 신뢰성, 무오류, 효율성을 기대한다.
기법과 정책
기법으로 부터 정책을 분리하는것이 중요한 원칙이다.
기법 : 어떻게 할 것인가를 결정하는 것
정책 : 무엇을 할 것인가 결정하는 것
ex) 타이머구조는 CPU보호를 보장하기 위한 기법이지만, 특정 사용자를 위해 타이머를 얼마나 오랫동안 설정할지를 결정하는 것은 정책적 결정이다.
구현
초창기 운영체제는 어셈블리로 작성됐다.
현재는 C나 C++같은 고급 언어로 작성된다.
운영체제가 고급 수준의 언어로 작성되었을 고급 언어의 특징을 그대로 수용한다. (개발이 빠르다, 이식이 쉽다, 보다 큰 저장장치를 요구한다, 속도가 느리다 등등)
운영체제의 주요 성능은 인터럽트 핸들러, IO 컨트롤러, 메모리 관리자와 CPU 스케줄러에서 결정된다.
Operating system structure
간단한 구조
소형이면서 간단하고 제한된 시스템으로 제작된 운영체제.
이러한 제한적 구조 때문에 응용프로그램과 시스템프로그램이 모두 장치에 직접 접근이 가능해 프로그램으로부터 시스템이 취약했다. (MS-DOS)
UNIX또한 처음에는 커널과 시스템프로그램으로 구성되어있다가 커널이 인터페이스와 디바이스 드라이버로 분리되는 발전 과정을 거쳤다.
계층적 접근
하나의 덩어리에서 조각으로 모듈화 되면 운영체제는 각 프로그램에 대해 더 큰 제어를 유지할 수 있다.
시스템은 다양한 방식으로 모듈화 될 수 있다. 계층적 접근 방식으로 나누면 가장 낮은 층은 하드웨어고 가장 높은 층은 사용자 인터페이스다.
운영체제 층은 자료구조와 상위 층에서 호출 할 수 있는 루틴의 집합으로 구성된다고 보면 된다. 하위층으로 연산을 호출할 수도 있다.
각 층은 연산들이 어떻게 구현되는지 알 필요가 없고, 무엇을 하는지만 알면 된다. 그러면 다른 층의 존재에 대해 캡슐화 할 수 있다.
마이크로 커널
마이크로커널은 중요치 않은 구성요소를 커널로부터 분리하고 그것들을 사용자 수준 프로그램으로 구현하여 운영체제를 구성하는 방법이다. 결과적으로 보다 작은 크기의 커널을 가진다.
마이크로커널의 주 기능은 서비스간에 메시지 전달에 의해 통신한다는 것이다.
마이크로 커널은 운영체제의 확장 또는 커널의 변경이 용이하고 이식이 쉽다. 또한 대부분의 서비스가 사용자 프로세스로 실행되기 때문에 만일 한 서비스가 잘못 되어도 운영체제는 영향을 받지 않는다.
마이크로커널은 가중된 오버헤드 때문에 성능이 다소 나쁘다.
모듈
적재가능 커널 모듈 : 커널은 핵심적인 구성요소의 집합을 가지고 있고, 부팅 또는 실행 중에 부가적인 서비스들을 모듈을 통해 링크한다.
현대 운영체제들은 모두 이 방식을 채용한다.
설계의 주안점은 커널은 핵심 서비스를 제공하고 다른 서비스들은 커널이 실행되는 동안 동적으로 구현하는 것이다.
서비스를 동적으로 링크하는 것이 새로운 기능을 커널에 추가해 컴파일 하는것보다 바람직하다.
결과적으로 커널의 각 부분이 정의되고 보호된 인터페이스를 가진다는 점에서 계층적 구조를 닮았다.
중심 모듈은 단지 핵심 기능만을 가지고 다른 모듈의 적재 방법과 모듈들과 어떻게 통신하는지 안다는 점에서 마이크로 커널과 유사하다. 하지만 메시지 전달을 할 필요가 없어 더 효율적이다.
Operating sytstem debugging
커널과 프로세스 오류 및 성능 문제의 디버깅을 다룬다.
장애 분석
프로세스가 실패한다면 문제가 발생했다는 것을 경고하기 위해 오류 정보를 로그 파일에 기록한다.
운영체제는 또한 프로세스가 사용하던 메모리를 캡쳐한 코어 덤프를 취하고 차후 분석을 위해 파일로 저장한다.
실행중인 프로글매과 코어 덤프는 프로그래머가 프로세스의 코드와 메모리를 분석할 수 있는 도구인 디버거에 의해 검사될 수 있다.
커널 장애는 Crash라고 한다. 프로세스 장애와 마찬가지로 오류 정보가 로그파일에 저장되고 메모리 상태가 Crash dump에 저장된다.
성능 튜닝
병목 지점을 제거함으로써 성능을 향상시키는 방법이다.
병목 지점을 발견하기 위해 시스템 성능을 감시 할 수 있다. 시스템 동작을 측정하고 표시할 수 있는 방법을 가지고 있어야 한다.
이 작업을 위해 운영체제는 시스템 동작의 추적 목록을 생산한다.
dtrace, Windows task manager 등이 있다.
Operating system generation
운영체제는 일반적으로 다양한 주변 구성을 가진 여러 사이트에 있는 여러 부류의 기계에서 실행되도록 하는것이 일반적이다. 그 경우 시스템은 각 특정 컴퓨터를 위해 구성되거나 생성되야 하는데 이것을 SYSGEN(시스템 생성)이라고 한다.
SYSGEN 프로그램은 하드웨어 시스템의 특정 구성에 관한 정보를 파일로부터 읽어 들이거나 하드웨어를 결정하기 위해 직접 시험할 수 있다.
정보들을 결정하기 위해 CPU의 종류, 부팅디스크, 메모리 크기, 주변장치, 운영체제 옵션 등을 조사한다.
System booting
컴퓨터가 전원을 켜거나 재부팅등의 사건을 받으면 명령 레지스터는 미리 지정된 메모리 위치를 가리키고 실행을 시작한다.
그 위치에 최초의 bootstrap program이 존재한다. (ROM에 존재)
Bootstrap program은 하드웨어 상태를 진단하고 CPU레지스터, 디바이스 컨트롤러, 메인메모리 등을 초기화한다.
Bootstrap program이 디스크에서 고정된 위치의 블록을 읽어 그 안의 주소를 메인 메모리에 적재한다.
이 블록을 부트 블록이라고 한다. 부트블록에 저장된 프로그램은 운영체제를 메모리에 적재하고 실행한다.