운영체제_기본 구성요소, 명령어 수행, 인터럽트

미뇽·2024년 3월 20일
0

운영체제(강의)

목록 보기
1/43
post-thumbnail
본 자료는 대학 강의 '운영체제'를 들으면서 정리한 자료입니다.

기본 구성유소

컴퓨터는 4가지 기본 구성요소로 이루어진다.

  • 처리기(프로세서 Processor)
    - 컴퓨터의 동작 제어 및 데이터 처리. 중앙처리장치(CPU)로 불림
  • 주기억장치(main memory)
    - 데이터와 프로그램 저장
    - 휘발성(volatile)을 가짐
    - 실기억장치(real memory) 또는 주메모리(primary memory)로도 불림
  • 입출력 모듈(I/O module)
    - 컴퓨터와 외부환경 간의 데이터 이동 담당.
    - 외부 환경은 보조기억장치, 통신장비, 단말기 등 다양한 외부 장치로 구성
  • 시스템 버스(System bus)
    - 처리기, 주기억장치, 그리고 입출력 모듈 간의 통신 제공
    해당 사진에서 CPU의 기능인 메모리와 데이터의 교환 기능을 볼 수 있다.
    메모리 주소 레지스터(Memory Address Register) 로는 다음에 Read/Write할 메모리의 주소를 기록하고 메모리 버퍼 레지스터(Memory Buffer Register) 로는 메모리에 기록되거나 메모리부터 읽힐 데이터를 저장한다.
    입출력 주소 레지스터와 입출력 버퍼 레지스터도 동일한 방식으로 입출력 모듈과 처리기 간의 데이터 교환을 위해 사용된다.

명령어 수행

프로그램은 처리기에 의해 수행되고 메모리에 저장된 명령어들의 집합으로 구성된다.
단일 명령어 수행에서 필요한 처리 과정은 명령어 사이클(instuction cycle)이라고 한다.

명령어 사이클 순서

  1. 각 명령어 사이클리 시작될 때 처리기가 메모리로부터 명령어를 가져옴
    • 프로그램 카운터(PC)가 다음에 가져올 명령어의 주소를 가지고 있어서 얘가 가져옴
  2. 각 명령어를 반입한 후 PC를 증가시켜 순서대로 다음 명령어가 순차적으로 가져와짐
  3. 반입된 명령어는 처리기 내의 명령어 레지스터(IR: Instruction Register)로 적재됨
  4. 처리기가 명령어를 해석하고 요구된 작업 수행

명령어 사이클의 범주 분류

  • 처리기-메모리
    - 데이터는 처리기로부터 메모리로 / 메모리로부터 처리기로 전송될 수 있음
  • 처리기-입출력
    - 처리기와 입출력 모듈 간의 전송을 통해 주변장치로 또는 주변장치로부터 데이터 전송될 수 있음
  • 데이터 처리
    - 처리기는 데이터에 대해 산술 또는 논리 연산을 수행 가능
  • 제어
    - 명령어는 수행 순서 변경 명시 가능. 다음 실행할 명령어의 메모리 주소를 다른 것들로 반입시킴.

    위 사진처럼 명령어 형식에서 연산 코드는 4비트를 차지하고, 나머지 12비트는 주소를 가리킨다.
    해당 명령어 형식은 처리기마다 다르며, 기기에 맞는 기계 명령어로 컴파일해준다.
    아래 정수 형식의 경우에는 값(data)를 저장하는데, 맨 앞은 부호를 의미하며, 옆 절대값은 +, - 값이 있는 만큼 2의 보수로 기록된다.

연산코드의 경우

  • 0001(1) = 메모리에 저장된 값을 AC에 적재
  • 0010(2) = AC에 저장된 값을 메모리에 저장
  • 0101(5) = 메모리에 저장된 값을 AC에 더함
    세 가지가 있다.


해당 프로그램 수행의 예시를 통해 보자.

