📗 명령어 사이클
프로그램 속 명령들은 일정한 주기를 반복하며 실행한다.
이 주기를 명령어 사이클이라고 한다.
✔ 메모리 속 명령어를 실행하려면?
메모리 속 프로그램을 CPU로 가져와야 한다. 이 과정을 '인출' 이라고 하고
이 인출하는 주기를 '인출 사이클' 이라고 한다.
가져온 프로그램을 실행하는 주기는 '실행 사이클' 이다.
인출 사이클과 실행 사이클을 계속해서 반복한다.
인출 이후 바로 실행을 할 수도 있지만 실행을 할 수 없는 경우도 있다.
이때는 메모리 접근이 더 필요한 경우로 간접 사이클에 돌입하게 된다.
이후 실행이 가능해 지면 실행 사이클에 돌입하게 된다.
✔ 간접 사이클이란?
데이터에 대한 연산을 수행하는 경우에 명령어에는 그 데이터를 읽어오기 위한
기억장치 주소가 포함되어있는데 어떤 명령어에는 포함하고 있는 주소가
데이터가 저장된 주소를 가르킨다. (간접 주소 지정 방식)
이때 실행사이클 전에 그 데이터의 실제 주소를 메모리에서 가져오는 작업이
먼저 수행되어야 하고 이 주기를 간접 사이클 이라고 한다.
📗 인터럽트
CPU의 정해진 흐름을 방해하는 (끊는) 신호를 말한다.
CPU가 얼른 처리해야 할 다른 작업이 발생했을 때 발생한다.
인터럽트는 '동기 인터럽트(예외)' 와 '비동기 인터럽트(하드웨어 인터럽트)'
2가지 종류가 있다.
💻 동기 인터럽트
디버깅, 메모리 주소에 원하는 데이터가 없을 때, 실행할 수 없는 명령어
0으로 나누기 등등 CPU가 예기치 못한 상황을 접했을 때 발생한다.
동기 인터럽트의 종류에는 폴트, 트랩이 있다.
폴트 (Fault): 프로세스가 실행 중인 동안 발생하는 예외 상황을 나타내는 용어.
주로 페이지 부재(page fault)와 같은 가상 메모리와 관련된 상황에서 사용된다.
페이지 부재는 필요한 페이지가 메모리에 없는 경우 발생하며, 이때 운영체제는 해당 페이지를
메모리에 로드하고 프로세스를 계속 진행시킨다.
트랩 (Trap): 명령어의 실행 중에 특정 조건이나 이벤트에 의해 발생하는 인터럽트이다.
트랩은 소프트웨어 인터럽트로 간주되며, 주로 시스템 호출(system call)과 관련이 있다.
사용자 프로그램이 커널의 서비스를 요청할 때 발생하며, 이를 통해 프로그램은 운영체제의
기능을 사용할 수 있다. (시스템 콜, 예외 처리 등)
✔ 동기 인터럽트를 사용하는 이유
동기 인터럽트는 명령어 수행 중 예외가 발생하거나 메모리 페이지 부재등을 감지하여
인터럽트를 발생시키고 이 때문에 운영체제는 필요한 작업을 수행할 수 있다.
또한 동기 인터럽트는 프로그램이나 시스템에서 발생하는 예외 상황을 감지하고 처리함으로써
시스템의 안전성을 높여 비정상적인 동작이나 보안 위협을 최소화할 수 있다.
💻 비동기 인터럽트
주로 입출력 장치에 인해 발생한다. 알림과 같다고 보면 된다.
작업완료 알림이나 마우스, 키보드 등을 눌렀을 때도 발생한다.
✔ 비동기 인터럽트를 사용하는 이유
입, 출력 장치는 CPU에 비해 속도가 느리다.
만약 인터럽트가 없다면 CPU는 예를 들어 프린트 완료 여부를 확인하기 위해서
주기적으로 확인해야 할 것이다. 인터럽트가 존재하기에 CPU가 입출력 작업 도중
다른 일을 할 수 있는 것이고 이는 효율적으로 명령어를 처리할 수 있게 해준다.
✔ 하드웨어 인터럽트의 동작 과정
1. 입출력장치가 CPU에 요청신호를 보낸다.
2. CPU는 실행사이클이 끝나고 인출사이클 전, 항상 인터럽트 여부를 확인한다.
3. CPU가 인터럽트 요청을 확인하고 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는
상황인지 확인한다.
4. 받아들일 수 있다면 CPU는 지금까지의 작업을 백업한다.
5. CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행한다.
6. 인터럽트 서비스 루틴이 끝나면 백업해둔 작업을 복구하여 실행을 재개한다.
💻 인터럽트 플래그
인터럽트 플래그는 플래그 레지스터에 존재한다.
인터럽트를 받아들일 수 있는지 없는지에 관한 비트 정보가 담긴다.
인터럽트를 받아들일 수 없다면 인터럽트 요청이 들어와도 처리하지 않는다.
하지만 모든 인터럽트 요청을 막을 수 있는 것은 아니다. (하드웨어 고장 등)
인터럽트를 받아들이기로 했다면 인터럽트 서비스 루틴이 실행된다.
💻 인터럽트 서비스 루틴
발생한 인터럽트에 대응하여 어떻게 처리할지 정해져있는 운영체제 내의 기계어 코드 루틴이다.
인터럽트 서비스 루틴도 프로그램이므로 메모리에 저장된다.
💻 인터럽트 벡터
인터럽트 벡터는 인터럽트 서비스 루틴을 찾아가기 위한 주소나 인덱스를 가리키는 공간을 말한다.
컴퓨터 시스템에서 인터럽트가 발생하면, CPU는 해당 인터럽트의 타입 또는 번호를 사용하여
인터럽트 벡터를 참조하고, 그에 해당하는 시작 주소를 얻어 인터럽트 서비스 루틴을 실행한다.
✔ 인터럽트가 발생했을 때, CPU의 작업 백업
인터럽트 서비스 루틴이 끝나고 원래 실행하던 프로그램으로 돌아오기 위해
현재까지의 작업을 백업 시켜 놓는다. 이 백업 내용은 스택 영역에 저장된다.
인터럽트 서비스 루틴이 끝나면 스택에서 실행하던 작업 내용을 가져다 작업을 이어서 진행한다.
✔ 스택 영역에 저장되는 데이터
스택 영역은 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 공간이다.
스택 영역에 저장되는 내용은 다음과 같다.
- 프로그램 카운터(PC): 현재 수행 중인 명령어의 주소를 저장한다. 인터럽트 처리 이후에는 이 주소로 돌아가서 다음 명령어를 수행한다.
- 레지스터 값들: 현재 CPU 레지스터들의 값을 저장한다. 이는 현재 프로세스의 중요한 상태 정보를 포함한다.
- 플래그 레지스터 값: 상태 플래그와 같은 특정한 레지스터들의 값을 저장한다.
- 스택 포인터: 현재 사용 중인 스택의 위치를 저장한다. 이는 스택에 새로운 정보를 푸시(push)하거나 팝(pop)할 때 사용된다.
학습출처 : https://www.youtube.com/watch?v=3Yz7OnVUM28&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=13
'CS-Study' 카테고리의 다른 글
컴퓨터 구조 : 명령어 병렬 처리 기법 (0) | 2024.01.30 |
---|---|
컴퓨터 구조 : CPU를 빠르게 설계하는 법 (클럭, 코어, 스레드) (0) | 2024.01.29 |
컴퓨터 구조 : 레지스터 (0) | 2024.01.26 |
컴퓨터 구조 : 소스코드와 명령어 그리고 명령어의 구조 (0) | 2024.01.25 |
컴퓨터 구조 : 0과 1로 문자를 표현하는 방법 (0) | 2024.01.25 |