컴퓨터 시스템의 구조, Structure of Computer System
Last updated
Last updated
컴퓨터 시스템은 CPU와 Memory 로 구성된 컴퓨터와 I/O 장치들로 이루어져있다.
CPU : 매 클럭 사이클마다 메모리에서 인스트럭션을 읽어서 실행한다.
메모리 : CPU의 작업 공간
모든 I/O device 들은 그들을 관장하는 미니 CPU들을 가지고 있는데, 이것이 바로 device controller 이다.
제어 정보를 위해서 control register, status register 를 가지고 있으며,
처리한 연산결과를 저장하기 위한 local buffer 를 가진다.
device controller는 CPU의 역할을 하기 때문에 이 역시도 각각 메모리가 필요하게 되는데, 이것이 바로 local buffer 이다.
I/O 는 실제 device 와 local buffer 사이에서 일어난다.
I/O 가 끝났을 경우에, interrupt 로 CPU 에게 그 사실을 알린다.
참고
device driver : 장치구동기. OS 코드 중, 각 장치별 처리 루틴을 의미하며, 소프트웨어이다.
device controller : 장치제어기. 각 장치를 통제하는 일종의 작은 CPU 이며 하드웨어이다.
I/O 장치가 보내는 인터럽 신호에 의해 CPU가 너무 많이 인터럽이 걸려 비효율이 발생하는 것을 막기 위해서 DMA는 I/O 처리 결과를 locall buffer 에서 메인 메모리 내부의 대상 프로그램까지 데이터를 복사해주는 역할을 한다.
복사까지 완료한 뒤에는 CPU에게 인터럽을 걸어 I/O 작업의 결과가 무사히 복사되었다는 것을 알리는데, 그 인터럽의 횟수가 직접 I/O device 로부터 인터럽을 받는 것보다 현저히 줄게 되니, CPU가 보다 빠르고 효율적으로 일을 할 수 있게 된다.
CPU 와 DMA controller에 의해서 메모리가 동시에 접속되어 데이터가 유실되지 않도록 접속을 관리하는 역할을 수행한다.
CPU 안에는 메모리보다 빠르게 접근하여 데이터를 저장하고 조회할 수 있는 곳인 레지스터가 존재한다.
지금 CPU에서 실행되는 것이 운영체제인지, 사용자 프로그램인지를 구분해준다.
0 : 커널 모드
1 : 사용자 모드
0일 때는 무슨 일이든 다 할 수 있도록 정의되어있다. 1일때는 사용자 프로그램이 CPU를 가지고 있으니, 제한된 인스트럭션만 수행할 수 있도록 되어있다.
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치이다.
따라서 보안을 해칠 수 있는 중요한 명령어는 0 커널모드에서만 수행가능하다.
참고로 커널모드는 모니터모드, 시스템 모드라고 부르기도 한다.
interrupt 이나 exception 이 발생하면 하드웨어가 mode bit 을 0으로 바꾼다.
그리고 다시 사용자 프로그램에게 CPU를 넘기기 전에, mode bit을 1로 셋팅한다.
I/O device 및 기타 하드웨어에서 보내온 인터럽 신호를 전달받는 통로
CPU는 기본적으로 다음과 같은 사이클로 일을 한다.
메모리로부터 수행할 프로그램의 명령어 조회
연산 수행
인터럽트 라인에 인터럽 신호가 들어왔는지 체크
들어왔다면 그것을 수행한다.
안들어왔다면 다시 메모리로 돌아가 프로그램의 명령어를 조회한다.
위를 반복한다.
이때, CPU에게 다른 하드웨어로부터 전달된 인터럽 신호를 전달하는 통로가 바로 interrupt line 이 된다.
기본적으로 I/O device 는 그 자체로 속도가 굉장히 느리다.
CPU는 굉장히 빠르고 효율적인 존재이기 때문에 I/O device 들이 일을 끝낼때까지 마냥 놀고 먹으면서 기다릴 수가 없다.
때문에 CPU는 I/O device 의 인터럽이 발생하면 device controller들에게 그 작업을 수행하며 결과를 local buffer 에 쌓고 있으라고 명령한다.
그러면 CPU는 그동안 다시 메모리하고만 일하면서 다른 프로그램들을 실행하고 있는다.
만약에 메모리에 무한루프가 존재하는 프로그램이 실행되고 있다면?
하나의 프로그램이 CPU를 독점할수도 있는 상황이 발생하게 된다.
이때 필요한 것이 바로 timer 이다.
1초보다 훨씬 짧은 시간을 산정하여 프로그램이 한번 수행되는 시간을 제한하고, 제한 시간이 끝나면 interrupt line 에 인터럽 신호를 주어 사용자 프로그램으로부터 운영체제로 CPU 소유권을 자동 이전시킨다.
정해진 시간이 흐른 뒤, 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킨다.
매 클럭 틱 때마다 1씩 감소한다.
타이머 값이 0이 되면 타이머 인터럽트가 발생한다.
CPU를 특정 프로그램이 독점하는 것으로부터 보호한다.
time sharing 을 구현하기 위해 널리 이용된다.
현재 시간을 계산하기 위해서도 사용된다.
참고
메모리에서 프로그램의 실행이 종료가 되어도 CPU 소유권은 자동으로 운영체제로 이동한다.
사용자 프로그램에서 I/O작업이 필요할 때도 CPU 소유권을 자동으로 운영체제로 전달한다. 사용자 프로그램은 I/O device 에 접근할 수 있는 권한이 없기 때문이다.
결국 CPU 는 Program Counter 라는 레지스터에 적힌 메모리 주소로 이동하여 데이터를 조회하여 연산을 수행하고 그 결과를 다시 메모리에 적는 일을 반복적으로 수행할 뿐이다.
앞서 말한대로 모든 입출력 명령은 특권 명령으로써, 오직 운영체제만 그 권한을 가지기 때문에 커널모드에서만 수행될 수 있다.
그러면 사용자 프로그램은 어떻게 I/O 를 할 수 있을까?
사용자 프로그램에서 I/O 가 필요해지면, 프로그램 차원에서 interrupt 를 걸 수 있다. (커널함수호출)
그러면 interrupt line 을 확인한 CPU가 interrupt 가 걸리고, mode bit 이 1→0으로 변경된다.
이때부터 CPU 제어권은 운영체제에게 넘어가게 된다.
이 과정을 시스템콜
이라고 한다.
사용자 프로그램은 trap을 이용하여 인터럽트 백터의 특정 위치로 이동하게 된다.
제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동하며
올바른 I/O 요청인지 확인 후 이를 수행한다.
I/O 완료 시에 제어권을 시스템 콜 다음 명령으로 옮기게 된다.
Interrupt : 하드웨어 인터럽트로 timer, device controller 등 하드웨어가 발생시킨 인터럽트를 의미한다.
Trap : 소프트웨어 인터럽트로 사용자 프로그램에 의해 발생한 인터럽트를 의미한다.
exception : 프로그램이 오류를 범한 경우
system call : 프로그램이 커널 함수를 호출하는 경우
관련용어
인터럽트 벡터 : 해당 인터럽트의 처리 루틴 주소를 가지고 있다. 각 인터럽트의 종류마다 어디에 있는 함수를 수행해야하는지 정리해둔 것이다.
인터럽트 처리 루틴 : 해당 인터럽트를 처리하는 커널 함수.
인터럽트는 다양한 주체들에 의해 걸릴 수 있다. (timer, io device controller, 사용자 소프트웨어 등)
다양한 주체들 별로 수행해야하는 일들이 다른데, 이런 것들을 정리해둔 것이 바로 인터럽트 처리 루틴이다.
인터럽트 서비스 루틴, 인터럽트 핸들러라고도 한다.