운영체제
- 운영체제는 하드웨어를 관리하고, program 실행을 제어하는 프로그램을 뜻한다.
- C, assembly 등 low level 언어를 사용하고, 운영체제 없이는 program 실행이 불가하다.
운영체제의 역할
- 하드웨어 관리
- access to I/O devices
- access to files
- accounting: 하드웨어 사용의 통계 정보 관리를 뜻한다. Windows에서는 장치 관리자와 작업 관리자 등을 통해, Linux에서는 prod directory 내의 devices, interrupt 파일을 통해 확인할 수 있다.
- error detection: 예시로는 segmentation fault가 있다.
- Program 실행
- Scheduling: CPU가 하나 뿐이기 때문에 여러 개의 process (실행 중인 program) 중 하나를 선택해 process 수행을 제어한다. 특정 주기 (Linux의 경우 10ms)마다 선택을 바꾼다.
- Error reporting
운영체제의 위치
- 운영체제는 application program과 하드웨어 사이에 존재한다.
- 하드웨어의 안정성을 위해 application program은 하드웨어에 직접 접근할 수 없고, 운영체제를 거쳐야 한다. 이는 운영체제가 제공하는 API를 program이 호출하면서 이루어진다. 이를 system call이라고 한다.
- user level에 속하는 system program과 application program은 하드웨어 접근을 위해 반드시 system call을 해야 한다.
운영체제에 대해 정리하자면,
1. OS is a resource allocator: 하드웨어를 어떤 process에 어떻게 할당할지 결정한다.
2. OS is a control program: program들의 실행을 제어해 잘못된 접근을 방지한다.
3. 이 역할들을 담당하는 운영체제의 핵심 부분을 kernel이라고 한다. 하드웨어와 소프트웨어 사이의 통신을 관리하며, 시스템 리소스(CPU, 메모리 등)의 할당 및 관리, 저수준의 하드웨어 추상화, 보안, 프로세스 관리, 파일 시스템 관리 등을 담당한다. kernel을 제외한 program들은 system program과 application program이다.
DMA와 interrupt
I/O structure
- 한 CPU에는 여러 개의 입출력 장치(모니터, 키보드 등)이 연결되어 있다. 각 장치들에는 그들의 동작을 관리하는 device controller이 있고, 이는 각자의 local buffer을 가진다. 입출력이 일어날 때 main memory와 local buffer들 사이에 data가 이동한다.
- data를 main memory에 읽고 쓰는 연산을 I/O transaction 이라고 한다. 이는 bus라는 신호를 운반하는 연결 매체를 통해 전달된다. bus는 모든 controller들이 memory와 interact하는 매개체인 것이다. I/O transaction은 원칙적으로 CPU의 주관 하에 이루어지게 된다.
- 하지만 CPU가 모든 이동을 주관하게 되면 문제가 생긴다. CPU에 과한 부담이 가고, CPU가
I/O transaction에 관여하는 동안 다른 일을 할 수 없게 되어 효율성이 떨어지게 된다.
Direct Memory Access (DMA)
- CPU의 부담을 덜고 효율성을 추구하기 위해 CPU의 간섭 없이 device controller가 직접 main memory에 접근해 I/O transaction을 수행할 수 있게 해주는 것을 DMA라고 한다.
- CPU는 데이터 전송을 시작하기만 하고, 이후의 과정은 controller에게 맡기는 것이다. 이로써 CPU는 그 동안 다른 일을 할 수 있게 된다. DMA로 인해 CPU의 multitasking이 가능해 진 것이다.
- DMA 없이는 device와 CPU가 concurrently execute 될 수 없다. 이로 인해 DMA는 scheduling과 밀접한 관련이 있다.
Interrupt
- DMA를 통해 I/O transaction이 이뤄지는 동안 CPU는 다른 일을 하고 있기 때문에, 데이터 이동이 끝나면 controller는 CPU에게 I/O transaction이 끝났다는 신호를 보내야 한다. 이를 interrupt라고 한다.
- interrupt 는 실행 중인 프로세스를 중단시키고 운영 체제가 지정한 다른 작업(인터럽트 핸들러 또는 서비스 루틴)을 수행하도록 한다.
- Interrupt는 두 가지로 분류된다.
- Hardware Interrupt: device controller이 CPU에게 보내는 것이다.
- Software Interrupt(trap): exception과 system call이 있다.
- interrupt와 trap은 두 부분에서 차이를 보인다.
- interrupt는 외부의 하드웨어 장치에 의해 발생하는 반면, trap은 주로 소프트웨어가 의도적으로 발생시키는 이벤트나, 프로그램 실행 중 발생하는 오류의 의한다.
- interrupt는 현재 실행 중인 프로세스와는 독립적으로(asynchronous) 발생할 수 있는 반면, trap은 프로세스의 실행 흐름 내에서 예측 가능한 지점에서 동기적으로 발생(synchronous)한다.
- 각 interrupt에는 고유의 handler이 존재한다.
Interrupt Service Routine (ISR)
- interrupt를 받으면 다른 process를 실행시키던 CPU는 동작을 멈추고, interrupt service routine (ISR)을 호출한다. ISR은 unconditionally, immediately 이루어지며, source들이 interrupt vector라는 table에 관리된다.
- ISR은 interrupt handler라고도 불리며, 완료되면 CPU는 다시 원래의 process를 수행한다. 원래의 process로 돌아갈 경우를 대비해, ISR 실행 전에 원래의 주소를 저장한다. 다만, scheduling 결과에 따라 다른 process로 넘어갈 수 있다.
- handler의 코드는 짧고 간결하게 구현되어야 한다. unconditionally 그리고 immediately 실행되기 때문에 loop 등의 구조로 인해 코드가 복잡해지면 다른 process에서 starvation이 발생하기 때문이다.
Interrupt vector
- interrupt가 발생했을 때 실행되어야 하는 ISR의 주소를 가지고 있는 table이다. 이 테이블은 각각의 인터럽트 식별자나 번호에 대응하는 ISR의 시작 주소를 저장하고 있으며, 인터럽트가 발생하면 시스템은 이 테이블을 참조하여 적절한 ISR을 찾아 실행한다.
"An operating system is interrupt driven."
Storage Structure
- Primary Storage: CPU와 직접 상호작용하는 main memory로, DRAM이 많이 사용된다. Volatile하여 전원 공급이 차단되면 메모리가 휘발된다.
- Secondary Storage: Non volatile해 전원 공급 없이도 저장이 가능하다. SSD, HDD, FLASH 등이 사용된다.
- Tertiary Storage: 마찬가지로 non volatile하여 backup 용도로 쓰인다. 예시로 tape, disk 등이 있다.
Caching
- 메모리와 CPU간의 속도 차이를 완화하기 위해 메모리의 데이터를 미리 가져와 저장해 두는 임시 저장소다.
- CPU는 메모리에 접근해야 할 때 cache를 먼저 방문하여 원하는 정보가 있는지 확인한다. 원하는 정보가 있으면 cache로부터 직접 데이터를 빠르게 가져올 수 있다. 없다면 해당 정보가 cache에 복사되어 사용된다.
- cache는 caching되는 원래의 저장소보다 크기가 작다.