지난번에 정리한 멀티 프로세스 혹은 멀티 스레드 환경을 생각해보자
A라는 프로그램이 CPU를 할당받아 명령을 수행하고 있다.
하지만 어떠한 이유에서 어떠한 루틴의 실행을 목적으로 CPU를 할당받아야 한다고 해보자
그렇다면 어떻게 CPU에 대한 사용권을 얻어와야 할까?
이때 사용되는 것이 인터럽트(Interrupt)라는 것이다.
인터럽트가 발생하게 되면 A는 현재 수행중인 명령을 멈춘다.
그리고 어떠한 루틴을 수행한 다음 다시 A로 돌아와 명령을 수행하게 된다.
여기서 의문이 생긴다. 명령을 멈췄으면 다시 돌아왔을때 처음부터 실행해야 되나?
이를 위해 멈추기 전에 현재 실행상태(명령의 위치)를 저장해 놓는다.
이렇게 저장되는 자료의 구조를 PCB(Process Control Block)이라고 한다.
그렇다면 PCB는 어떻게 구성되어 있을까?
구성요소는 다음과 같다
프로세스 식별자(PID) | 스레드 식별자(TID) | 프로세스 상태 | 프로그램 카운터 |
CPU 레지스터 | CPU스케쥴링 정보 | 메모리 관리 정보 | 입출력 상태 정보| Acounting정보
이렇게 구성되어있다.
이는 인터럽트 뿐만 아니라 Context Switching이 일어날 때에도 PCB로 저장하게 된다.
다시 인터럽트로 돌아와서
인터럽트를 나누는 기준에 따라 분류 할 수 있다.
CPU를 기준으로 내부인터럽트와 외부인터럽트로 나눌수도 있고
하드웨어 인터럽트와 트랩(소프트웨어 인터럽트)로 나눌수 있다.
먼저 내부, 외부를 살펴보자
내부 인터럽트는 하드웨어 고장, 실행할 수 없는 명령어, 명령어 실행 오류, 사용권한 위배의 경우 발생하는 인터럽트이다.
반면에 외부 인터럽트는 주로 입출력 장치에 의해 발생하며 타이머 인터럽트,인출력 입터럽트가 있다.
다음으로 하드웨어인터럽트와 트랩에 대해 살펴보면
하드웨어 인터럽트는 외부 입출력(키보드 입력등),전원에 의해 발생하는 인터럽트이다.
반면 트랩의 경우에는 exception, systemcall등 소프트웨어와 관련해 발생하는 인터럽트이다.
+ 인터럽트 핸들러와 인터럽트 벡터
인터럽트 핸들러는 코드 루틴(실제 동작 루틴)을 의미하고 벡터는 루틴의 주소(루틴이 함수라고 가정하면 함수의 포인터 느낌)를 말한다.
위에서 언급했던 Context Switching에 대해 알아보자
컨텍스트 스위칭시 오버헤드가 발생하는데 사실 이 비용을 측정하는 것은 매우 어려운 일이다.
Page기법을 사용하기 때문인데 page를 사용하지 않던 때는 스위칭비용이 명확히 발생하지만 최근에는 page On-Demand형태로 필요할때만 가져오기 때문에 스위칭 비용에 차이가 그렇게 크지 않을까 하는 이유에서 이다.
그렇다면 컨텍스트 스위칭시 발생하는 주된 비용말고 추가적인 비용은 어떤 것들이 있을까?
1. 캐시 무효화 비용
- 컨텍스트 스위칭이 일어나면 다른 프로세스가 CPU를 사용하는 것이므로 그 프로세스에 맞게 캐시를 설정해줘야 한다.
2. TLB 무효화 비용
- 캐시 무효화와 마찬가지로 해줘야 하는데 TLB가 역페이지 테이블로 구현되어있으면 무효화를 안해줘도 된다. - pid가 TLB에 있으므로(논리적 주소가 아닌 물리적 주소가 그대로 들어가 있어 프로세스가 바뀌어도 똑같은 위치를 가리킨다.)
따라서 가상 메모리와 물리메모리 사이의 차이가 존재하는지가 무효화여부에 관건이 된다!!
추가로 시스템 콜이나 인터럽트는 컨텍스트 스위칭에 포함되지 않는다!
헷갈리기 쉬운데 위 두가지 경우는 프로세스가 바뀌는 것이 아니라 모드만 바뀌는 것이기 때문에 이 자체로는 컨텍스트 스위칭이라고 하지 않는다.(물론 시스템 콜,인터럽트에 의해 프로세스가 바뀌게 될때 그 상황은 컨텍스트 스위칭이라고 한다.)
지금까지 인터럽트와 컨텍스트 스위칭에 대해 알아보았다
끝!
'Computer Science > 운영체제' 카테고리의 다른 글
[운영체제] CPU 스케쥴링(Scheduling) (2) | 2021.12.16 |
---|---|
[운영체제] 프로세스(Process)와 스레드(Thread) (0) | 2021.12.13 |