운영체제 구조
- 운영체제는 프로그래밍이 실행되는 환경을 제공해 준다.
- 운영체제를 살펴보는 몇가지 관점이 있다.
- 첫번째는 운영체제가 제공하는 서비스에 초점을 맞추는 것
- 두번째는 운영체제가 사용자 및 프로그래머에게 제공하는 인터페이스에 초점을 맞추는 것
- 세번째는 시스템의 구성요소와 그들의 상호연겨에 초점을 맞추는 것
운영체제 서비스
- 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이 디스크에서 고정된 위치의 블록을 읽어 그 안의 주소를 메인 메모리에 적재한다.
- 이 블록을 부트 블록이라고 한다. 부트블록에 저장된 프로그램은 운영체제를 메모리에 적재하고 실행한다.
- 대부분 한 블록 정도에 저장되기 때문에 부트로더는 작은 크기를 가진다.