본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Computer Science

입출력 구조와 시스템 버스

작성 2026. 10. 14.추가
목차23개 항목
출처와 참고

노션 정리와 diadia blog의 「컴퓨터 구조 요약 - 11. 입출력 구조」(2021.01)를 바탕으로 재구성한 노트다. 「입출력 인터페이스와 장치 컨트롤러」, 「DMA와 입출력 프로세서」, 「레지스터로 장치를 직접 다루는 예」 절은 강민철의 「혼자 공부하는 컴퓨터 구조+운영체제」 강의(한빛미디어)를 바탕으로 보강했다. 「폴링과 인터럽트」, 「입출력 버퍼링」 절은 fru1tworld/cs-basic 모의 면접 질문 목록을 점검해 빠진 개념을 보강했다. 상태/제어 레지스터의 주소 공유, 메모리 맵 I/O와 격리형 I/O의 비교, 인터럽트 장치 식별 방식의 장단점, 「시스템 버스」·「버스 중재」 절은 고려사이버대학교 「컴퓨터구조」(2024-1학기) 강의 내용으로 보강했다.

키보드, 디스크, 네트워크 카드 같은 주변 장치는 CPU보다 훨씬 느리고 데이터 형식도 제각각이다. 입출력 구조는 이 차이를 메우고, CPU가 기다리느라 시간을 낭비하지 않도록 하는 방법을 다룬다. 장치들이 함께 쓰는 통로인 시스템 버스와 버스 중재도 여기서 다룬다.

입출력 인터페이스와 장치 컨트롤러

CPU와 주변 장치 사이의 통로를 컴퓨터 구조 교재는 입출력 인터페이스, 운영체제 교재는 장치 컨트롤러(입출력 제어기)라고 부른다. 신호 방식·전송 속도·데이터 형식의 차이를 메우고, 여러 장치의 순서와 우선순위를 조정한다.

역할설명
통신 중개CPU와 입출력장치 사이를 잇고, 장치의 신호·코드를 메모리 워드로 바꾼다
오류 검출장치와 주고받은 데이터의 오류를 확인한다
데이터 버퍼링버퍼에 모았다가 한꺼번에 보내거나, 한꺼번에 받아 조금씩 보내 전송률 차이를 완화한다
내부 레지스터담는 것
데이터 레지스터CPU와 장치가 주고받을 데이터. 데이터가 많은 장치는 RAM을 쓰기도 한다
상태 레지스터장치가 준비됐는지, 오류가 있는지
제어 레지스터장치가 수행할 일에 대한 제어 정보와 명령

상태 레지스터와 제어 레지스터는 장치에 따라 상태/제어 레지스터 하나로 합쳐 쓰기도 한다. 안에는 레지스터가 둘이지만 주소는 하나라서, CPU가 그 주소를 읽으면 상태 레지스터가, 쓰면 제어 레지스터가 선택된다. 그래서 장치 하나에 보통 주소 두 개(데이터 레지스터, 상태/제어 레지스터)를 준다. 모든 입출력 장치는 하나 이상의 컨트롤러에 연결되고, 컨트롤러 하나에 여러 장치가 붙기도 한다.

장치 드라이버는 장치 컨트롤러를 감지하고 제어하는 OS 쪽 소프트웨어다. 컨트롤러가 장치와 컴퓨터를 잇는 하드웨어 통로라면, 드라이버는 그 컨트롤러를 어떻게 다룰지 아는 소프트웨어 통로다. 운영체제가 드라이버를 인식하고 실행해야 어느 회사의 어떤 장치든 쓸 수 있다. 그래서 새 장치를 연결했는데 인식되지 않으면 가장 먼저 드라이버가 설치·동작하는지를 확인한다.

입출력 방법

방법동작CPU 부담
프로그램 입출력CPU가 컨트롤러의 레지스터를 직접 읽고 쓴다. 쓰기 명령 → 상태 레지스터를 주기적으로 확인(폴링) → 준비되면 데이터 레지스터에 쓴다큼
인터럽트 기반 입출력CPU는 명령만 내리고 다른 일을 하다가, 컨트롤러가 거는 인터럽트를 받아 처리한다중간
DMA 입출력DMA 컨트롤러가 장치와 메모리 사이 전송을 맡고, 끝나면 인터럽트로 알린다작음
입출력 프로세서(IOP)자체 명령어 프로그램을 실행하는 입출력 전담 프로세서가장 작음

