2 minute read

컴퓨터 시스템 구조

DMA controller   timer
              |            |
CPU - - - - - - - - - - device controller - local buffer - I/O device
          |
memory controller
          |
      memory


device controller는 입출력 장치를 전담하여 입출력 장치를 통해 데이터를 읽거나 써서 local buffer에 데이터를 저장한다.
device controller가 CPU에게 뭔가를 알릴 때는 interrupt line을 통해 인터럽트를 건다.

CPU는 메모리에 있는 기계어(인스트럭션)를 처리한다.
메모리에서 사용자 프로그램과 운영체제가 돌아간다.
그 기계어의 위치는 CPU에 있는 레지스터 중에서 메모리 주소를 가리키는 Program Counter 레지스터가 있는데 이것이 가리키는 메모리의 위치에서 기계어를 읽어와서 처리한다.
그리고 PC레지스터는 다음 주소를 가리키게 되면서 순서대로 실행된다.

이때 다음 인스트럭션을 처리하기 전에 인터럽트를 확인한다.
인터럽트가 들어왔다면 작업을 멈추고 CPU제어권이 운영체제로 넘어간다.

CPU에는 mode bit이 있는데 mode bit이 0이면 모든 기계어들을 실행할 수 있고 1이면 한정된 기계어들만 실행한다.
운영체제가 CPU제어권을 가질 때는 mode bit이 0이며 모니터모드(커널모드)라고 한다.
보안과 관련된 중요한 명령어는 모니터모드에서만 수행 가능하다.
사용자 프로그램이 CPU제어권을 가질 때는 mode bit이 1이며 사용자 모드라고 한다. 사용자모드에서 제한을 시키는 것은 사용자 프로그램을 믿을 수 없기 때문이다.

입출력 장치로 접근하는 인스트럭션은 mode bit이 0일 때만 실행할 수 있다.
보안 등의 이유로 운영체제만 입출력 장치로 접근하도록 막아놨기 때문이다.
그래서 사용자 프로그램이 CPU를 사용하다가 입출력작업을 할 때는 운영체제에게 요청을 해야 한다.
그럴려면 PC레지스터가 운영체제로 넘어가야 하는데 mode bit이 1일 때는 그럴 수가 없다.
그래서 사용자 프로그램이 운영체제에게 요청을 할 때는 system call을 한다.
시스템 콜을 하면 사용자 프로그램이 의도적으로 인터럽트 라인을 세팅한다.
그러면 CPU는 작업을 멈추고 운영체제로 제어권이 넘어가게 된다.

인터럽트는 두 종류가 있는데 하드웨어가 발생시킨 인터럽트를 interrupt(하드웨어 인터럽트)라고 하고 위의 경우처럼 프로그램이 인터럽트 라인을 세팅해 운영체제를 부르는 것을 trap(소프트웨어 인터럽트)이라고 한다.
트랩에는 두 종류가 있는데 위의 경우처럼 사용자 프로그램의 필요에 의해 운영체제에 요청하는 것을 system call이라 하고 프로그램 오류에 의해 발생한 트랩을 exception이라 한다.

timer가 인터럽트를 걸 수도 있다.
사용자 프로그램에서 CPU를 놓지않고 계속 사용한다면 뺏어올 방법이 없기 때문에 운영체제가 사용자 프로그램에 CPU를 넘길 때는 타이머에 제한된 시간을 설정해 넘겨주게 된다.
시간이 끝나면 타이머가 인터럽트를 걸고 운영체제가 CPU를 가질 수 있게 된다.

메모리도 하나의 장치이기 때문에 memory controller가 메모리를 전담한다.

입출력 장치에서 CPU에 인터럽트를 걸면 운영체제가 CPU를 가지고 로컬 버퍼의 내용을 메인 메모리에 복사해 온다.
이런 인터럽트들이 많아 지게 되면 CPU가 자꾸 방해를 받게 되는데 이 문제를 해결하기 위해 DMA controller를 사용한다.
원래는 메인 메모리에는 CPU만 접근할 수 있지만 DMA controller도 메인 메모리에 접근할 수 있다.
이 때 CPU와 DMA컨트롤러가 특정 메모리 영역을 동시에 접근하면 문제가 생길 수 있으니 memory controller가 중재를 한다.
로컬 버퍼에 들어오는 내용의 작업이 끝났으면 DMA컨트롤러가 직접 메모리로 복사를 한다. 이 작업이 다 끝나면 CPU에게 인터럽트를 한번만 걸게된다.
이렇게 하면 CPU가 인터럽트받는 빈도가 줄어들게 된다.

인터럽트가 들어왔을 때 인터럽트의 종류에 따라 해야될 일이 다를텐데 그 일을 작성해 놓은게 인터럽트 처리 루틴 이라하고 이것의 주소를 가리키는 게 인터럽트 벡터라고 한다.

동기식/비동기식 입출력

동기식 입출력은 I/O 요청 후 입출력 작업이 완료된 후에 제어가 사용자 프로그램에 넘어간다.
비동기식 입출력은 I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어간다.

프로그램의 실행

프로그램은 저장장치에 실행파일로 저장되어 있다.
프로그램을 실행시키면 가상 메모리에 메모리 주소공간이 형성된다.
주소 공간은 stack, data, code로 구성된다.
여기서 그때그때 필요한 부분만 물리적인 메모리에 올라가서 프로세스가 된다.
code에는 자원 관리를 위한 코드, 편리한 서비스 제공을 위한 코드 등이 들어있다.
data에는 운영체제가 하드웨어를 관리하기 위해 사용하는 자료구조들이 있다.

Leave a comment