단계 1. 현재 프로그램 카운터(PC)는 300을 가리킴. 메모리의 300번지의 경우 1940을 명령어 레지스터(IR)로 보냄. 프로그램 카운터(PC)는 1 증가

단계 2. 명령어 레지스터의 1940에서 앞 1은 메모리에 저장된 값을 AC에 적재하는 연산코드이므로 뒤 940의 메모리 주소를 가진 값을 AC에 저장. 따라서 940 번지의 0003이라는 값이 AC에 적재됨.

단계 3. 301번지의 명령어 5941을 반입. 연산 코드 5의 경우 메모리에 저장된 값을 AC에 더하는 연산코드. PC 증가

단계4. 메모리 주소인 941에 있는 값 0002를 가져와 AC에 있는 0003과 함하여 5를 저장.

단계 5.메모리 주소 302에서 다음 명령어 2941이 반입. 연산코드 2의 경우 AC에 저장된 값을 메모리에 저장

단계 6. 명시되어있는 941 메모리 주소에 더한 단계1~4까지 수행된 후 AC의 값 0005를 저장.

의 과정을 거친다.

인터럽트

모든 컴퓨터는 처리기의 일반적 처리에 다른 모듈들(입출력, 메모리)이 인터럽트를 걸 수 있도록 허용한다. 일반적인 인터럽트 부류는 아래와 같다

인터럽트 부류설명
프로그램산술연산 오버플로, 0으로 나누기, 불법적인 기계 명령어 수행 시도, 사용자에게 허용된 메모리 공간 밖의 참조 등과 같은 명령어 수행 결과로 발생하는 어떤 조건에 의해 생성
타이머처리기 내의 타이머에 의해 생성. 운영체제로 하여금 특정 기능을 정규적으로 수행할 수 있도록 허용
입출력입출력 제어기에 의해 생성되며 연산의 정상적인 종료를 알리거나 다양한 에러 조건을 알림
하드웨어 실패

인터럽트는 처리기의 처리율 향상을 위해 제공된다. 여러 입출력 장치들이 있을 때 각 입출력 장치들은 명령어 사이클 기법을 사용하여 데이터를 전송한다. 하지만 문제는 이런 매번 쓰기/읽기 연산 이후 처리기는 수행을 일시 중지하고 입출력장치가 동작을 완료할 때까지 유휴상태가 되는데, 이러한 유휴 상태의 시간이 매우 길어 그 시간동안 수백, 수천개의 명령어 사이클을 동작할 수 있음에도 낭비하게 된다.
그러한 처리기의 낭비를 막기 위해 도입된 것이 인터럽트이다.

위 사진에서 1번은 사용자 프로그램을 실행했을 경우이다. 사용자 프로그램은 실행 도중에 중간중간 2번의 WRITE 호출을 한다. WRITE 호출은 시스템 유틸리티인 입출력 루틴이며, 실제 입출력 연산을 수행한다. 입출력 프로그램은 세 단계로 구성된다.
1. 4번처럼 실제 입출력 연산을 준비하는 명령어가 출력될 데이터를 특별한 버퍼에 복사하고 장치 명령을 위한 매개변수를 준비
2. 2번과 같이 명령을 내리고 나면 프로그램은 입출력 장치가 요청된 기능을 수행하도록 기다린다. 이 과정에서 인터럽트가 없으면 그저 기다리거나 단순히 테스트 연산을 반복 수행하면서 대기한다
3. 5번과 같이 연산을 완료하기 위한 일련의 명령어를 실행하여 연산의 성공 또는 실패 여부를 나타내는 플래그를 설정하는 등의 동작을 수행한다
a와 같이 인터럽트가 없는 경우 첫 번째 WRITE 명령어를 만나면 인터럽트가 걸리고 I/O 프로그램으로 실행이 계속되며 입출력 연산을 완료할 때까지 기다려야 하는 시간동안 처리기는 수행이 정지되어 낭비된다.

