2019년 01월 02일 <인터럽트 종류>
인터럽트 처리 예
- CPU가 프로그램을 실행하고 있을때.
- 입출력 하드웨어 등의 장치 이슈 발생
->파일 처리가 끝났다는 것을 운영체제에 알려주기
->운영체제는 해당 프로세스를 block state에서 실행대기 상태로 프로세스 상태 변경하기
- 또는 예외 상황이 발생
-> 0으로 나누는 계산이 발생해서, 예외 발생을 운영체제에 알려주기
-> 운영체제가 해당 프로세스 실행중 중지/에러 표시
이벤트와 인터럽트
>인터럽트는 일종의 이벤트라고 불림
>이벤트에 맞게 운영체제가 처리
주요 인터럽트 (Interrupt)
1. 계산하는 코드에서 0으로 나누는 코드 실행시 (Didvide-by-Zero Interrupt)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main(){ printf("Hello World!\n"); int data; int divider =0; data = 1/ divider; // 1/0 --> 중지 에러 return 0; } | cs |
> 1/0 에서 운영체제는 interrupt 하여 프로세스를 종료함
2. 타이머 인터럽트
>선점형 스케쥴러를 위해 필요
- 하드웨어로 부터 일정 시간마다 타이머 인터럽트를 운영체제에 알려줌
3. 입출력(IO) 인터럽트
- ex) 프린터, 키보드, 마우스, 저장매체(SSD)
인터럽트 종류
- 내부 인터럽트 / 소프트웨어 인터럽트
>주로 프로그램 내부에서 잘못된 명령 또는 잘못된 데이터 사용시 발생
- 0으로 나눴을 때
- 사용자 모드에서 허용되지 않은 명령 또는 공간 접근시
+ C언어 포인터가 잘못도니 주소를 가르켰을때 에러
- 계산 결과가 Overflow/Underflow 날 때
+ int(32bit) 2^31 + 2^31 --> Overflow
- 외부 인터럽트 / 하드웨어 인터럽트
>주로 하드웨어에서 발생된느 이벤트 (프로그램 외부)
-전원 이상
-기계문제
-키보드 등 IO 관련 이벤트
-Timer 이벤트
2019년 01월 02일 <인터럽트 내부 동작>
시스템 콜 인터럽트
- 시스템 콜 실행을 위해서는 강제로 코드에 인터럽트 명령을 넣어, CPU에게 실행 시켜야 한다.
- 시스템 콜 실제 코드
1. eax 레지스터에 시스템 콜 번호를 넣고
2. ebx 레지스터에는 시스켐 콜에 해당하는 인자값을 넣고,
3. 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨줌
mov eax, 1 //시스템 콜 번호
mov ebx, 0 //시스템 콜 인자
int 0x80 //소프트웨어 인터럽트 명령 (int 는 인터럽트 명령어임) <int>==<opcode>
인터럽트와 시스템 콜 (고급)
-시스템콜 인터럽트 명령을 호출하면서 0x80값을 넘겨줌
1. CPU는 사용자 모드를 커널 모드로 바꿔줌
2. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행함
3. system_call() 함수에서 eax 로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템콜 함수로 이동
4. 해당 시스템콜 함수 실행 후, 다시 커널 모드에서 사용자 모드로 변경하고, 다시 해당 프로세스 다음 코드 진행
사용자/커널 모드와 프로세스, 인터럽트
ex)
Process A(User) --<SystemCall>--> SystemCallHandler(Kernel) --> Process A --<Timer Interrupt(A의 시간 만료)>--> Process Scheduler(Kernel)-->Process B
인터럽트와 IDT
- 인터럽트는 미리 정의되어 각각 번호와 실행 코드를 가리키는 주소가 기록되어 있음
- 어디에? IDT (Interrupt Desciptor Table) 에 기록
+IDT -> 이벤트 번호: 실행코드의 주소 (함수)
- 언제? 컴퓨터 부팅시 운영체제가 기록
- 어떤 코드? 운영체제 내부 코드 => 커널모드, 커널영역
- 앞에 시스템콜 에를 보면
1. 항상 인터럽트 발생시, IDT를 확인
2. 시스템콜 인터럽트 명령은 0x80 번호가 미리 정의
3. 인터럽트 0x80 에 해당하는 운영체제 코드는 system_call()이라는 함수
4. 즉, IDT에는 0x80 -> system_call()와 같은 정보가 기록되어 있음
- 리눅스의 예
- 0~31: 예외상황(내부/소프트웨어) 인터럽트 (일부는 정의안된 채로 남겨져 있음)
- 32~47: 하드웨어 인터럽트 (주변장치 종류/갯수에 따라 변경 가능)
- 128: 시스템 콜
인터럽트와 프로세스
1 .프로세스 실행 중 인터럽트 발생
2. 현 프로세스 실행 중단
3. 인터럽트 처리 함수 실행 (운영체제) (커널모드)
4. 현 프로세스 재실행
'군대에서 한것 > Operating System' 카테고리의 다른 글
190128/27/컨텍스트 스위칭 원리 (0) | 2019.01.28 |
---|---|
190117/25,26/프로세스 구조, 힙 그리고 스텍 오버플로우 (0) | 2019.01.17 |
190101/19~20/스케쥴링 알고리즘 조합 & 인터럽트란 (0) | 2019.01.01 |
181225/18/선점형과 비선점형 스케줄러 (0) | 2018.12.23 |
181223/17/프로세스 상태기반 스케줄링 알고리즘 기본 (0) | 2018.12.23 |