Operating System 1 - Interrupt & Process

 OS는 HW와 APP 사이에서 효율적으로 resource의 control을 할당하는 역할을 한다. HW는 I/O, CPU, memory 등이 해당하고, application은 HW의 resource를 사용하여 사용자의 요구를 처리한다.

2-POV of OS
- User view : User Interface 등 사용자의 입장에서 빠르고 편리함에만 중점을 두고 리소스의 효율적 사용은 고려하지 않는다.
- System view : 여러 프로그램들 사이의 자원을 할당하고 제어하는 역할을 맡음. 이 때 자원은 HW 적인 것 뿐 아니라 휴대용 기기의 배터리 등도 자원 관리에 해당한다.

Kernel : OS의 Core, 컴퓨터가 실행되기 위해 반드시 필요한 것 (항상 실행되고 있는 것)
커널(OS)의 세 가지 objective : Conveniency, Efficiency, Ability to evolve.
*system program : 프린터 등을 가동하는 프로그램

Computer System = Processor + Memory + I/O + System Bus
- Processor : 컴퓨터가 수행하는 연산을 하고, data에 대한 함수를 실행한다.
- Main Memory : data와 Program을 저장함. 일반적으로 main memory는 휘발성이므로 전원이 꺼지면 모든 데이터가 삭제된다.
- I/O module : Disk 등의 Secondary memory device, LAN 등 통신 장치, Terminal(입력, 커맨드를 담당하는 부분). 이들과 CPU는 같이 실행 가능하다.
- System Bus : 독립적으로 구성된 메모리와 CPU, I/O의 데이터를 모두 연결해 상호작용하게 만드는 것.

* instruction은 그 instruction이 실행되기 위해 필요한 data들이 연결되어 memory에 저장된다.
I/O module은 입력을 받기 위한 buffer가 존재한다.

CPU의 Register는 Instruction을 저장하는 IR, Program Counter인 PC, Execution Unit, MAR(Memory address register), MBR(Memory buffer register), I/O AR, I/O BR 등이 존재한다.

Instruction Execution steps : Start - Fetch Next Instruction - Execute instruction - Halt.
앞서 얘기한 것 처럼 instruction 들이 메모리에 저장되어 있고, CPU는 이들을 하나씩 가져와 실행한다. 이를 가리키는 PC의 값이 하나씩 증가하여 다음 Instruction을 가리키는 식으로 실행된다.

Interrupts : Program, Timer, I/O, HW failure
운영체제는 Interrupt 기반으로 작동한다. 일반적으로 CPU의 속도가 Memory, I/O 등의 속도보다 너무 빠르기 떄문에 잠시 멈춰져야 한다. 따라서 interrupt라는 것을 통해 CPU의 작업을 멈춤으로써 효율을 올리는 것.

앞서 컴구 시간에 배운 것 처럼 I/O와 캐시를 제외한 메인 메모리, 하드디스크 등은 CPU에 비해 몇천만배 느리므로 엄청난 시간이 낭비되게 된다. 그래서 이런 낭비를 막기 위해 I/O 등이 발생할 경우 해당 device에 명령만 내리고 다시 CPU는 하던 일을 진행한다. 그리고 I/O 가 완료되었다는 알림 (= interrupt)가 발생하면 하던 작업을 멈추고 그 I/O를 처리하고 다시 돌아와서 하던일을 하는 식으로 interrupt가 작동한다.

- Program : 잘못된 명령을 받거나 오버플로우가 날 경우, 또는 허가되지 않은 메모리 영역을 침범할 경우 등에서 발생하는 interrupt.
- Timer : CPU 내부에 존재하는 clock. 이 clock이 주기적으로 interrupt를 발생시킨다.
- I/O : 사용자의 입력에 따라 I/O device가 발생시키는 interrupt로 CPU에게 해당 사항을 알려주는 역할을 한다.
- HW failure : 메모리 할당 및 전원 문제로 시스템이 다운되는 경우.

그래서 앞서 instruction execution step에서 interrupt flag와 handler를 추가하여 매 instruction의 실행을 완료한 뒤 interrupt의 발생을 체크하고, 만약 발생했다면 handler에게 명령을 내려 해당 interrupt를 처리하게 된다.