폴링과 인터럽트

비교폴링인터럽트
동작CPU가 장치의 상태 레지스터를 주기적으로 확인한다장치가 준비되면 CPU에 신호를 보낸다
장점구현이 단순하다. 이벤트가 매우 잦으면 확인할 때마다 일이 있어 낭비가 적고 지연도 짧다이벤트가 드물 때 CPU가 그동안 다른 일을 한다
단점이벤트가 드물면 확인이 헛수고라 CPU를 낭비한다인터럽트마다 상태 저장·복원 비용이 든다. 너무 잦으면 처리만 하다 실제 일을 못 하는 인터럽트 폭주(livelock)가 생긴다

그래서 고속 장치는 둘을 섞는다. Linux 네트워크 스택의 NAPI는 첫 패킷은 인터럽트로 받고, 트래픽이 많은 동안은 인터럽트를 끄고 폴링하다가 조용해지면 인터럽트로 돌아간다. DPDK 같은 사용자 공간 네트워킹과 초고속 NVMe 저장 장치의 폴링 모드는 아예 폴링만 쓴다.

입출력 버퍼링

버퍼는 속도나 전송 단위가 다른 두 쪽 사이에서 데이터를 잠시 담아 두는 메모리다. 다른 곳에 원본이 있는 데이터의 사본을 빠른 곳에 두는 캐시와 달리, 버퍼는 옮기는 도중의 데이터를 담는다.

쓰는 이유예
속도 차이 흡수느린 장치가 데이터를 모으는 동안 CPU는 다른 일을 한다. 키보드 입력 버퍼, 프린터 스풀
전송 단위 맞추기바이트 단위로 쓰는 프로그램과 블록 단위로 읽고 쓰는 디스크·네트워크 사이
호출 횟수 줄이기작은 쓰기를 모아 한 번에 보낸다. stdio 버퍼
복사 의미 지키기write 호출이 끝난 뒤 프로그램이 자기 버퍼를 고쳐도, 이미 커널 버퍼에 복사된 데이터는 바뀌지 않는다
구조동작
단일 버퍼버퍼가 찰 때까지 채우고, 비우는 동안은 다음 데이터를 받지 못한다
이중 버퍼하나를 채우는 동안 다른 하나를 처리해 두 일을 겹친다. 화면 출력의 더블 버퍼링
원형 버퍼(링 버퍼)생산자와 소비자가 같은 배열을 돌며 쓰고 읽는다. 네트워크 카드의 수신 링, io_uring의 제출·완료 큐

운영체제가 두는 stdio 버퍼와 페이지 캐시의 두 층은 UNIX 파일 입출력에 있다.

레지스터로 장치를 직접 다루는 예

마이크로컨트롤러에서는 장치 컨트롤러의 레지스터가 정해진 이름(주소)으로 드러나 있어, 프로그램이 그 레지스터를 직접 읽고 써서 입출력을 한다. AVR(ATmega128) 기준으로 보면 다음과 같다.

레지스터역할
DDRx (Data Direction Register)포트 x의 각 핀을 출력(1)으로 쓸지 입력(0)으로 쓸지 정한다
PORTx출력으로 정한 핀에 내보낼 값을 쓴다
PINx입력으로 정한 핀의 현재 값을 읽는다
SREG의 I 비트플래그 레지스터의 전역 인터럽트 허용 비트. 1이어야 외부(하드웨어) 인터럽트를 받는다
EIMSK외부 인터럽트 INT0~INT7을 하나씩 허용·차단하는 마스크
EICRBINT4~INT7을 신호의 어느 순간(하강 에지 등)에 일으킬지 정한다

포트 A에 LED 8개, 포트 E의 4번 핀(INT4)에 스위치가 연결된 보드에서 스위치를 누를 때마다 LED 전체를 켜고 끄는 코드는 다음과 같다.

#include <avr/io.h>
#include <avr/interrupt.h>
 
volatile uint8_t data = 0x00;
 
ISR(INT4_vect) {            // 스위치가 눌리면 실행되는 인터럽트 서비스 루틴
    data = ~data;           // 모든 비트를 뒤집는다
}
 
