Interrupt 와 Context Switching
System call
운영체제는 커널 모드와 사용자 모드로 나뉘어 구동된다. 운영체제에서 프로그램이 구동되는데 있어 파일을 읽어 오거나, 파일을 쓰거나, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다. 시스템 콜은 이러한 커널 영역의 기능을 사용자 모드가 사용 가능하게, 즉 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해준다. 시스템 콜은 프로세스 제어, 파일 조작, 장치 조작, 정보 유지보수, 통신과 보호 이렇게 다섯 가지 유형으로 나눌 수 있다.
Interrupt
인터럽트는 CPU 가 프로그램을 실행하고 있을 때, I/O 장치 등에 의해 예외 상황이 발생하여 처리가 필요한 경우에 CPU 에게 처리하도록 알려주는 것을 의미한다.
- 인터럽트 종류
- 하드웨어
- 하드웨어가 발생시키는 인터럽트로 보통 CPU 서비스를 요청해야할 경우 발생시킨다.
- 소프트웨어
- 소프트웨어가 발생시키는 인터럽트로 예외상황 등이 있다.
- 하드웨어
- 인터럽트 서비스 루틴(Interrupt Service Routine, ISR)
- 인터럽트 핸들러(Interrupt Handler)라고도 한다.
- 인터럽트를 처리하기 위한 코드 루틴
- 운영체제의 코드 영역에는 인터럽트별로 처리해야할 내용이 존재한다.
- 인터럽트 벡터(Interrupt Vector)
- 인터럽트 서비스 루틴(ISR) 보관 공간
- 인터럽트 벡터 안에 ISR 을 보관하고 있다.
- 인터럽트 과정
- processA 실행 중 -> 저장 경로를 확인하기 위한 로직이 실행되었다고 가정
- processA 가 system call 을 통해 (Ex. 키보드 입력) 인터럽트 발생
- 현재 실행중인 프로세스 정보(문맥)를 저장(PCB 에 저장)
- 인터럽트 발생 시 프로세스 제어 블록(PCB, Process Control Block)에 프로세스의 어느 부분이 수행중이었는지를 저장한다.
- PC(Program Counter)에 다음에 실행할 명령의 주소를 저장
- 인터럽트 벡터에서 해당 ISR 을 찾음
- 키보드 처리를 위한 ISR 주소로 변경
- 키보드 인터럽트 처리
- ISR 의 끝에
IRET(Interrupt Return)
명령어에 의해 인터럽트가 해제 된다. - IRET 명령어가 실행되면, 대피시킨 PC 값을 복원하여 이전 실행 위치로 복원한다
PCB
- 프로세스 제어 블록(PCB, Process Control Block)
- 각 프로세스는 운영체제에서 PCB 로 표현
- 특정 프로세스와 연관된 여러 정보를 포함
- PID : 프로세스 식별자
- 프로세스 상태 : new, ready, running, waiting, halted 등
- 프로그램 카운터(Program Counter, PC) : 다음 실행할 명령어의 주소
- CPU 레지스터들 : 레지스터는 누산기(accumulator), 인덱스 레지스터, 스택 레지스터 등
- CPU 스케줄링 정보 : 프로세스 우선순위 등
- 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등
- 회계 정보 : CPU 사용 시간과 경과된 시간 등
- 입출력 상태 정보 : 프로세스에게 할당 된 입출력 장치들과 연린 파일의 목록 등
정리하자면, 프로세스 제어 블록은 프로세스마다 달라지는 모든 정보를 저장하는 저장소
라고 생각하면 된다.
Context Switching
문맥 교환(Context Switching)에 대해서 이해하려면 프로세스의 특징, 멀티 프로세스의 특징, 쓰레드의 특징, 멀티 쓰레드의 특징에 대해서 알고 있어야 한다.
일반적으로 CS 에서 Context Switching 이라 하면 프로세스의 문맥 교환을 의미한다. 하지만 문맥 교환을 배울 때에는 프로세스의 문맥 교환과, 쓰레드의 문맥 교환을 둘 다 공부해야 한다. 프로세스의 문맥 교환에 대해서 깊게 공부하고나면 쓰레드의 문맥 교환은 비교적 간단하고 쉽게 이해할 수 있다.
Process Context Swithcing
문맥 교환(Context Switching)은 하나의 프로세스가 CPU 를 사용 중인 상태에서 다른 프로세스가 CPU 를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태(문맥)를 적재하는 작업을 말한다.
한 프로세스의 문맥은 그 프로세스의 프로세스 제어 블록(PCB) 에 기록되어있다.
프로세스가 증가하게되면 문맥 교환이 많아져서 오버헤드가 증가하므로 시스템 성능에 악영향을 끼칠 수 있다. 오버헤드(overhead)
란 CPU 가 메모리에 적재하는 동안 아무것도 안하게되는 현상을 의미한다.
즉, 멀티 프로세스에서 문맥 교환이 너무 자주 일어나게 되면 기존 프로세스의 상태를 저장하고, 새로운 프로세스의 상태를 적재하는 동안 CPU 가 아무것도 하지 않기 때문에 CPU 성능 저하의 원인이 될 수 있다.
오버헤드 해결 방안은 다음과 같다.
- 문맥 교환이 자주 발생하지 않도록 다중 프로그래밍의 정도를 낮춘다.
- 스택 중심의 장비에서는 Stack 포인터 레지스터를 변경하여 프로세스 간 문맥 교환을 수행한다.
- 스레드(Thread)를 이용하여 문맥 교환 부하를 최소화시킨다.
따라서, 이러한 멀티 프로세스의 단점(잦은 문맥 교환, 많은 메모리 공간 차지) 때문에 멀티 쓰레드 환경을 선호
하는 것이다.
Thread Context Switcing
쓰레드의 문맥 교환은 프로세스의 문맥교환과 달리 프로세스의 자원들을 공유하기 때문에 속도면에서 훨씬 더 빠르고 CPU 의 부담도 훨씬 덜 가게 된다. 이러한 점 때문에 시스템의 처리율이 향상되고 프로그램의 응답시간이 단축되어 진다.
References
'CS > OS' 카테고리의 다른 글
스와핑 (0) | 2021.12.17 |
---|---|
주소 바인딩 (0) | 2021.12.17 |
교착상태와 기아상태 (0) | 2021.12.15 |
프로세스 동기화 (0) | 2021.12.10 |
프로세스와 쓰레드 (0) | 2021.12.09 |