이 떄 CPU가 실행하고 있던 작업과 위치 주소인 PSW와 PC를 control stack에 저장하고 인터럽트를 처리한다. 그리고 이를 처리하고 다시 돌아와서는 스택 값을 꺼내 계속 실행하면 된다. 이는 비단 CPU 뿐 아니라 CPU가 실행하고 있던 소프트웨어(프로그램)도 동일하게 수행되어 하던 작업을 저장하고 인터럽트를 처리한 뒤 다시 돌아온다.

즉, 요지는 CPU가 instruction을 실행하고 있을 때 다른 event가 발생하더라도 해당 처리를 하고 다시 돌아와 그 처리에 대한 다음 작업이 필요할 때 까지 원래 하던 instruction을 실행하고 있다는 것이다.

Multiple Interrupt : 여러 개의 interrupt가 동시에 발생할 경우

- 기존에 interrupt가 있다면 새로 생긴 것은 뒤로 밀어놓고 기존 것 부터 먼저 처리 (Sequential)
- Priority에 따라 중요한 것을 먼저 처리 (Nested)


Storage Structure = Main Memory + Secondary Storage

- Main Memory : CPU가 직접 접근하는 유일한 메모리. 휘발성이며 Random Access이다. (원하는 위치를 바로 읽을 수 있다. Hash와 동일. 이와 반대되는 것은 tape 등의 Sequential Memory)

- Secondary Memory : 메인 메모리가 할 수 없는 부분을 커버해주는 역할. HDD, SDD(NVM) 등 비휘발성 메모리이다.


* bit, byte와 달리 Word는 System Architecture에 따라 4byte, 8byte 등 달라질 수 있다.
그리고 일상생활에 사용하는 K, M 등과 달리 크기 용량을 2의 승수로 나타내는 경우 KiB, MiB 처럼 i를 넣어 표기한다.
memory hierarchy에서 아래로 내려갈 수록 안정성이 올라간다. 속도가 느려진다는 단점 빼고 크기, 가격, 안정성 등 모두 HDD가 SDD보다 낫다. 다만 OS 등 반응속도가 중요한 것은 빠른 곳에 놓고, 데이터를 저장해야하는 경우는 HDD 등이 훨씬 낫다.
특히 외부적 충격, 긴 기간 접속하지 않는 등 극한 상황에서 데이터 보존, 백업 등에는 CD, tape 등이 가장 좋다.

Direct Memory Access Structure
I/O 처럼 작은 byte의 interrupt가 아니고 영화 한 편 처럼 몇 기가씩 하는 데이터를 주고 받을 경우, 매 바이트마다 인터럽트가 발생하면 낭비가 너무 심하게 된다. 따라서 특정 크기(블록, KB) 단위로 interrupt를 처리하라는 명령을 내리는 것이 DMA이다.

Computer system architecture
Multiprocessor : 하드웨어적으로 CPU를 여러 개 연결한 것. 이 경우 속도가 빨라지고 신뢰성이 올라가는 장점이 있다.


- 비대칭형(Asymmetric) : 특수 목적의 프로세서를 분리하는 경우, high availability, 가용성을 높이기 위해 사용. 주로 비상시 백업을 하기 위해 사용됨. 어떤 경우에도 서비스를 유지시키는 역할. (신뢰성 상승)
-대칭형 (Symmetric) : 두 프로세서가 같은 역할을 하는 경우, Load Balancing, 수강 신청 등에서 발생하는 과부하를 해결하기 위해 같은 작업을 하는 것을 여러 개 두는 것.

일반적으로 이들은 사용되는 부분이 다른 것이지 총체적인 서비스를 제공할 때는 같이 사용하게 된다.

멀티 프로세서의 경우, 메인 메모리는 공유하지만 레지스터와 캐시는 각 cpu 안에 존재하여 정보 공유가 어렵다. 또한 메모리, 시스템 버스 등 다른 자원들을 공유하므로 경쟁이 발생하여 성능이 N배로 높아지지 않는다.

Multicore : 위와 달리 각 cpu를 합친 캐시/시스템 버스가 존재하여 경쟁이 발생하지 않고 더 효율적인 작업이 가능하다. 이도 멀티 프로세서의 범주에 포함된다.