int main(void) {
    DDRA = 0xFF;            // 포트 A 8개 핀을 모두 출력으로
    DDRE &= ~(1 << PE4);    // PE4(스위치)를 입력으로
    EICRB = 1 << ISC41;     // INT4를 하강 에지에서 일으킨다
    EIMSK = 1 << INT4;      // 외부 인터럽트 중 INT4만 허용
    sei();                  // SREG의 I 비트를 1로: 인터럽트 전역 허용
    for (;;) PORTA = data;  // 현재 값을 LED로 내보낸다
}

PORTA = 0b10000001처럼 쓰면 양 끝 LED만 켜진다(1을 쓰면 켜지는 회로 기준). 운영체제가 있는 PC에서는 이 일을 장치 드라이버가 커널 안에서 하고, 사용자 프로그램은 시스템 콜로 요청한다(컴퓨터 시스템 구조와 인터럽트). 레지스터를 읽고 쓰는 맨 아래 단의 동작은 같다.

비동기 데이터 전송

송신과 수신이 같은 클럭을 공유하지 않을 때는 신호로 타이밍을 맞춘다. 스트로브 제어는 한쪽이 "지금 데이터가 버스에 있다"고만 알려 상대가 받았는지 확인할 수 없다. 핸드셰이킹은 응답 신호를 하나 더 두고, 응답이 없으면 타임아웃으로 감지한다.

시작하는 쪽핸드셰이킹 신호 순서
송신 측송신이 data valid를 올림 → 수신이 받고 data accepted를 올림 → 송신이 data valid를 내림
수신 측수신이 ready for data를 올림 → 송신이 데이터와 data valid를 올림 → 수신이 받고 ready for data를 내림

비동기 직렬 전송

  • 문자 하나에 시작 비트 1개 + 데이터 비트 + 정지 비트를 붙인다. 예: 1 + 8 + 2 = 11비트로 8비트 문자 하나. 한 비트의 시간은 1 / 전송 속도(bps)다.
  • 이를 처리하는 칩이 UART다. 시프트 레지스터로 병렬 데이터를 직렬로 바꾸며, 송수신 모두 이중 버퍼라 한 문자를 보내는 동안 CPU가 다음 문자를 미리 넣어 둘 수 있다.
  • 속도가 다른 두 장치 사이에는 FIFO 버퍼를 둔다.
수신 에러원인
패리티 에러받은 문자의 패리티가 맞지 않는다
프레이밍 에러정지 비트 자리에서 정지 비트가 검출되지 않는다
오버런 에러CPU가 앞 문자를 읽기 전에 다음 문자가 도착해 덮어쓴다

인터럽트 처리

처리 순서

1. 장치(컨트롤러)가 CPU에 인터럽트 요청 신호를 보낸다
2. CPU는 실행 사이클이 끝나고 다음 명령어를 인출하기 전에 요청이 있는지 확인한다
3. 인터럽트 플래그(IEN)로 지금 받아들일 수 있는지 본다 (NMI는 막을 수 없다)
4. 받아들이면 PC와 레지스터·플래그(PSW)를 저장한다
5. 인터럽트 벡터에서 서비스 루틴(ISR, 인터럽트 핸들러)의 시작 주소를 찾아 실행한다
6. ISR이 끝나면 저장한 상태를 복구해 하던 일을 이어 간다

장치마다 처리 방법이 달라 ISR도 장치마다 따로 있다. 처리 루틴 주소가 메모리의 고정 위치에 있으면 비벡터 인터럽트, 장치가 루틴의 위치(벡터 주소, VAD)를 알려 주면 벡터 인터럽트다.

중첩 인터럽트를 허용할 때는 4번과 5번 사이에 같거나 낮은 우선순위 요청을 마스크로 막고 IEN을 다시 켜서 더 높은 우선순위만 받아들인다. 종료할 때는 IEN을 끄고, 레지스터를 복원하고 처리한 요청 비트를 지운 뒤, 마스크를 되돌리고 복귀 주소를 PC에 넣으며 IEN을 다시 켠다.

우선순위 정하기

여러 장치가 동시에 요청하면 CPU는 누가 요청했는지 찾고 누구를 먼저 처리할지 정해야 한다.

