이벤트와 인터럽트(Interrupt)
- CPU가 프로그램을 실행하고 있을 때, IO등의 장치나 예외 상황이 발생하여 처리가 필요한 경우에 CPU가 해당 처리를 할 수 있도록 CPU에 알려줘야 함
- CPU가 실행하는 명령은 하나인데 다른 장치와 어떻게 커뮤니케이션을 할까?
- 파일읽기를 하는동안 프로세스가 block상태가 되는데 읽기가 끝나면 인터럽트가 알려준다.
- 프로세스 running중에 스케쥴러가 이를 중단을 시키는 선점형 스케쥴러를 구현하기 위해 필요하다.
- 이벤트가 발생하고 처리하는것은 운영체제가 한다.
- ex
- 입출력 하드웨어 등의 장치 이슈 발생
- 파일 처리가 끝났다는것을 운영체제에 알려주기
- 운영체제는 해당 프로세스를 block state에서 ready state로 프로세스 상태 변경하기
- 에외 상황
- 0으로 나누기
- CPU가 실행하는 순간 문제가 생김 (프로세스가 멈춘다) 프로세스를 죽여야 한다.
- 운영체제가 해당 프로세스 실행 중지/ 에러 표시
- 0으로 나누기
- 입출력 하드웨어 등의 장치 이슈 발생
주요 인터럽트
- 0으로 나누는 코드 실행시
- 프로세스를 끄고 에러 표시를 보여준다.
- Floating point exception (core dumped) 에러를 보여준다.
- 타이머 인터럽트
- 하드웨어로 부터 일정 시간마다 타이머 인터럽트를 운영체제에 알려준다.
- 선점형 스케쥴러를 위해 필요하다.
- IO(입출력) 인터럽트
- 프린터, 키보드, 마우스, 저장매체(HDD, SSD)
- 내부인터럽트 & 외부 인터럽트
- 내부 인터럽트(소프트웨어 인터럽트)
- 프로그램 내부에서 발생
- 0으로 나누기
- 사용자 모드에서 허용되지 않은 명령 or 공간 접근(포인터 접근 실수)
- 계산결과 Overflow/ Underflow
- 프로그램 내부에서 발생
- 외부 인터럽트(하드웨어 인터럽트)
- 주로 하드웨어에서 발생하는 이벤트 (프로그램 외부)
- 전원 이상
- 기계 문제
- IO 관련 이벤트
- Timer 이벤트
- 주로 하드웨어에서 발생하는 이벤트 (프로그램 외부)
- 내부 인터럽트(소프트웨어 인터럽트)
인터럽트 내부 동작
-
시스템 콜 인터럽트
-
시스템콜 실행을 위해서는 강제로 코드에 인터럽트 명령을 넣어, CPU에게 실행 시켜야 한다.
-
실제 코드
- eax 레지스터에 시스템 콜 번호를 넣고
- ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고
- 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨줌 (시스템 콜에 해당하는 번호)
-
123456mov eax, 1 //시스템콜 번호 system call number (sys_exit)mov ebx, 0 // 인자 file descriptorint 0x80 // 소프트웨어 인터럽트 명령 . CPU 명령어 call kernel> int 는 OP code이다. (연산 종류)> 0x80 : Interrupt Number (systemcall의 인터럽트 번호가 0x80이다.)
cs
-
- 시스템 콜 인터럽트 명령을 호출하며
- 0x80 → CPU는 User Mode를 Kernel Mode로 바꿔준다.
2. IDT( Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행함
- system_call()함수가 있다.
- 이벤트 번호 : 실행코드의 주소 (함수)
- eax 에 담긴 systemcall number에 매칭되는 kernel function을 호출한다.
3. kernel function(system call) 수행 후
- 해당 시스템콜 함수 실행후, 다시 커널 모드 → 사용자 모드 , 다시 해당 프로세스 다음 코드 진행
-
인터럽트와 IDT
- 인터럽트는 미리 정의되어 각각 번호(이벤트를 발생 시키는)와 실행 코드를 가리키는 주소가 기록되어 있다.
- IDT(어디)에 컴퓨터 부팅시(언제) 운영체제가 운영체제 내부코드를(커널 영역) 기록한다.
- ex
- 항상 인터럽트 발생시 , IDT를 확인
- 커널 모드로 변경
- 시스템콜 인터럽트 명령은 0x80 번호가 미리 정의
- 인터럽트 0x80에 해당하는 운영체제 코드는 system_call()이라는 함수
- 즉, IDT에는 0x80 → system_call()와 같은 정보가 기록되어 있음
- 리눅스 ex
- 0~31 : 예외상황(내부/소프트웨어 인터럽트)
- 32~47 : 하드웨어 인터럽트 (변경가능)
- 128 : 시스템 콜
- 인터럽트는 미리 정의되어 각각 번호(이벤트를 발생 시키는)와 실행 코드를 가리키는 주소가 기록되어 있다.
-
인터럽트 우선순위
- 여러 장치에서 인터럽트가 동시에 발생하거나 인터럽트 서비스 루틴 수행중 인터럽트가 발생할 경우 우선 순위를 따져서 처리한다.
- 전원 이상 → 기계 착오 → 외부 신호 → 입출력 → 명령어 잘못 → 프로그램 검사 → SVC (SuperVisor Call)
- 일반적으로 하드웨어 인터럽트가 소프트웨어 인터럽트보다 우선 순위가 높고 내부보다는 외부 인터럽트의 우선 순위가 더 높다.
'취업 준비 > 운영체제' 카테고리의 다른 글
프로세스간 커뮤니케이션(IPC) (0) | 2020.12.30 |
---|---|
프로세스와 컨텍스트 스위칭 (0) | 2020.12.30 |
프로세스 상태와 스케쥴링 (0) | 2020.12.30 |
스케쥴링 알고리즘 (2) | 2020.12.30 |
프로세스 스케쥴링 기초 (0) | 2020.12.24 |