Non-Uniform Memory Access System : 각 CPU 마다 메모리를 할당받아 자신의 영역만 사용하게 하는 것. 이 경우에도 자원을 선점하기 위한 경쟁이 발생하지 않는다. 그러나 다른 CPU의 영역이 필요할 경우 요청과 응답의 오버헤드가 발생하는 단점이 있다.

Clustered System : 묶는 단위가 CPU가 아니라 전체 컴퓨터 시스템이 되어 프로그램을 분배 할당하여 처리하는 것. 이 경우에도 앞서와 동일하게 대칭형, 비대칭형으로 나누어진다.

이런 분산형 시스템의 경우, 이에 특화된 프로그래밍 방법을 통해 병렬화 코딩을 하고, 합쳐주는 과정을 따로 해주어야 한다.


Multiprogramming(Batch System) : 위와 달리 소프트웨어적으로 병렬화를 지원하는 것. 여러 프로그램을 동시에 실행할 때 OS가 할당해주는 것.
특정 프로그램이 I/O 등을 위해 기다리는 경우, 다른 프로그램을 실행하도록 할당하여 CPU가 비는 시간을 줄일 수 있다.

- Process : Program in execution, 현재 실행되고 있는 프로그램

Multitasking(Timesharing, 시분할 시스템) : 여러 프로그램에 대해 CPU가 할당 받은 작업을 매우 잘게 쪼개어 돌아가며 실행함으로써 사용자가 마치 실시간으로 응답받고 있다고 느낄 수 있게 하는 것.

예를 들어 서로 다른 4명의 사용자의 요청을 1초에 걸려 하나씩 처리하는 것 보다, 0.01초씩 쪼개어 4명의 task를 돌아가면서 실행하여 4명 모두가 비슷한 시간이 걸리도록 하는 것.

이 때 프로세스가 CPU 자신의 캐시, 메모리에 탑재되지 않으면 컴구에서 배운 버추얼 메모리를 사용하여 스와핑하며 실행한다.

Dual mode
Os는 user mode, kernel mode로 나누어져 있다. 사용자가 fopen() 명령어를 사용하면, 해당 명령어는 커널 모드에서 동일한 명령어로 번역되어 실행되게 된다.
이는 컴퓨터를 실행하는데 크리티컬한 부분을 보호하기 위해 이렇게 구역을 분리해 놓는 것이다.

Timer : 무한 루프 등에 빠지는 것을 방지하며 프로세스의 지나친 긴 자원 점유 등을 막는다. 이는 일정 clock 마다 count를 세고, 이 값이 특정 값이 되면 무조건 interrupt를 발생하도록 만듦으로써 작동한다.


Process Management
User & system process를 생성/ 삭제, 프로세스의 resume, suspend, 프로세스 동기화, 소통, deadlock handling 등의 작업이 필요하다.

Deadlock : 두 프로세스가 서로 사용하고 있는 상대의 리소스가 필요해 무한 대기에 빠지는 교착 상태.

- Program : passive entity
- Process : active entity

모든 프로세스는 task를 완료하기 위해 cpu, memory 등 HW resource가 필요하다. 이런 리소스는 각 프로세스가 사용하고 반납되어야 한다.
같은 프로그램 내에서 여러 개의 프로세스를 만들어 내는 것이 multi thread이다. 이 때 각 Thread 마다 PC가 따로 존재한다.

Memory Management
프로그램을 실행하기 위한 instruction과 data는 반드시 main memory에 올라와 있어야 한다. 따라서 캐시 및 메모리 정책이 CPU의 사용률을 결정하는 중요한 요소가 된다.
누구에 의해 메모리가 사용되고 있는지, 누구에게 할당할 지, 메모리 공간을 할당하고, 해제 하는 등의 활동이 필요하다.

Register는 컴파일러에 의해, cache는 CPU HW 정책에 따라 결정된다. OS가 관리하는 것은 Main memory와 그 이하가 된다.


File System
physical을 logical로 나타낸 것이 파일. 리눅스 기반 기기들은 모든 데이터 관리를 파일 기반으로 한다.
일반적으로 디렉토리로 관리되고, OS가 이들의 access control, 생성/제거, 기본형제공, mapping(어디 있는지 알려주는 것), backup 등을 모두 담당한다.

댓글

이 블로그의 인기 게시물

IIKH Class from Timothy Budd's introduction to OOP

Compiler 9 - Efficient Code generation

Software Engineering 10 - V&V, SOLID principle