방식동작장단점
다중 인터럽트 선장치마다 인터럽트 요청(INTR)선과 확인(INTA)선을 CPU에 따로 잇는다요청한 장치를 바로 안다. 대신 배선이 많고, 붙일 수 있는 장치 수가 CPU의 인터럽트 입력 핀 수로 묶인다
소프트웨어 폴링인터럽트가 오면 CPU가 TEST I/O 선 등으로 장치의 인터럽트 플래그를 하나씩 검사한다. 검사 순서가 곧 우선순위다우선순위를 바꾸기 쉽지만 장치가 많으면 찾는 데 오래 걸린다
데이지 체인장치들을 우선순위 순으로 직렬 연결한다. CPU의 승인(acknowledge) 신호가 높은 장치부터 전달되고, 요청한 장치가 받으면 자기 VAD(인터럽트 벡터)를 데이터 버스에 올리고 전달을 멈춘다. 요청하지 않은 장치는 승인 신호를 다음 장치로 넘긴다INTR·INTA 선이 하나씩이라 하드웨어가 단순하다. 앞쪽 장치가 계속 요청하면 뒤쪽 장치는 오래 기다린다(기아)
병렬 우선순위장치마다 비트 하나인 인터럽트 레지스터와 개별 허용·차단용 마스크 레지스터를 AND해 우선순위 인코더에 넣으면, 가장 높은 요청의 VAD만 나온다. IEN 플립플롭이 전체를 켜고 끄며, CPU는 인터럽트를 인식하면 보통 IEN을 0으로 만든다하드웨어가 한 번에 골라 빠르고, 마스크로 장치별 허용·차단을 바꿀 수 있다
PIC현대 PC의 PIC(Programmable Interrupt Controller)가 컨트롤러들의 요청을 받아 하나를 골라 CPU에 보낸다. CPU가 확인 신호를 보내면 PIC가 데이터 버스로 인터럽트 벡터를 넘긴다. 여러 개를 계층적으로 연결해 쓴다위 방식들을 칩 하나에 모은 것. 우선순위·마스크를 소프트웨어로 설정한다

정전·하드웨어 고장처럼 플래그로 막을 수 없는 최우선 인터럽트가 NMI(Non-Maskable Interrupt)이며, PIC를 거치지 않는다.

DMA와 입출력 프로세서

프로그램 입출력과 인터럽트 기반 입출력에서는 장치와 메모리 사이의 데이터가 반드시 CPU 레지스터를 거친다. 디스크의 데이터를 메모리로 옮기려면 CPU가 컨트롤러의 데이터 레지스터를 읽어 자기 레지스터에 담고, 다시 메모리에 써야 한다. 백업처럼 큰 데이터를 옮기면 CPU가 이 복사에 묶인다. DMA는 이 복사를 CPU 대신 맡아, CPU는 입출력의 시작과 끝에만 관여한다.

DMA 컨트롤러가 버스 요청(bus request)을 보내고 CPU가 버스 승인(bus grant)을 하면, 컨트롤러가 버스를 넘겨받아 직접 전송한다. 그동안 CPU는 메모리 버스를 쓸 수 없다. CPU는 시작 주소(주소 레지스터), 워드 수(워드 카운트 레지스터), 읽기/쓰기 모드(제어 레지스터)를 설정해 시작만 시키고, 끝나면 인터럽트를 받는다.

전송 방식동작
버스트 전송버스를 잡은 동안 블록 전체를 연속 전송. 빠르지만 CPU가 오래 기다린다
사이클 스틸링한 번에 한 워드만 보내고 버스를 돌려준다. CPU는 메모리 사이클 하나씩만 "도둑맞는다"

DMA가 시스템 버스를 자주 쓰면 CPU가 그만큼 버스를 못 쓴다. 장치 컨트롤러까지 시스템 버스에 붙어 있으면, 메모리 내용을 디스크로 보낼 때 DMA 컨트롤러가 메모리에서 읽느라 한 번, 컨트롤러에 쓰느라 또 한 번, 같은 데이터로 시스템 버스를 두 번 쓴다. 그래서 장치 컨트롤러들을 별도의 입출력 버스(PCI Express 등)에 연결하고, 입출력 버스가 시스템 버스와 이어지게 한다. 메인보드의 확장 슬롯이 입출력 버스의 접점이다.

입출력 프로세서(IOP, 데이터 채널)는 DMA 컨트롤러와 달리 자체 명령어 프로그램을 실행한다. 8비트 문자를 모아 32비트 워드로 만드는 것처럼 데이터 형식을 재구성하고, CPU와는 주로 메모리를 통해 소통한다. CPU가 명령을 남기면 IOP가 상태를 기록하고 DMA로 전송한 뒤 인터럽트로 알린다.