하지만 b와 같은 경우는 다르다. WRITE 형태의 시스템 호출을 하는 지점에서 입출력 프로그램은 준비 코드와 실제 입출력 명령어를 수행하고 제어가 다시 사용자 프로그램으로 리턴되지만 외부 장치는 해당 기능을 수행하고 있다.
외부 장치가 만약에 다 끝난 후 다시 서비스할 준비가 되면 처리기로부터 더 받을 수 있다고 인터럽트 요청 신호를 처리기로 보낸다. 그럼 처리기는 수행중이던 프로그램의 작업을 보류하고, 해당 입출력 장치를 인터럽트 처리기라는 프로그램으로 분기하며 장치에 대한 서비스 후에 보류했던 프로그램의 수행을 재개한다.
WRITE 연산 후 2a와 2b로 나누어진 이유가 이 때문이다. X로 표기되어 있는 부분에서 인터럽트 요청이 일어나며, 정상적인 프로그램의 수행되다가 잠깐 중지시킨 다음 인터럽트부터 처리 후 원래 프로그램의 수행이 재개되는 것이다.이러한 수행의 중지와 재개는 처리기와 운영체제에서 관리한다.


명령어 사이클에 추가되는 인터럽트 단계(interrupt stage)가 추가되었음을 알 수 있다. 이 인터럽트 단계는
1. 인터럽트 단계에서 처리기는 인터럽트의 발생 여부(인터럽트 신호 존재 여부)를 검사
2. 처리할 인터럽트가 없을 경우 : 처리기는 반입 단계로 진행하고 현재 프로그램의 다음 명령어 가져옴
처리할 인터럽트가 있을 경우: 프로그램의 수행을 중지시키고 인터럽트 처리기 루틴 수행
3. 인터럽트 처리기 루틴이 완료되면 처리기는 인터럽트가 발생한 지점에서 사용자 프로그램의 수행 재개
의 단계를 거친다. 이를 통해 중간의 대기 시간을 효율적으로 사용하는 것이다.

위와 같은 단계는 사용자 프로그램에서 쓰기 연산 간의 명령어 수행을 완료하는데 요구되는 시간보다 입출력 연산에 필요한 시간이 더 짧을 때를 가정하고 동작 과정을 설명한다. 하지만 프린트와 같이 입출력 연산 시간이 일련의 사용자 명령어를 수행하는 시간보다 훨씬 더 오래 걸리는 경우도 고려해야 한다.

이러한 경우에도 사용자 프로그램은 첫 번째 호출에 의한 입출력 연산이 완료되기 전에 두 번째 WRITE 호출에 이르게 되고, 결과적으로는 여기서 멈추게 된다. 그러다가 이 입출력 연산이 완료되면 그 때 새로운 WRITE 호출이 진행되어 새로운 입출력 연산이 시작되는 것이다.
이렇게 된다면 2번의 사용자 프로그램은 대기 시간 없이 바로 실행된 이후에 대기시간을 가지는 것이기 때문에 입출력 작업 시간의 일부가 사용자 명령어 수행 시간과 겹치는 부분이 있어 효율적 측면에서 이득임을 알 수 있다.

인터럽트 처리

인터럽트가 발생하면 처리기 하드웨어와 소프트웨어에서 많은 이벤트가 발생한다.
해당 이벤트의 과정을 한번 살펴보자.

