OS의 정의
User 입장에서 OS :용이성과 성능을 위한 프로그램
시스템 입장에서 OS : 자원 할당과 제어를 위한 프로그램
기본 구조
- CPU 및 디바이스 컨트롤러(I/O 컨트롤러)들은 공유 메모리에 엑세스하며 버스를 통해 연결됨
- I/O 디바이스와 CPU는 동시 실행이 가능
- 각 디바이스 컨트롤러는 Local Buffer를 가짐
- CPU는 메인 메모리와 Local Buffer 간의 데이터를 송/수신
- I/O란, 디바이스로부터 컨트롤러의 Local Buffer까지의 데이터 전송
- 디바이스 컨트롤러는 Interrupt를 발생시킴으로써 CPU에게 작업이 완료되었음을 알림
I/O 컨트롤러
- CPU를 대신하여 I/O를 관리하며 실제로 I/O 명령을 수행
- 내부에 Register와 Data Buffer가 존재.
- Bus(Address Bus / System Bus)를 통해 Read/Write 명령을 수행하여 CPU와 통신
CPU가 I/O 컨트롤러의 Data Buffer에 데이터를 채운 후 Write 명령을 수행하면, I/O 컨트롤러는 사용 가능한 상태인지 확인한 후 작업을 수행. 작업이 끝나면 Interrupt를 발생시켜 CPU에게 작업이 완료되었음을 알림.
인터럽트의 기능
- 일반적으로, 인터럽트는 인터럽트 벡터를 통해 제어를 Interrupt Service Routine 또는 Interrupt Handler에 전송
(인터럽트 벡터(영어: interrupt vector)는 인터럽트가 발생했을 때, 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간이다. 인텔 아키텍처에서는, 가상메모리를 사용하지 않았던 386이전에는 주로 Main Memory의 0번째에 위치하였으나, 이후부터는 IDT(Interrupt descriptor table)의 형태로 바뀌었다.)
- 인터럽트 핸들러는 OS의 일부
- 인터럽트 아키텍처는 인터럽트 된 명령어의 주소를 저장해야 함
- Trap (또는 예외)은 오류 또는 사용자 요청으로 인해 소프트웨어에서 생성 된 인터럽트 (0으로 나누기, 페이지 폴트 등)
Storage 구조
- Main Memory : CPU가 직접 엑세스할 수 있는 대용량 저장 장치
- 2차 저장소 : 비휘발성 저장소 용량을 제공하는 Main Memory의 확장
- 자기 디스크 : 자기 기록 물질로 덮힌 단단한 금속 또는 유리 플래터. 디스크 표면은 섹터로 세분화되는 트랙으로, 논리적으로 나뉘어짐. 디스크 컨트롤러는 장치와 컴퓨터 간의 논리적 상호 작용을 결정
메모리 계층 구조
CPU가 메모리에 더 빨리 접근하기 위해 나눈 구조(속도, 가격, 휘발성을 고려)
- Register와 Cache는 CPU 내부에 존재.
- Register는 연산을 위한 저장소
- Cache는 CPU와 RAM 사이의 중간 저장소
- Main Memory는 CPU 외부에 있지만 CPU의 Cache와 연결됨.
- 그외 디스크들은 CPU가 직접 접근할 수가 없기 때문에, 데이터를 Main Memroy로 이동시키는 과정이 필요
*CPU가 빠르게 데이터에 접근하기 위해서는 데이터를 저장하는 메모리가 작아야 한다. 실제로 레지스터는 캐시보다 더 작은 용량을, 캐시는 메모리보다, 메모리는 하드 디스크보다 더 작은 용량을 가진다. 메모리 구조 그림1에서는 위 즉 높은 속도에 있는 장치가 더 작은 크기를 차지하는 방식으로 이를 표현했다.
메모리 엑세스 구조
- 메모리 속도에 가까운 속도로 정보를 전송하기 위해 고속 I / O 장치에 사용됨
- 디바이스 컨트롤러는 CPU 개입없이 버퍼 블록에서 데이터 블록을 직접 주 메모리로 전송함
- 바이트 당 하나의 인터럽트보다는 블록 당 하나의 인터럽트만 생성됨
일반적인 OS 구조
- 시스템에 있는 Job들은 메모리에 유지된다.
- 스케줄링을 통해 하나의 Job이 선택된다.
- I/O가 발생하면, OS는 다른 Job으로 컨텍스트 스위칭을 한다.
- 시 분할(멀티 태스킹)시스템은 CPU가 스위칭을 자주 수행하는 방식이다.
- User는 메모리에서 적어도 하나의 프로그램을 실행한다. -> Process
- 만약, 모든 Job들이 동시에 실행할 준비가 되었다면, 스케줄링 수행
- 만약 프로세스들이 메모리에 맞지 않으면, Swapping을 수행
- 가상 메모리는 RAM이 부족한 경우에도 프로세스들을 실행할 수 있도록 해줌
OS는 어떤 프로그램에 의해 다른 프로그램이 오류가 발생하는 경우가 없도록 설계되어야 한다.
- Dual Mode Operation (커널 / 유저)
- I/O 보호
- Memory 보호
- Timer
Dual Mode Operation은 운영체제가 자체적으로 시스템 구성을 보호할 수 있도록 Dual Mode로 작동하도록 한다.
- User Mode / Kernel Mode로 나뉘어짐
- 하드웨어에 의해 제공되는 Mode Bit
- User Code / Kernel Code가 실행될 때를 구분하는 기능 제공
- 일부 명령들은 커널 모드에서만 실행 가능하도록 하는 권한을 가진다.
- System Call은 User Mode를 Kernel Mode로 바꾸고, 작업이 종료될 때 유저 모드로 다시 전환한다.
I/O Protection
유저가 잘못된 I/O 명령을 직접 시도할 수 있다면(I/O register를 User Mode에서 직접 다룰 수 있다면) 오류가 발생할 가능성이 높아지고, 이는 OS의 정상적인 동작을 방해할 수 있다. 그래서 유저가 직접 수행하지 못하도록 I/O 명령을 모두 Privileged Instruction으로 만들어서 Kernel Mode에서만(커널이 대신) 수행할 수 있도록 한다.
- 모든 I/O 명령은 권한이 존재한다.
- 유저모드 실행 불가 -> 커널에 요청하여 커널 모드에서 작동
Memory Protection
- 인터럽트 벡터와 인터럽트 서비스 루틴에 대해 메모리 보호를 제공해야 한다.
- 메모리 보호를 위해 프로그램이 엑세스 가능한 주소 범위를 결정하는 두 개의 Register를 추가한다.
- Base Register : 유효한 최소 물리 메모리 주소
- Limit Register : 크기
이렇게 함으로써, 정의된 범위를 벗어난 메모리가 보호된다.
해당 범위 밖이라면 운영체제에게 오류를 알린다(Trap)
Timer
- 지정된 기간이 지나면 인터럽트를 발생시킴
- 매 Clock Tick마다 Timer가 감소
- Timer가 0이 되면 인터럽트 발생
- 보통 시간 공유를 구현하는 데에 사용됨
- 현재 시간을 계산하는 데에도 사용
- Load-Timer는 Privileged Instruction
System Call
- OS에 의해 제공되는 서비스에 대한 프로그래밍 인터페이스
- 응용프로그램에서 운영체제에게 커널 기능 수행을 요청하는 방법. 즉, 유저 프로세스가 소프트웨어 인터럽트를 통해 커널의 기능을 이용하기 위한 서비스를 요청하는 방법.
- 일반적으로 High-Level Language로 구현됨
- 어플리케이션을 통해 프로그램에서 엑세스(Windows API, Posix API 어플리케이션 혹은 JVM 등등)
System Call Interface
- 각 시스템 콜에는 번호가 할당된다.
- 시스템 콜 인터페이스는 이 번호에 대해 인덱스되는 테이블을 가지고 있는데, 다음과 같이 동작한다.
어떤 프로세스가 실행되고 있다면, 기본적으로 User Mode로 동작한다. 이 때, I/O Instruction을 사용하려 한다면(Privileged Intstruction이므로) 소프트웨어 레벨에서 인터럽트를 걸어, Kernel Mode로 변경해 주어야 한다.
종종 System Call이 발생할 때 많은 정보가 필요할 수 있는데, 일반적으로 3가지 방법이 존재한다.
1. 레지스터에 그대로 매개변수를 전달 : 레지스터 수보다 매개변수가 더 많을 수 있음
2. 매개변수들을 메모리 블록에 저장하고, 해당 블록의 주소를 레지스터에 전달 : Linux와 Solaris가 사용하는 방법
3. OS에 의해 Stack에서 Pop되거나 프로그램에 의해 Stack에 Push되는 방식
2, 3번째 방법은 매개변수의 수가 제한되지 않는다.
Types of System Calls
- 프로세스 제어
- end / abort
- load / excute
- create / terminate process
- get / set process attributes
- wait for time
- wait / signal event
- allocate / free memory
- 파일 관리
- create / delete
- open / close
- read / write / reposition
- get / set file attributes
- 장치 관리
- request / release device
- read / write / reposition
- get / set device attributes
- attach / detach devices
- 정보 관리
- get / set [time / date / process / file / device] attributes
- 통신
- create / delete communication connection
- send / receive messages
- transfer status info
- attach / detach remote devices
커널에서 사용되는 자료구조
- Stack
- Queue
- List (Singly / doubly / circularly)
- Tree
- Hash Function
- Bitmap
System Boot (간략)
1. 전원
2. BootStrap Loader가 저장되어 있는, 지정된 메모리(ROM에서)를 읽고 코드를 실행(부트스트랩에 실행 코드가 작성되어 있음)
-> 커널 로딩
운영체제 기능
- User Interface
- CLI 및 GUI 제공
- 프로그램 실행
- 프로그램을 메모리에 로드하고, 실행하며, 정상/비정상적으로 종료할 수 있음
- I/O 연산
- 실행된 프로그램은 I/O가 필요할 수 있는데, 이는 파일 또는 I/O 장치도 포함됨
- File 조작
통신
- 프로세스는 네트워크를 통해 컴퓨터 혹은 프로세스간에 정보를 교환할 수 있음
- Shared Memory 혹은 메시지 전달을 통해 이루어짐
- 오류 감지
- CPU, 메모리, I/O 장치, 유저 프로그램 등에서 발생
- 각 오류에 대해 정확하고 일관된 처리를 보장
자원 관리
- 자원 할당
- 여러 유저들 또는 여러 Job들이 동시에 실행되고 있을 때, 각각 자원을 할당시켜 주어야 함
- Accounting
- 어떤 유저가 얼마나 많은 자원을 사용하는지 추적해야 함
- Protection / Security
- 프로세스 간에 서로 간섭하지 못하도록 해야 함
- 자원에 대한 모든 접근 제어를 보장하는 것을 수반해야 함
OS의 구성 요소
- 프로세스 / 스레드 관리
- 프로세스 동기화
- 메모리 관리
- 가상 메모리 관리
- 파일 시스템 관리
- 저장소 관리
- I/O 관리
- Protection / Security
Unix는 시스템 프로그램 / 커널로 구성됨.
커널
- 물리적 하드웨어부터 시스템 콜 인터페이스까지
- 파일 시스템, CPU 스케줄링, 메모리 관리 등을 제공
'OS' 카테고리의 다른 글
Context Switching에서의 Thread와 Process의 관계 + PCB, TCB (2) | 2020.05.30 |
---|---|
컴퓨터 자원의 구조와 동작, RAM과 Disk에 대해 (0) | 2020.05.26 |
[OS] 정리7 : 가상 메모리 (0) | 2018.09.27 |
[OS] 정리6 : 메모리 관리 (0) | 2018.09.26 |
[OS] System call, Interrupt, Trap, 등 (1) | 2018.09.24 |
[OS] 정리5 (0) | 2018.09.24 |
[OS] 정리4 (0) | 2018.09.24 |
[OS] 정리3 (0) | 2018.09.24 |
[OS] 정리2 (0) | 2018.09.23 |
pintos information (0) | 2014.02.13 |