시스템 버스

시스템 버스는 CPU, 메모리, 입출력 컨트롤러가 정보를 주고받는 공용 통로다. 부품 네 개가 버스로 명령어를 실행하는 큰 그림은 컴퓨터 시스템의 기본 구성에, 레지스터 사이의 내부 버스는 레지스터 전송과 마이크로 연산에 있다.

버스를 이루는 선

선방향하는 일폭이 정하는 것
데이터 버스양방향실제 데이터를 나른다한 번에 옮기는 비트 수
주소 버스단방향(CPU → 메모리·I/O)읽거나 쓸 위치를 지정한다접근할 수 있는 메모리 크기
제어 버스신호마다 다름언제, 무엇을 할지 알린다-

주소선이 n개면 2ⁿ곳을 가리킨다. 바이트마다 주소를 매기면 최대 용량은 2ⁿ바이트(20비트인 8086은 1MiB, 32비트는 4GiB), 4바이트 워드마다 매기면 그 4배다. 제어 버스에는 성격이 다른 신호가 섞여 있다.

묶음신호
데이터 교환메모리 읽기·쓰기, I/O 읽기·쓰기
중재 버스버스 요구(BREQ), 버스 승인(BGNT), 버스 사용 중(BBUSY)
인터럽트 버스인터럽트 요구(IRQ), 인터럽트 확인(INTA)
기타버스 클럭(동기식 버스), 리셋

쓰기는 버스 사용권을 얻은 뒤 주소, 데이터, 쓰기 신호를 함께 싣는다. 읽기는 사용권을 얻고 주소와 읽기 신호를 실은 뒤 메모리가 데이터를 실을 때까지 기다린다.

버스 대역폭

단위 시간에 옮길 수 있는 데이터 양이다. 클럭 한 주기에 한 번 전송한다면 대역폭 = 데이터 버스 폭(바이트) / 클럭 주기다. 폭 32비트(4B), 클럭 100MHz(주기 10ns)면 4B / 10ns = 400MB/s다. DDR 메모리처럼 주기당 두 번 보내면 그만큼 곱한다. 현대 메모리 채널의 계산은 메모리 계층 구조에 있다.

동기식 버스와 비동기식 버스

구분동기식비동기식
기준모든 동작이 공통 버스 클럭의 에지에 맞춰 시작한다앞 동작이 끝났다는 신호를 받으면 다음 동작이 시작된다(위 「비동기 데이터 전송」의 핸드셰이크)
장점인터페이스 회로가 단순하다동작이 끝나면 바로 다음으로 넘어가 낭비가 없다
단점클럭 주기를 가장 느린 동작에 맞춰야 해서, 빨리 끝난 동작도 다음 에지까지 기다린다요청·응답 신호를 주고받는 회로가 복잡하다

버스 구성과 I/O 주소

구성설명
버스를 따로 둠메모리 버스와 I/O 버스가 분리된다. I/O 쪽은 IOP가 맡는 경우가 많다
공통 버스 + 제어선 분리 → 격리형 I/O(Port-mapped)메모리와 I/O 주소 공간이 따로다. IN/OUT 같은 전용 명령을 쓰고, 메모리 주소 공간을 온전히 쓴다
공통 버스 + 제어선 공통 → 메모리 맵 I/O메모리 주소 일부를 장치에 할당해 일반 load/store로 접근한다. 전용 명령이 없어 구조가 단순하다(임베디드에서 흔함)

두 주소 방식은 주소 공간과 프로그래밍 편의를 맞바꾼다. 주소가 10비트(1024곳)인 CPU로 비교하면 다음과 같다.

비교메모리 맵 I/O격리형 I/O
주소 공간예: 0511번지는 메모리, 5121023번지는 장치 레지스터. 메모리가 쓸 공간이 그만큼 준다메모리 1024곳과 별도로 I/O 주소 1024곳
명령어LOAD·STORE 등 메모리 명령어를 모두 쓸 수 있어 프로그래밍이 쉽다IN·OUT 같은 I/O 명령어만 쓸 수 있어 불편하다
제어 신호메모리 읽기/쓰기 신호를 그대로 쓴다I/O 읽기/쓰기 신호가 따로 필요하다

