01. 컴퓨터 하드웨어의 구성
컴퓨터 시스템은 데이터를 처리하는 물리적인 기계장치인 하드웨어와 어떤 작업을 지시하는 명령어로 작성한 프로그램인 소프트웨어로 구성된다. 운영체제는 컴퓨터 하드웨어를 관리하는 소프트웨어이다.
컴퓨터 하드웨어는 크게 프로세서(CPU), 메모리(메인 메모리), 주변장치로 구성되고, 이들은 시스템 버스로 연결한다.
1. 프로세서(=CPU)
프로세서는 컴퓨터 하드웨어에 부착한 모든 장치의 동작을 제어하고 명령을 실행한다.
프로세서는 연산장치와 제어장치, 레지스터로 구성되고, 이들은 내부 버스로 연결한다.
레지스터의 종류와 크기는 다양하다. 그리고 레지스터는 여러 관점으로 구분할 수 있다.
- 용도 : 전용 레지스터, 범용 레지스터
- 사용자가 정보를 변경할 수 있는지 : 사용자 가시 레지스터, 사용자 불가시 레지스터
- 저장하는 정보 : 데이터 레지스터, 주소 레지스터, 상태 레지스터 등
사용자 가시 레지스터(user-visible)는 사용자가 운영체제와 사용자 프로그램을 이용해 정보를 변경할 수 있는 레지스터이다. 그래서 접근이 가능한 데이터와 주소, 일부 조건 코드를 보관한다.
- 사용자 가시 레지스터
- 데이터 레지스터 : 함수 연산에 필요한 데이터를 저장한다. 값, 문자등을 저장하므로 산술 연산이나 논리 연산에 사용하며, 연산 결과로 플래그 값을 저장한다.
- 주소 레지스터 : 주소나 유효 주소를 계산하는 데 필요한 주소의 일부분을 저장한다. 주소 레지스터에 저장한 값을 사용하여 산술 연산을 할 수 있다.
사용자 불가시 레지스터는 사용자가 정보를 변경할 수 없는 레지스터이다. 프로세서의 상태와 제어를 관리한다.
- 사용자 불가시 레지스터
- 프로그램 카운터(PC) : 다음에 실행할 명령어의 주소를 보관하는 레지스터이다. 계수기로 되어 있어 실행할 명령어를 메모리에서 읽으면 명령어의 길이만큼 증가하여 다음 명령어를 가리키며, 분기 명령어는 목적 주소로 갱신할 수 있다.
- 명령어 레지스터(IR) : 현재 실행하는 명령어를 보관하는 레지스터이다.
- 누산기(ACC) : 데이터를 일시적으로 저장하는 레지스터이다.
- 메모리 주소 레지스터(MAR) : 프로세서가 참조하려는 데이터의 주소를 명시해 메모리에 접근하는 버퍼 레지스터이다.
- 메모리 버퍼 레지스터(MBR) : 프로세서가 메모리에서 읽거나 메모리에 저장할 데이터 자체를 보관하는 버퍼 레지스터이다. 메모리 데이터 레지스터(MDR)라고도 한다.
2. 메모리(레지스터, 캐시, 메인 메모리, 보조기억장치)
메모리는 컴퓨터 성능과 밀접한데, 속도가 빠른 메모리는 가격이 비싸서 보통은 메모리 계층 구조를 구성하여 비용, 속도, 용량, 접근시간 등을 상호 보완한다.
프로그램을 실행하거나 참조하려면 모두 메인 메모리에 올려야한다. 그렇다고 고가인 메인 메모리를 무작정 크게 할 수 없는데, 불필요한 프로그램과 데이터는 보조기억장치에 저장했다가 실행, 참조할 때만 메인 메모리로 옮기는 원리를 적용한 방법이다.
1) 레지스터
프로세서 내부에 있으며, 프로세서가 사용할 데이터를 보관하는 가장 빠른 메모리이다.
2) 메인 메모리(주기억장치)
프로세서 외부에 있으며, 프로세서에서 즉각적으로 수행할 프로그램과 데이터를 저장하거나 프로세서에서 처리한 결과를 메인 메모리에 저장한다. 주기억장치 또는 1차 기억장치라고도 한다. 저장 밀도가 높고 가격이 싼 DRAM을 많이 사용한다.
메인 메모리는 다수의 셀로 구성되며, 각 셀은 비트로 구성된다. 셀이 K비트이면 셀에 2**K값을 저장할 수 있다.
메인 메모리에 데이터를 저장할 때는 셀 한 개나 여러 개에 나눠서 저장한다. 셀은 주소로 참조하는데, n비트라면 주소 범위는 0~(2**n)-1이다.
컴퓨터에 주어진 주소를 물리적 주소라고 하는데, 프로그래머는 물리적 주소 대신 수식이나 변수를 사용한다.
컴파일러가 프로그램을 기계 명령어로 변환할 때 변수와 명령어에 주소를 할당하는데, 이 주소를 논리적 주소(가상 주소, 프로그램 주소)라고 한다. 논리적 주소는 별도의 주소 공간에 나타난다.
컴파일로 논리적 주소를 물리적 주소로 변환하는데 이 과정을 매핑(mapping) 또는 메모리 맵이라고 한다.
메모리 속도는 메모리 접근시간과 메모리 사이클 시간으로 표현할 수 있다.
메모리 접근시간은 명령이 발생한 후 목표 주소를 검색해 데이터 쓰기(읽기)를 시작할 때까지 걸린 시간이다.
(예 : 읽기 제어 신호를 가한 후 데이터를 메모리 버퍼 레지스터에 저장할 때까지 걸린시간)
메모리 사이클 시간은 두 번의 연속적인 메모리 동작 사이에 필요한 최소 지연시간이다.
(예 : 읽기 제어 신호를 가한 후 다음 읽기 제어 신호를 가할 수 있을 때까지 필요한 시간)
보통 사이클 시간이 접근시간보다 약간 길며, 메모리의 세부 구현 방법에 따라 다르다.
메인 메모리는 프로세서와 보조기억장치 사이에 있으며, 여기서 발생하는 디스크 입출력 병목 현상을 해결하는 역할도 한다. 그런데 프로세서와 메인 메모리 간에 속도 차이가 나면서 메인 메모리에 부담을 줄이려고 프로세서 내부나 외부에 캐시를 구현하기도 한다.
3) 캐시
프로세서 내부나 외부에 있으며, 처리 속도가 빠른 프로세서와 상대적으로 느린 메인 메모리의 속도 차이를 보완하는 고속 버퍼이다. 캐시는 메인 메모리에서 데이터를 블록 단위로 가져와 프로세서에 워드 단위로 전달하여 속도를 높인다. 그리고 데이터가 이동하는 통로(대역폭)를 확대해 프로세서와 메모리의 속도 차이를 줄인다.
캐시는 주소 영역을 한 번 읽어 들일 수 있는 크기로 나눈 후 각 블록에 번호를 부여해 이 번호를 태그로 저장한다.
프로세서는 메인 메모리에 접근하기 전에 캐시에 해당 주소의 자료가 있는지 먼저 확인한다.
캐시의 성능은 작은 용량의 캐시에 프로세서가 이후 참조할 정보가 얼마나 들어 있느냐로 좌우된다. 프로세서가 참조하려는 정보가 있을 때를 캐시 적중(cache hit), 반대로 없을 때를 캐시 실패(cache miss)라고 한다.
블록이 크면 캐시의 히트율이 올라갈 수 있음을 의미하지만, 블록이 커지면 이에 따른 전송 부담과 캐시 데이터 교체 작업이 자주 일어나므로 블록 크기를 무작정 늘릴 수는 없다.
4) 보조기억장치
주변장치 중 프로그램과 데이터를 저장하는 하드웨어로, 2차 기억장치 또는 외부기억장치라고도 한다. 자기디스크, 광디스크, 자기테이프 등이 있다.
3. 시스템 버스
시스템 버스는 하드웨어를 물리적으로 연결해 서로 데이터를 주고받을 수 있게 하는 통로이다. 컴퓨터 내부의 다양한 신호(데이터 입출력 신호, 프로세서 상태 신호, 인터럽트 요구와 허가 신호, 클록(clock) 신호 등)를 시스템 버스로 전달한다.
시스템 버스는 기능에 따라 데이터 버스, 주소 버스, 제어 버스로 구분한다.
- 데이터 버스 : 프로세서와 메인 메모리, 주변장치 사이에서 데이터를 전송한다. 데이터 버스를 구성하는 배선 수는 프로세서가 한 번에 전송할 수 있는 비트 수를 결정하는데, 이를 워드라고 한다.
- 주소 버스 : 프로세서가 시스템의 구성 요소를 식별하는 주소 정보를 전송한다. 주소 버스를 구성하는 배선 수는 프로세서와 접속할 수 있는 메인 메모리의 최대 용량을 결정한다.
- 제어 버스 : 프로세서가 시스템의 구성 요소를 제어하는 데 사용한다. 제어 신호로 연산장치의 연산 종류와 메인 메모리의 읽기나 쓰기 동작을 결정한다.
4. 주변장치(입출력장치)
주변장치는 프로세서와 메인 메모리를 제외한 나머지 하드웨어 구성 요소이다. 단순히 입출력 장치라고도 하나, 크게 입력장치, 출력장치, 저장장치로 구분한다.
02. 컴퓨터 시스템의 동작
컴퓨터 시스템으로 작업을 처리할 때는 다음 순서에 따라 동작한다.
- 입력장치로 정보를 입력받아 메모리에 저장한다.
- 메모리에 저장한 정보를 프로그램 제어에 따라 인출해 연산장치에서 처리한다.
- 처리한 정보를 출력장치에 표시하거나 보조기억장치에 저장한다.
입력장치로 컴퓨터에 유입되는 정보는 명령어와 데이터로 분류한다. 명령어는 실행할 산술, 논리 연산의 동작을 명시하는 문장으로, 어떤 작업을 수행하는 명령어 집합이 프로그램이다.
프로그램은 컴파일러 등을 이용하여 이진화된 기계 명령어로 변환해야 컴퓨터가 이해할 수 있다.
1. 명령어의 구조
명령어는 프로세서가 실행할 연산인 연산 부호와 명령어가 처리할 데이터, 데이터를 저장한 레지스터나 메모리 주소인 피연산자로 구성된다. 명령어는 프로세서에 따라 고정 길이나 가변 길이를 구성한다. 연산 부호는 특별한 경우가 아니면 한 개이나 피연산자는 여러 개일 수 있다.
- 연산 부호(OPcode) : 프로세서가 실행할 동작인 연산을 지정한다. 예를 들어, 산술연산(+, -, *, /), 논리 연산(AND, OR, NOT), 시프트(shift), 보수 등 연산을 정의한다. 연산 부호가 n비트이면 최대 2ⁿ개 연산이 가능하다.
- 피연산자(operand) : 연산할 데이터 정보를 저장한다. 데이터는 레지스터나 메모리, 가상기억장치, 입출력장치 등에 위치할 수 있다. 보통 데이터 자체보다는 데이터의 위치를 저장한다.
명령어는 실행 전에 메인 메모리에 저장하며, 한 번에 하나씩 프로세서에 순차적으로 전송하여 해석, 실행한다.
누산기
메모리에서 읽은 피연산자를 레지스터에 저장된 데이터와 연살할 때 사용되는 프로세서의 레지스터이다.
누산기는 프로그램의 명령어 수행 중에 산술, 논리 연산의 결과를 일시적으로 저장한다.
명령어에 피연산자의 위치를 명시하는 방법(직접 주소 또는 간접 주소)을 나타내는 모드 비트 I를 추가하거나, 다음 명령어의 위치를 나타내는 주소를 추가할 수 도 있다. 피연산자에 데이터가 있는 레지스터나 메모리 주소를 지정하면 직접주소라 하고, 데이터가 있는 레지스터나 메모리 주소 정보를 지정하면 간접 주소라고 한다.
모드가 1비트, 연산 부호가 3비트, 피연산자가 6비트인 명령어는 다음와 같다.
모드가 0이면 직접 주소, 1이면 간접 주소이다.
간접 주소는 데이터의 주소를 읽을 때 한 번, 데이터를 읽을 때 한번 총 두 번 메모리를 참조한다.
2. 명령어의 실행
프로세서의 제어장치가 명령어를 실행한다. 프로세서는 메모리에서 명령어를 한 번에 하나씩 인출하고 해석하여 연산한다. 명령어를 인출하여 연산 완료한 시점까지를 인출-해석-실행 사이클이라고 한다. 간단히 명령어 실행 사이클이라고도 한다.
명령어 실행 사이클은 명령어의 인출과 실행을 반복하는데, 이는 가장 일반적인 명령어 사이클이다.
메모리 간접 주소 지정 방법은 (b)와 같이 실행 사이클을 시작하기 앞서 그 데이터의 실제 주소를 기억장치에서 읽어 오는 간접 사이클을 이용하기도 한다. 그리고 인터럽트를 처리하려고 인터럽트 사이클을 사용하기도 한다.
1) 인출 사이클
인출 사이클(fetch cylce)은 명령어 실행 사이클의 첫 번째 단계이다. 인출 사이클은 메모리에서 명령어를 읽어 명령어 레지스터에 저장하고, 다음 명령어를 실행하려고 프로그램 카운터를 증가시킨다. 인출 사이클에 소요되는 시간을 명령어 인출 시간이라고 한다.
2) 실행 사이클
실행 사이클(execution cycle)에서는 인출한 명령어를 해독하고 그 결과에 따라 제어 신호를 발생시킨 명령어를 실행한다. 이 단계에서 소비되는 시간을 실행 시간이라고 한다.
3) 간접 사이클
직접 주소 지정 방법을 사용하는 실행 사이클은 명령어를 즉시 수행하지만, 간접 주소 지정방법을 사용하는 실행 사이클은 명령어를 수행하기 전에 실제 데이터가 저장된 주기억장치의 주소인 유효 주소를 한 번 더 읽어온다.
4) 인터럽트 사이클
인터럽트는 프로세서가 프로그램을 수행하는 동안 컴퓨터 시스템의 내부나 외부에서 발생하는 예기치 못한 사건을 의미한다. 프로세서는 실행 사이클을 완료한 후 인터럽트 요구가 있는지 검사한다. 인터럽트 요구가 있으면 다음 명령어를 인출하고, 인터럽트 요구가 있으면 현재 수행 중인 프로그램 주소(프로그램 카운터) 값을 스택이나 메모리 0번지와 같은 특정 장소에 저장한다. 그리고 프로그램 카운터에는 인터럽트 처리 루틴의 시작 주소를 저장해 두었다가 인터럽트 처리를 완료하면 중단된 프로그램으로 복귀하여 계속 수행한다.
3. 인터럽트 명령어
인터럽트는 현재 실행 중인 프로그램을 중단하고 다른 프로그램의 실행을 요구하는 명령어이다. 시스템의 처리 효율을 향상시키며, 프로그램이 실행 순서를 바꿔 가면서 처리하여 다중 프로그래밍에 사용한다.
또 인터럽트는 컴퓨터에 설치된 입출력장치나 프로그램 등에서 프로세서로 보내는 하드웨어 신호이다. 인터럽트를 받은 프로그램은 실행을 중단하고 다른 프로그램을 실행한다. 단일 프로세서의 컴퓨터는 명령어를 한 번에 한 개만 수행할 수 있지만, 인터럽트를 이용하면 중간에 다른 프로그램이나 명령어를 수행할 수 있다. 특히 인터럽트는 예상치 못한 사용자 입력, 갑작스런 정전, 컴퓨터 시스템에서 긴급 요청, 잘못된 명령어 수행, 입출력 작업 완료와 같은 상황을 시스템이 적절히 처리하는 데 필요하다. 인터럽트는 사용자가 별도로 조치할 필요가 없고 프로세서와 운영체제가 처리한다.
컴퓨터는 인터럽트를 외부장치의 동작과 자신의 동작을 조정하는 수단으로 사용한다. 예를 들어, 다중 사용자 시스템에 키보드를 여러 개 연결하면 각 키보드에서 입력되는 문자를 구분하여 처리해야 한다. 여러 키보드에서 동일한 문자를 동시에 입력해도 데이터를 손실하지 않고 수행해야 하므로, 컴퓨터는 해당 문자를 언제 입력했는지 알아야 한다. 그러므로 프로세서는 연결된 각 입출력장치의 현재 상태를 파악하고 있어야 하는데, 이 상태를 나타내려면 1비트 이상으로 표현된 준비 비트 또는 상태 비트가 필요하다. 입출력장치가 새로운 입출력 연산을 수행하려고 하면, 프로세서는 먼저 폴링(polling)으로 각 장치의 상태 비트를 검사한다. 그런데 인터럽트 개념이 없으면 장치의 상태를 계속 점검해야 해서 프로세서가 다른 연산을 수행할 수 없다. 이때 인터럽트를 사용하면 입출력장치가 준비 상태가 될 때까지 프로세서가 다른 작업을 수행할 수 있다. 즉 입출력장치가 준비 상태가 되었을 때 프로세서에 인터럽트 신호를 보내면 된다.
제어 버스 중 이런 목적으로 사용하는 것이 바로 인터럽트 요청 회선(IRQ, Interrupt ReQuest line)이다. 인터럽트 요청 회선을 사용하면 키보드에서 입력이 발생할 때만 프로세서에 통보하여 처리하므로, 프로세서가 이벤트 발생 여부를 일일히 검사하지 않아도 된다.
인터럽트는 크게 인터럽트 요청과 인터럽트 서비스 루틴으로 구분할 수 있다. 인터럽트 요청 신호에 따라 수행하는 루틴이 인터럽트 처리 프로그램, 즉 인터럽트 서비스 루틴이다.
인터럽트 요청 회선은 단일 회선과 다중 회선으로 연결할 수 있다.
- 단일 회선 : 인터럽트 요청이 가능한 모든 장치를 공통의 단일 회선으로 프로세서에 연결하는 방법. 회선 하나에 장치 여러 개 연결해 인터럽트를 요청한 장치를 판별하는 기능이 필요하다
- 다중 회선 : 모든 장치를 서로 다른 고유의 회선으로 프로세서와 연결하는 방법. 인터럽트를 요청한 장치를 바로 판별할 수 있다.
인터럽트 요청 신호가 발생하면 대부분의 컴퓨터는 정보를 단일 명령어로 저장할 수 있으므로
- 실행 중인 프로그램을 메모리에 저장
- 인터럽트 처리 프로그램으로 분기
- 인터럽트 처리 프로그램을 완료하면 인터럽트를 발생시킨 프로그램에 제어를 돌려줌
프로세서는 인터럽트 프로그램을 처라히가 전에 프로그램 카운터를 비롯해 중단된 프로그램으로 복귀하여 실행할 때 영향을 미치는 정보를 저장해햐 한다. 특히 인터럽트가 발생할 때의 상태 코드(상태 워드)를 임시 기억장치에 저장해 두었다가 나중에 복귀했을 때 이를 다시 적재해햐 한다. 그래야 원래 프로그램을 인터럽트의 영향을 받지 않고 다시 실행할 수 있다.
요약
01. 컴퓨터 시스템의 구성
컴퓨터 시스템은 하드웨어(프로세서, 메모리, 주변장치)와 소프트웨어(명령어로 작성한 프로그램)로 구성된다. 이런 구성 요소는 컴퓨터의 주 기능인 프로그램을 실행하려고 버스로 상호 연결되어 있다.
02. 프로세서의 개념
프로레서(CPU)는 컴퓨터 하드웨어 구성 요소 중 운영체제와 가장 밀접한 부분으로, 컴퓨터의 모든 장치의 동작을 제어하고 연산을 수행한다.
03. 프로세서의 구성
프로세서는 연산장치와 제어장치, 레지스터로 구성되며, 내부 버스로 연결되어 있다. 보통은 제어와 데이터 처리를 담당하며, 레지스터로 구성된다.
04. 레지스터의 구분
- 용도에 따라 : 전용 레지스터, 범용 레지스터
- 사용자가 정보를 변경할 수 있는지에 따라 : 사용자 가시 레지스터, 사용자 불가시 레지스터
- 저장하는 정보에 따라 : 데이터 레지스터, 주소 레지스터, 상태 레지스터 등
05. 메모리 종류
속도는 느리나 용량이 큰 자기디스크, 광디스크, 자기테이프 등 보조기억장치, 프로세서 외부에 있으면서 프로세서에서 수행할 프로그램과 데이터를 저장하거나 프로세서에서 처리한 결과를 저장하는 메인 메모리, 프로세서 내부나 외부에 있으면서 처리 속도가 빠른 프로세서와 상대적으로 속도가 느린 메인 메모리와의 속도 차이를 보완하는 고속 버퍼의 캐시, 속도는 가장 빠르나 용량이 작은 레지스터 등이 있다.
06. 메모리 계층 구조
여러 계층의 메모리를 연결해 비용, 속도, 용량, 접근시간 등을 상호 보완한 계층적 메모리나 구조를 메모리 계층 구조라고 한다.
07. 시스템 버스
시스템 버스는 하드웨어를 물리적으로 연결해 서로 데이터를 주고 받을 수 있게 하는 통로이다. 컴퓨터 내부의 다양한 신호(데이터 입출력 신호, 프로세서 상태 신호, 인터럽트 요구와 허가 신호, 클록 신호 등)를 시스템 버스로 전달한다. 시스템 버스는 기능에 따라 데이터 버스, 주소 버스, 제어 버스로 구분한다.
08. 주변장치
주변장치는 프로세서와 메인 메모리를 제외한 나머지 하드웨어 구성 요소이다. 단순히 입출력장치라고도 하는데, 크게 입력장치, 출력장치, 저장장치로 구분한다.
09. 명령어 구조
명령어는 사용자가 원하는 연산과 피연산자, 처리 순서를 프로세서에 지시하는 것이다. 연산부호(OPcode)와 명령어가 처리할 데이터, 데이터가 저장된 레지스터나 메모리 주소인 피연산자(operand)로 구성된다.
10. 명령어 실행
컴퓨터 시스템의 메모리에 보관한다. 한 번에 한 개씩 프로세서로 전송하면서 해석, 실행한다.
명령어는 명령어 인출과 명령어 실행 주기의 반복 처리로 실행한다. 명령어 실행 사이클은 인출 사이클, 간접 사이클, 실행 사이클, 인터럽트 사이클로 구성된다.
11. 인터럽트
인터럽트는 현재 실행 중인 프로그램의 수행을 연기하고 다른 프로그램의 수행을 요구하는 명령이다. 시스템의 처리 효율을 향상시키며, 프로그램이 실행 순서를 바꿔 가면서 처리하여 다중 프로그래밍에 사용된다.
- 플래그 : 컴퓨터에서 무언가를 기억하거나 또는 다른 프로그램에게 약속된 신호를 남기기 위한 용도로 프로그램에 사용되는 미리 정의된 비트
- 버퍼 : 컴퓨터의 주기억 장치와 주변장치 사이에서 데이터를 주고받을 때, 둘 사이의 전송속도 차이를 해결하기 위해 전송할 정보를 임시로 저장하는 고속 기억장치
- 병목현상 : 시스템의 전체 성능이나 용량이 하나 혹은 소수 개의 구성 요소나 자원에 의해 제한 받는 현상
- 클록신호 : 동기화에 사용하는 주기적 신호. 클록펄스라고도 함
- 폴링 : 통신 송수신 준비 또는 전송 동기화를 위해 여러 장비와 프로그램에 차례로 정기적으로 문의하여, 일정한 조건을 충족한 경우 전송하고 처리하는 통신 방식
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 03. 프로세스와 스레드 (0) | 2021.03.31 |
---|---|
[운영체제] 02. 운영체제의 소개 (0) | 2021.03.26 |