virtual
물리 하드웨어 시스템에서 여러 시뮬레이션 환경이나 전용 리소스를 생성해주는 기술
가상화 한다는 말의 의미
어떻게 다른 OS들을 사용할까?
그럼 어떻게 이런 명령어들을 이해해서 각각 OS를 구동할까?
hypervisor 유형
하드 웨어 위에 하이퍼바이저가 올라감, HOST OS가 없음. 직접 하드웨어에 설치됨. 하이퍼바이저가 다수의 VM을 관리하는 형태다. Type2보다 성능은 좋은데 비용이 더듬(여러 하드웨어 드라이버를 세팅해야함) → Type 1
OS 위에 하이퍼바이저가 올라감, HOST OS가 있고 그 위에 GUEST OS 올림 → Type 2
Time-sharing system
Context Switching
context switching 때 해당 CPU는 아무런 일을 하지 못함. 따라서 컨텍스트 스위칭이 잦아지면 오히려 오버헤드가 발생해 효율이 떨어짐
Scheduler
한정적인 메모리를 여러 프로세스가 효율적으로 사용할 수 있도록 다음 실행 시간에 실행할 수 있는 프로세스 중에 하나를 선택하는 역할
1) 스케줄링 큐 → 프로세스를 관리하는 큐
2) 스케줄러 종류
Round Robin - 스케줄링 기법
priority
Thread Control Block
cf) 같은 프로세스에서의 스위칭에 대해서는 TCB 정보만 저장하면 된다. 하지만 다른 프로세스 간의 스위칭을 할 때에는 PCB / TCB 정보를 모두 저장해야 한다.
Timer Interrupt
마이크로프로세서의 내부 시계를 이용하여 일정 시간일 때 발생되는 인터럽트를 타이머 인터럽트라고 함.
Interrupt
내부 인터럽트(소프트웨어 인터럽트) vs 외부 인터럽트(하드웨어 인터럽트)
IDT란?
인터럽트 핸들러
Timer Sleep
Synchronization
안녕하세요, 인터럽트에 대해 질문이 있습니다. 예를 들어 I/O 이벤트가 발생하면 CPU가 입출력관리자에게 입출력 명령을 보내고 입출력 관리자가 명령 받은 데이터를 메모리에 가져다놓거나 메모리에 있는 데이터를 저장 장치로 옮기고 데이터 전송이 완료되면 CPU에게 신호를 보내는 것이 인터럽트 방식의 동작 과정이고 이 신호가 인터럽트라고 알고있습니다. 인터럽트가 발생하면, CPU는 수행중이던 task를 잠시 멈추고, IVT(interrupt vector table)에서 발생한 인터럽트의 종류를 파악한 뒤 실행하던 task 정보를 TCB에 저장하고 수행할 ISR(interrupt service routine)으로 포인터를 따라 가서 인터럽트 처리가 끝난다면 task 우선순위를 따져서 task를 restore 시킨다고 이해했고 restore해서 return하는 이 시점이 context switching이라고 이해했습니다. 일단 제가 이해한 이 흐름이 맞는지 궁금하고, 제가 이해한 것이 맞다면 인터럽트 발생 시점은 입출력 관리자가 CPU에게 받았던 명령을 다 수행하고 신호를 보낼때라고 이해하면 되는지 궁금합니다. I/O가 이벤트가 발생해서 CPU가 입출력 관리자에게 입출력 명령을 보내는 시점부터가 인터럽트 방식의 동작과정이라고 제가 보는 책에 나와있는데 그럼 저 시점부터 인터럽트가 발생했다고 봐야하는 것인지 헷갈려서 질문드립니다.
말씀하신 흐름이 정확합니다. 보다 자세한 이해를 위해 PintOS에서 Disk I/O가 처리되는 과정을 예시로 설명 드리겠습니다.
devices/disk.c
의disk_read
또는disk_write
함수에 의해 disk 장치에게 pio command issue (link)- 이후 cpu는 semaphore를 이용해 disk 작업 완료시 까지 대기 (link)
- disk는 cpu로 부터 요청받은 작업을 완료 후 cpu에게 interrupt issue
- disk I/O의 ISR (
devices/disk.c
의interrupt_handler
)에서 작업 완료를 확인 후 disk에게 ack 수행 & semaphore up (link)- cpu는 전송된 데이터와 함께 disk I/O 루틴 exit
말씀드린 1~5 과정이
인터럽트 방식의 I/O 처리
이고, 3 과정에서 disk에 의해 발생한 event가인터럽트
라고 이해하시면 될 것 같습니다.책에서 1 과정을 포함한 1~5 과정을 전부인터럽트 방식의 동작과정
이라고 표현한 것은, 단순히 인터럽트 방식이 아닌 다른 방식으로 동작하는 I/O (PIO, polling, etc...)와 구별하기 위한 의도라고 추측됩니다.
조교님 말씀과 코치님의 조언을 듣고 흐름을 다시 정리해보았습니다. 외부(hardware) 인터럽트가 발생할 때 CPU는 인터럽트 종류를 파악 후 task 정보를 TCB에 저장을 하고 그 후엔 커널에 존재하는 "인터럽트 핸들러(혹은 ISR)"가 인터럽트 처리를 하고, 우선순위를 따져서 task를 restore해서 return 하는 순간 context switching이 일어난다 라고 이해를 했습니다. 또, 답변주신 5번의 내용은 sema_up이 될 때 context switching이 일어나는 것이 아니고 disk I/O 루틴이 종료되면서 context switching이 일어나는 것이며 그 말은 즉, 인터럽트 핸들러는 context switching 되기까지 관여하고 있고 그래서 context switching은 하드웨어(CPU)가 아닌 커널에 있는 인터럽트 핸들러가 하는 것이라고 이해하면 될까요?
넵 맞습니다.
threads/intr-stubs.S
의intr_entry
루틴에서 TCB에 task context 저장 후intr_handler
를 통한 ISR 호출, ISR 완료 후 본래 context restore,iretq
instruction을 사용하여 interrupt context에서 본래 실행되고 있던 program의 context로의 context switch를 순차적으로 수행하는 것을 확인할 수 있습니다.첨언드리자면,
하드웨어(CPU)가 아닌 커널에 있는 인터럽트 핸들러가 하는 것
이라는 설명은 다소 오류가 있습니다. interrupt context에서의 복귀는 CPU가 앞서 말씀드린 특정 instructioniretq
를 실행하면서 수행되기 때문입니다.
뭔가 이번주는 정리를 뒤죽박죽한것 같다. 키워드 위주로 공부하다보니 하나 하나는 아는데 흐름이 이어지지가 않았다. 그래서 하루는 하루종일 운영체제 책만 주구장창 파보기도 하고, 코드부터 보고 공부해보기도하고 OS 첫 주라 시행착오를 많이 겪은거 같다. priority donation을 하루 남기고 끝내서 advanced scheduler은 구현을 못할 것 같았지만 하는데까지 해보자 했는데 개념 공부 중 인터럽트에 막혀서 마지막 날을 쏟았다. 시간이 오래걸려도 이해를 해서 뿌듯했지만 그것도 잠시.. 큰 흐름만 이해한것이지 모든 것을 이해한게 아니었다. 결국 advanced scheduler는 하지 못했다.. pintos 너무 어렵다.. 으아아아아아 최고보단 최선을 다해야겠다..!!
WEEK08 과제 구현 소스 코드 - https://github.com/SWJungle4A/pintos12-team04/tree/yeopto/priority-scheduling