64비트 주소 공간에서는 메모리 맵 I/O로 잃는 공간이 문제가 되지 않아, PCIe 장치 레지스터도 메모리 맵으로 접근한다. x86은 옛 장치와의 호환을 위해 IN·OUT 포트 공간도 함께 남겨 두었다.

버스 중재

버스에서 전송을 시작할 수 있는 장치를 버스 마스터라 한다. CPU뿐 아니라 DMA 제어기, 입출력 프로세서, 다른 CPU도 마스터가 된다. 둘 이상이 동시에 버스를 요구하는 것이 버스 경합이고, 이때 하나를 골라 차례로 쓰게 하는 하드웨어가 버스 중재기다. 위 DMA의 버스 요청·승인이 가장 단순한 경우(마스터가 CPU와 DMA 둘)다.

축종류의미
신호 배선병렬마스터마다 요구선·승인선을 따로 둔다. 선이 마스터 수만큼 필요하다
직렬요구선과 승인선이 하나씩이고, 승인선을 마스터들이 줄줄이 잇는다
중재기 위치중앙집중식시스템에 중재기가 하나
분산식마스터마다 중재기를 두고 서로 판단한다

병렬 중재

  • 중앙집중식 고정 우선순위: 모든 마스터의 BREQ가 중재기 하나로 모이고, 중재기는 정해진 순서에서 가장 높은 마스터에게 BGNT를 준다. 승인받은 마스터는 현재 사용자가 BBUSY를 내릴 때까지 기다렸다가 BBUSY를 올리고 버스를 쓴다. PCI 버스가 슬롯마다 REQ#/GNT# 선을 따로 두고 칩셋의 중재기가 고르는 구조였다.
  • 분산식 고정 우선순위: 마스터마다 중재기를 두고, 각 중재기는 자기보다 우선순위가 높은 마스터들의 요구선을 본다. 위에서 아무도 요구하지 않을 때만 자기 마스터에게 승인을 준다. 중앙 중재기를 거치지 않아 빠르지만, 중재기 하나가 고장 나면 원인을 찾기 어렵고 전체에 영향을 줄 수 있다.
  • 가변 우선순위: 고정 우선순위에서는 낮은 마스터가 굶을 수 있다. 우선순위를 상황에 따라 바꾸면 공정해지는 대신 회로가 복잡해진다.
가변 정책방법
회전(라운드 로빈)중재할 때마다 우선순위를 한 칸씩 돌린다. 방금 승인받은 마스터를 맨 뒤로 보내는 방식도 있다
동등 우선순위(FIFO)요구한 순서대로 승인한다
임의 우선순위중재할 때마다 순서를 무작위로 정한다
LRU가장 오래 버스를 쓰지 않은 마스터에게 최우선권을 준다. 가장 공정하지만 회로가 가장 복잡하다

직렬 중재 (데이지 체인)

  • 중앙집중식: 요구선은 모든 마스터가 공유하고, 승인선은 중재기에서 출발해 마스터를 차례로 지난다. 승인 신호를 받은 마스터는 요구 중이면 신호를 붙잡아 버스를 쓰고, 아니면 다음으로 넘긴다. 그래서 중재기에 가까울수록 우선순위가 높다. 선은 적지만 뒤쪽 마스터는 굶기 쉽고, 중간 장치 하나가 빠지면 뒤로 신호가 가지 않는다. 위 「우선순위 정하기」의 데이지 체인 인터럽트와 같은 구조다.
  • 분산식: 중재기들을 승인선(DBGNT)으로 원형으로 잇는다. 버스를 쓰기 시작한 마스터의 중재기가 오른쪽 이웃에게 DBGNT를 넘기고, 이웃은 요구 중이면 받고 아니면 다시 넘긴다. 방금 쓴 마스터가 가장 낮은 우선순위가 되어 우선순위가 저절로 돈다. 대신 고리의 한 곳만 끊겨도 전체가 멈춘다.

폴링 중재

중재기가 마스터를 차례로 불러 버스가 필요한지 묻는다. 하드웨어 폴링은 중재기가 폴링 주소로 마스터 하나를 지정하고, 그 마스터가 원하면 BREQ를 올린다. 주소를 2진 코드로 보내면 폴링선은 log₂N개면 되고, 검사 순서(보통 2진 카운터)가 곧 우선순위다. 소프트웨어 폴링은 중재기 안의 프로세서가 프로그램으로 순서를 관리해, 느리지만 우선순위를 바꾸기 쉽다.