1. 장치가 인터럽트 시그널을 처리기로 보낸다.
2. 인터럽트에 응답하기 전에 처리기는 현재 수행중인 명령어를 완료한다.
3. 처리기는 대기중인 인터럽트 요청이 있는지 검사하여 알게 되고, 인터럽트를 발생시킨 장치에게 수신 확인 신호를 보낸다. 확인은 해당 장치가 인터럽트 신호를 제거할 수 있게 한다.
4. 처리기가 제어를 인터럽트 루틴으로 넘기기 위해 준비한다. 먼저 인터럽트가 발생한 지점에서 현재 진행중인 프로그램을 인터럽트가 끝난 시점에 다시 재개해야 하기 때문에 저장해야 할 필요성을 가진다. 최소한의 정보는 프로그램 상태 워드(PSW)이며, 프로그램 카운터 안에 있는 내용 등이 들어가 있다. 이러한 정보는 시스템 제어 스택에 저장된다.
5. 처리기는 인터럽트에 응답할 인터럽트 처리 루틴의 진입 위치를 프로그램 카운터에 적재한다. 컴퓨터 구조와 운영체제마다 인터럽트 처리 루틴은 다른데, 만약 한 개 이상의 인터럽트 처리 루틴이 제공되면 여기서 처리기는 어느 루틴을 호출할 지 결정해야 한다. 인터럽트 신호 안에 있기도 하지만 인터럽트 발생 입출력 장치에게 요청할 수도 있다.
프로그램 카운터 적재 후 처리기가 다음 명령어 사이클의 명령어 반입부터 진행하여 다음 처리기의 제어가 인터럽트 처리기 프로그램으로 넘어간다(기존 실행중이었던 프로그램 카운터와 PSW는 제어 스택에 보관)
6. 이 시점에서 처리기 레지스터의 내용들은 기존에 작업하던 내용들을 담고 있고 재개할때 필요하므로 인터럽트 처리기가 모든 레지스터의 내용을 스택에 저장한다. 저장하는 과정은 아래와 같이 N번지 명령어 이후 인터럽트가 발생했을 때의 예제를 다루고 있는데, 이 때 모든 레지스터의 내용과 다음 명령어의 주소(N+1), 전체적으로 M개의 워드가 제어 스택에 들어간다. 스택 포인터는 새로 설정된 스택의 최상단을 가리키고 프로그램 카운터는 인터럽트 서비스 루틴의 시작을 가리키도록 갱신된다.

7. 인터럽트 처리기가 인터럽트를 처리한다. 입출력과 관련된 상태 정보에 대한 조사 작업 과정에서 입출력 장치로 추가적인 명령이나 확인을 보낼 수 있다.
8. 인터럽트 처리가 완료되면, 저장된 레지스터 값을 검색하여 레지스터에 다시 저장한다.
9. 다시 기존에 진행중인 프로그램을 재개해야 하므로 스택으로부터 PSW와 프로그램 카운터 값을 인터럽트 발생 이전으로 복원한다. 이후에는 수행될 다음 명령어가 인터럽트 당한 프로그램으로부터 나온다.

중첩 인터럽트

하나의 인터럽트만 발생하는 경우도 있겠지만, 하나 이상의 인터럽트가 발생하는 경우도 있다.
예를 들어 데이터를 하나씩 전송받아 인쇄하는 경우 하나의 프린트 연산이 완료될 때마다 인터럽트가 생성된다. 이런 경우에 프린터 인터럽트 처리 동안 통신 인터럽트가 발생할 가능성도 있다.
이런 경우 중첩 인터럽트를 처리해야 하는데, 처리 방법에는 두 가지가 있다.
1. 하나의 인터럽트를 처리하는 동안 다른 인터럽트 금지

  • 처리기가 인터럽트 처리 동안 오는 인터럽트 요구 신호를 무시하고 남겨놨다가 처리기가 인터럽트 발생을 허용한 후에 처리된다. 이런 방식은 순차적으로 인터럽트가 실행되기 때문에 순차적 인터럽트 처리라고도 불린다.
  1. 인터럽트 간의 우선순위를 정의하고 높은 우선순위 인터럽트가 낮은 순위 인터럽트를 인터럽트할 수 있도록 허용
    • 만약에 계층 구조가 있는 인터럽트가 있다면 계층의 순서대로 인터럽트를 중첩시켜 순서대로 상태를 스택에 저장하면서 중첩시켜 문제를 없애면서도 인터럽트 중첩으로 처리기를 조금 더 활용시킬 수 있다.
profile
문이과 통합형 인재(人災)

0개의 댓글