컴퓨터 시스템의 구조
1. 개요
- 크게 CPU, 메모리, I/O 장치 셋으로 나눌 수 있다. (디스크는 파일을 열어 내용을 불러와 메모리에 올린다는 측면에서 입력장치로 볼 수도 있고, 반대로 CPU에 의해 처리된 결과를 전달받아 파일의 형태로 저장한다는 측면에서 출력장치로 볼 수도 있다.)
- I/O 장치의 모든 정보가 곧바로 컴퓨터의 메인 메모리와 CPU로 전달되는 것은 아니고, 각각 그 장치를 직접 통제하는 device controller와 local buffer를 갖는다.
2. 메인 메모리의 프로그램의 CPU 사용, interrupt, 타이머
- CPU에는 당장 실행할 메인 메모리상의 기계어의 주소를 저장하는 레지스터(이를 program counter 또는 PC라 한다)가 있어, 매 순간 메인 메모리상의 그 주소에 있는 기계어를 실행한다. (그리고 PC에 저장된 주소값은 그 다음으로 실행할 기계어의 메인 메모리 주소값이 저장된다.)
- CPU는 당장 실행할 메인 메모리의 기계어를 실행하기에 앞서 interrupt line을 확인해 interrupt 또는 trap이 발생했는지를 먼저 확인하며, interrupt가 발생했다면 (1)당장 실행하려던 메인 메모리 기계어의 실행을 중단하고 (2)CPU에 있던 현재 프로세스의 context를 PCB에 업데이트 한 다음 (3)현재 발생한 interrupt에 해당하는 interrupt 서비스 루틴을 실행하고 그 다음 다시 프로세스로 돌아온다.
-
interrupt: timer 또는 I/O 장치의 컨트롤러 같은 하드웨어 장치가 자신에게 CPU의 처리를 요하는 요청이 있음을 CPU에 알리는 신호.
- timer interrupt: 사용자 프로그램 하나가 지나치게 오래 CPU를 점유하는 경우를 방지하기 위하여 보통은 사용자 프로그램이 CPU를 점유하기 시작할 때 타이머를 설정하며, 설정된 시간이 경과하면 타이머는 CPU로 interrupt를 요청하여 현재 CPU를 점유 중인 사용자 프로그램의 연산을 즉각 종료하게 한다. 이러한 interrupt를 timer interrupt라 한다.
-
trap: 메모리 상에서 실행 중인 프로세스가 CPU의 처리를 요하는 요청이 있음을 CPU에 알리는 신호. software interrupt라고도 한다.
-
exception: 프로세스 실행 중 허용되지 않는 연산이 수행됐을 때 CPU에 알리는 trap. 허용되지 않은 영역의 메모리를 참조하는 등의 오류가 나타날 때 발생한다.
-
system call: 프로세스가 커널의 특정 함수를 호출하기 위해 CPU에 알리는 trap. 보통 I/O 장치에 접근할 때 사용된다.
-
-
interrupt line: interrupt 또는 trap이 발생했을 때 이 사실을 CPU에 알리기 위한 목적으로 그 사실을 기록하는 장소. CPU는 현재 처리한 내용을 AC로 보낸 다음으로 PC에서 처리할 내용을 읽기 전에 먼저 interrupt line을 확인한다.
-
interrupt 서비스 루틴: interrupt가 발생했을 때 그 interrupt의 유형에 따라 어떻게 처리할지 정해져 있는 루틴. 커널의 함수다. interrupt handler라고도 한다.
-
interrupt vector: 커널의 코드 중 어느 한 interrupt 서비스 루틴에 해당하는 코드의 메모리 주소. 이것을 모아놓은 것을 interrupt vector table이라 하며, CPU에는 이를 저장하는 레지스터가 있다.
3. 메인 메모리의 프로그램의 I/O 장치 사용 및 mode bit
- 메인 메모리에 있는 사용자 프로그램은 직접 I/O 장치를 사용할 수 없으며, 메인 메모리의 커널을 통해서만 I/O 장치에 접근할 수 있다. 사용자 프로그램은 또한 직접 커널에 접근할 수 없어, 결국 사용자 프로그램이 I/O 장치를 사용하고자 한다면 CPU에 interrupt를 요청하여 커널을 호출한다. (이처럼 사용자 프로그램이 CPU를 통해 커널을 호출하는 것을 system call이라 한다.)
- 이때, CPU의 mode bit가 커널 모드로 변경된다. mode bit는 사용자 프로그램이 임의로 I/O 장치에 접근하는 것을 막기 위한 장치로서, 사용자 프로그램이 CPU를 사용하는 동안에는 mode bit는 사용자 모드로 설정되어 있으며 이때 사용자 프로그램이 I/O 장치로 직접 접근을 시도하면 exception으로 처리된다.
- 한편, 사용자 프로그램의 system call로써 호출되어 CPU를 점유하게 된 커널은 CPU가 I/O 장치에 사용자 프로그램의 요청을 전달하게 한다.
4. I/O 장치의 CPU 사용 및 DMA(Direct Memory Access) controller
- device controller는 I/O 장치의 입/출력을 수행하며, 수행이 완료되면 CPU에 interrupt를 요청하여 완료 사실을 알린다. 이때 커널이 다시 CPU로 호출되어 이 정보를 받아 처리하여 다시 사용자 프로그램에 전달한다.
- 한편, I/O 장치의 interrupt가 발생할 때마다 이를 모두 CPU에 전달하게 하면 interrupt 빈도가 너무 잦을 경우 CPU가 제대로 연산을 수행 못하는 일이 일어날 수 있다. 이를 방지하기 위하여 보통은 I/O 장치의 device controller의 수행이 종료되면 그 결과가 local buffer에 저장되고, 전달할 양이 적당한 수준에 이르렀을 때가 되어서 비로소 interrupt를 요청한다(이때 쌓이게 된 결과값의 단위를 block이라 한다). 이때 DMA controller가 메인 메모리에 직접 접근하여 local buffer의 정보를 메인 메모리로 복사한다. (CPU 외에 메인 메모리로 직접 접근하는 별도의 장치가 있다는 사실에 주목할 필요가 있다.)
5. 디스크의 프로그램 파일이 메인 메모리에 로드되는 과정
(1) 프로그램의 실행에 필요한 모든 코드가 다 곧바로 메인 메모리에 로드되지는 않으며, 프로그램이 실행되면 일단 디스크 내에 가상 메모리가 만들어져 프로그램 실행에 필요한 코드들이 이곳에 로드되게 된다. (이때 가상 메모리 상에 로드된 프로그램의 주소값은 0번부터 지정되어 있으며 이를 logical address라 한다.)
(2) 이후 가상 메모리에 로드된 코드 중 당장 실행에 필요한 부분이 메인 메모리에 로드되게 된다. (이때 메인 메모리에 로드된 사용자 프로그램을 ‘프로세스’라 칭한다.)
- address binding: 이때 가상 메모리 상에 로드된 프로그램이 메인 메모리에 로드될 때 그 프로세스에게 할당되는 물리적 주소값은 그 프로세스의 logical address와는 다를 수밖에 없다. 그런데 CPU에서 그 프로세스의 메모리 상의 내용을 호출할 때에는 코드 내부적으로 logical address를 쓰고 있는 코드를 읽으므로, 그 프로세스의 logical address를 메모리 상의 실제 물리적 주소값에 대응시키는 작업이 필수적으로 이루어지게 된다. 이를 address binding이라 하며, 이러한 작업은 (OS가 아니라) CPU의 한 부분인 MMU라는 하드웨어가 담당한다.
- swap area: 프로그램의 수행 과정에서 실제 물리적인 메모리의 용량을 넘어서는 양의 메모리 공간이 필요한 경우가 있을 수 있다. 이에 대비하여 OS는 디스크에 swap area를 설정하여 프로그램 종료 전에 필요할 수 있으나 당장은 사용하지 않는 부분을 메인 메모리에서 swap area로 옮기는 식으로 메모리를 관리한다.
6. 프로세스의 메모리 내 구조
- 메모리에 로드된 프로세스는 크게 code, data, stack 세 부분으로 나뉘어 있다.
-
code: CPU를 사용하는 기계어 코드들이 저장돼 있다.
-
data: 현재 프로세스에서 사용하는 변수 및 자료구조가 저장돼 있다.
-
stack: 현재 프로세스가 실행하고 있는 함수들이 스택 구조로 저장돼 있다.
- 메모리 내 커널의 구조: 메모리에 로드된 커널 또한 크게 code, data, stack 세 부분으로 나뉘어 있으며, 각각이 갖는 내용 또한 프로세스와 유사하다.
-
data: 현재 컴퓨터 시스템에 설치된 I/O 장치 또는 메인 메모리에 로드된 프로세스들이 자료구조 형태로 저장돼 있다(이때 메인 메모리에 로드된 프로세스들이 커널의 data 부분에 저장된 것을 PCB라 한다).
-
stack: 현재 실행중인 프로세스들이 스택 구조로 저장돼 있다.
7. 캐시의 지역성
- 속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위해, 속도가 느린 장치에서 빠른 장치로 자주 불러오게 되는 내용을 속도가 빠른 장치 내에 임시로 저장해 두는 것을 caching이라 한다. caching이 효과가 있다는 추론은 ‘모든 데이터가 균등한 비율로 사용되는 것이 아니며 다른 데이터들보다 더 자주 쓰이는 일부 데이터가 있다’라는 ‘지역성의 원리’를 전제로 한다.
-
시간 지역성: 최근에 사용된 데이터는 이른 시간 내에 다시 사용되는 특성이 있다.
-
공간 지역성: 최근에 사용된 데이터와 가까운 위치에 있는 데이터들 위주로 사용되는 특성이 있다.