방식배선공정성결함 내성특징
병렬 중앙집중 고정마스터마다 2선낮음중재기가 단일 장애점단순하고 빠름
병렬 분산 고정상위 요구선을 모두 봄낮음고장 위치 찾기 어려움중앙 중재기 없음
가변 우선순위병렬높음-회로 복잡
데이지 체인(중앙)공유선 몇 개낮음(위치가 순위)중간 장치 고장에 취약배선 최소
분산 순환원형 승인선높음(자동 회전)한 곳만 끊겨도 정지우선순위 자동 회전
폴링log₂N 폴링선순서에 따라-순서를 바꾸기 쉬움(SW)

지금의 버스

PC 내부는 여러 장치가 선 한 묶음을 나눠 쓰는 공유 버스에서 장치마다 따로 놓인 점대점 직렬 링크(PCIe, CPU 간 UPI·Infinity Fabric)로 바뀌었다. 링크를 혼자 쓰므로 공유 버스 중재는 줄었고, 경합은 스위치와 메모리 컨트롤러의 큐에서 조정한다. 장치가 스스로 메모리에 쓰는 버스 마스터링(DMA) 개념은 그대로 남았다.

공유 선을 쓰는 저속 버스에는 분산 중재가 살아 있다. I²C와 CAN은 여러 장치가 같은 선에 동시에 비트를 보내고, 0이 1을 이기는 배선(wired-AND) 특성을 이용한다. 1을 보냈는데 선에서 0이 읽힌 장치는 진 것을 알고 물러난다. 주소나 ID가 작을수록 이기므로 그 값이 곧 우선순위다.

직렬 통신

주제방식내용
에러 검출LRC블록 안 모든 문자를 XOR한 값을 덧붙인다
에러 검출CRC다항식 나눗셈(시프트 레지스터 + XOR)으로 검사 값을 만든다. 연속 비트가 깨지는 버스트 에러에 강하다. 다시 계산한 값이 다르면 재전송을 요청한다
전송 방향단방향(simplex) / 반이중(half-duplex) / 전이중(full-duplex)한쪽으로만(방송) / 양방향이지만 번갈아(무전기) / 동시에 양방향(전화)
링크 프로토콜문자 지향특수 제어 문자로 프레임 경계를 표시한다. 데이터에 같은 패턴이 나오면 오해되는 데이터 투명성 문제를 DLE 문자로 피하지만 번거롭다
링크 프로토콜비트 지향 (HDLC 등)플래그 01111110으로 경계를 표시하고, 1이 다섯 번 연속되면 0을 끼워 넣어(비트 스터핑) 같은 패턴을 막는다

핵심 정리

  • 폴링 → 인터럽트 → DMA → IOP 순으로 CPU의 입출력 부담이 줄어든다.
  • 인터럽트는 명령어 사이클 끝에서 확인하고, 상태를 저장한 뒤 벡터로 ISR을 찾아 실행하고 복구한다.
  • 인터럽트 우선순위는 데이지 체인(직렬), 마스크 + 우선순위 인코더(병렬), PIC로 정한다.
  • 시스템 버스는 데이터(양방향)·주소(단방향)·제어 선으로 이뤄지고, 주소 폭이 메모리 크기를, 데이터 폭과 클럭이 대역폭을 정한다. 동기식은 회로가 단순하지만 가장 느린 동작에 맞춰지고, 비동기식은 핸드셰이크 회로가 복잡하다.
  • 버스 중재는 배선(병렬·직렬)과 중재기 위치(중앙·분산)로 나뉜다. 고정 우선순위는 단순하고 가변 우선순위는 공정하며, 데이지 체인은 배선이 가장 적지만 위치가 곧 우선순위다. 현대 PC는 점대점 링크로 공유 버스 중재가 줄었다.
  • 직렬 통신은 CRC로 에러를 검출하고, 비트 스터핑으로 데이터 투명성을 확보한다.

관련 노트: 컴퓨터 시스템 구조와 인터럽트, CPU와 명령어 구조, 컴퓨터 시스템의 기본 구성, 메모리 계층 구조, 다중 프로세서

원본 기록8

댓글

GitHub 계정으로 댓글을 남길 수 있어요.