환급미션 37일째..
운영체제 - 프로세스와 스케쥴러의 이해 - 07. 인터럽트란?
운영체제 - 프로세스와 스케쥴러의 이해 - 08. 인터럽트 종류
운영체제 - 프로세스와 스케쥴러의 이해 - 09. 인터럽트 내부 동작
- 인터럽트란?
cpu가 프로그램을 실행하고 있을 때, 입출력 등의 장치 (이벤트 발생) 또는 예외상황이 발생했을 때 cpu에 알려서 처리하는 기술
어느 한 순간, cpu가 실행하는 명령은 하나.
위의 그림에서
파일 읽기가 끝나고 block / wait -> running으로 넘어가게 하는 것을 인터럽트라 한다.
- 인터럽트가 필요한 이유
* 선점형 스케쥴러 구현
running 하는 도중 스케쥴러에 의해 ready 상태로 바꿔주는데,
그런 기능이 가능하게 하는 기술이 '인터럽트'
-> 선점형 스케쥴러 구현을 위해 필요하다.
* IO device 와의 커뮤니케이션
IO 처리가 끝났다는 것을 알려주기 위해 인터럽트 기술이 필요하다. (block -> ready state)
* 예외 상황 핸들링
cpu가 프로그램을 실행 중일 때, 입출력 하드웨어 또는 예외상황이 발생할 경우
ex: 하드웨어상의 고장, cpu의 온도 급격한 상승, 1/0(나누기)의 연산을 요청했을 때 등의 상황을
cpu/스케쥴러에 알려줘야 하기 때문에 필요하다.
- 인터럽트 처리 예시
(cpu가 프로그램 실행 중일 때)
* 입출력 하드웨어 등의 장치 이슈
파일 처리가 끝났다는 것을 os에 알려준다 -> os는 해당 프로세스를 block->ready 상태로 변경
* 예외 상황 발생
ex) 0으로 나누는 계산이 발생했을 때, os에 알려준다 -> 해당 프로세스 실행 중지 or error 표시
* 이벤트와 인터럽트
인터럽트 == 일종의 이벤트, 이벤트에 맞게 os가 처리
- 주요 인터럽트 (interrupt) 예시
* 코드에서 0으로 나누는 연산 실행 시 (divide-by-zero interrupt)
-> 컴파일러에서는 에러를 잡을 수 없지만,
divider =0, 0으로 나누는 연산이기 때문에 코드 실행시 에러가 나게 되고,
프로세스를 중지시키고, 에러메시지를 보여준다. (별도 동작이 필요하기 때문에 인터럽트를 날려서 운영체제가 한다)
위와 같이 운영체제가 프로세스를 강제로 죽이고 (끝내고) 화면과 같은 메시지를 보여준다.
== 운영체제 인터럽트 처리 루틴
* 타이머 인터럽트
(타이머 인터럽트를 발생시키는 장치가 컴퓨터 안에 별도의 칩으로 존재)
-> 인터럽트를 일정 기간동안 지속적으로 발생시킴 ex) 100ms마다 프로세스 변경(교체)
-> ex) 운영체제가 그 때마다 변수값++;
cpu가 현재 프로세스를 실행시키고 있는 것과는 별도로
10ms마다 인터럽트가 발생하면서 어느 시점(100ms)이 되면 스케쥴러가 활성되면서 프로세스를 교체할 수 있게 된다.
프로세스 실행과는 별도의 동작 (외부 이벤트) -> 인터럽트 처리 기법을 사용해서 처리한다.
( 선점형 스케쥴러를 위해 필요함 )
* 입출력 (IO) 인터럽트 (여러가지)
프로세스를 실행하던 중
입/출력이 발생하는 이벤트가 발생했을 때 처리하도록 할 수 있게 하는 루틴 또한 '인터럽트'이다.
- 인터럽트 종류
* 내부 인터럽트
프로그램 내부에서 예외상황 발생 (잘못된 명령 또는 잘못된 데이터 사용)
-> 소프트웨어 인터럽트 라고도 한다.
•0으로 나눴을 때
•계산 결과가 overflow / underflow
overflow ex)
int : 보통 32bit
( signed : 부호 o, 31bit / unsigned : 부호 x, 32bit )
but
signed & 31비트를 넘어가는 비트를 사용해야 하는 상황이 발생했을 때
underflow ex)
(-)로 표현할 수 있는 범위의 한계치를 벗어났을 때
•사용자 모드에서 허용되지 않은 명령 or 공간 접근
ex)
(c언어 포인터 : 주소 가리키는 역할) but 주소를 잘못 가리켰을 때
* 외부 인터럽트
주로 하드웨어에서 이벤트 발생 (프로그램 외부)
-> 하드웨어 인터럽트라고도 한다.
•전원 이상
•기기 문제
•IO 관련 이벤트
•Timer 이벤트
- 시스템 콜 인터럽트
시스템 콜 실행을 위해 강제로 코드에 인터럽트 명령을 넣어, cpu에게 실행시켜야 한다.
시스템 콜 실제 코드
•eax 레지스터에 시스템 콜 번호를 넣는다. ( 시스템 콜마다 번호가 매겨져 있다.)
•ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣는다.
•소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨준다.
* 예시
시스템콜 실행 시, (위 예제에서 open 함수 실행)
실제로는 기계어(어셈블리어)로 위와 같이 컴파일된다.
eax, 1 -> 시스템 코드
ebx, 0 -> 인자
int (instruction code, CPU op code) -> 무조건 마지막에 이런 명령어가 들어가게 된다.
-> int : interrupt, 0x80 : 인터럽트 번호(시스템콜 0x80)
- 인터럽트와 시스템 콜 (고급)
시스템콜 인터럽트 명령을 호출하면서 0x80값을 넘겨준다.
-> int라는 op code (instruction code의 하나)가 이 역할을 수행
1. cpu는 사용자 모드를 커널 모드로 변경
2. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행
-> IDT : 인터럽트 번호에 맞는 주소(코드)가 매칭이 되어있음 ( 인터럽트 번호 : 주소(코드) )
-> 0x80 : system_call() 함수가 구현되어 있음 (리눅스의 경우)
3. system_call() 함수에서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템 콜 함수로 이동
-> eax에 ( 시스템 콜 번호 : 함수 )가 매칭되어있음. 함수 call하게 됨
4. 해당 시스템콜 함수 실행 후, 다시 커널 모드에서 사용자 모드로 변경, 해당 프로세스의 다음 코드 진행 (PC)
- 사용자 모드 / 커널 모드와 프로세스, 인터럽트
위의 도표를 살펴봤을 때
각 프로세스들은 사용자 모드에서 실행되고,
system call, timer interrupt는 커널모드에서 실행되는 것을 볼 수 있다.
-> 프로세스와 시스템 콜 등의 전반적인 흐름을 알 수 있다.
- 인터럽트와 IDT(Interrupt Descriptor Table)
컴퓨터 부팅 시 os가 IDT를 기록한다.
인터럽트는 각각 번호(각종 이벤트)와 실행코드를 가리키는 주소가 IDT에 기록되어있다. (이벤트 번호 : 실행코드의 주소)
이러한 코드들은 커널모드/커널영역에 있는 운영체제 내부 코드를 말한다.
•인터럽트 발생 시, 항상 IDT를 확인
•시스템콜 인터럽트 명령은 0x80 번호로 미리 정의되어 있다.
•인터럽트 0x80에 해당하는 운영체제 코드는 system_call()라는 함수 (리눅스의 경우)
•IDT에는 0x80 -> system_call() 와 같은 정보가 기록되어 있다. (시스템콜 위치에 함수 또는 주소)
* 리눅스의 예
• 0~31 : 예외상황 인터럽트 (내부/소프트웨어 인터럽트)
• 32~47 : 하드웨어 인터럽트 (주변장치 종류/갯수에 따라 변경됨)
• 128 : 시스템 콜
-> 0x80을 십진수로 나타내면 128
- 인터럽트와 프로세스
1. 프로세스 실행 중 인터럽트 발생
2. 현재 프로세스 실행 중단
3. 커널모드에서 인터럽트 처리 함수 실행 (os)
4. 현재 프로세스 재실행
- 인터럽트와 스케쥴러
* 선점형 스케쥴러 구현 예시
-> 수시로 타이머 인터럽트 발생
ex)
os가 타이머 인터럽트 발생횟수를 기억(카운트), 5번 타이머 인터럽트 발생마다 현재 프로세스를 다른 프로세스로 교체
---------------
timer_interrupt()
{
count++;
if (count>5)
{
scheduler()
count=0;
}
}
------------------
올인원 패키지 : 컴퓨터 공학 전공 필수👉https://bit.ly/3i4sCVE
'패스트캠퍼스' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 39회차 미션 (0) | 2020.11.26 |
---|---|
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 38회차 미션 (0) | 2020.11.25 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 36회차 미션 (0) | 2020.11.23 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 35회차 미션 (0) | 2020.11.22 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 34회차 미션 (0) | 2020.11.21 |