대부분의 컴퓨터에 있어서 입출력은 중앙처리장치와 비정기적(asynchronous)으로, 시간관계 규정 없이 병행적으로 수행됨
BIOS(basic input/output system)
- 전원이 켜지면 메인보드와 CPU에 파워가 준비되었다는 신호를 보내게 되고, 컴퓨터는 다음에 수행할 명령(commands)과 코드(code)를 언제라도 접근할 수 있어야 함
- 이 정보는 ROM칩에 저장되어 있어야 함
- ROM에서 얻어낸 정보 -> BIOS
- BIOS -> 부트 프로세스를 실행시키는 명령어들을 포함
- 컴퓨터 칩에 저장된 명령어들 -> 펌웨어(firmware)
- Linux 와 Mac 이 개방 펌웨어, 개방 BIOS 등의 BIOS를 뛰어넘는 확장성 펌웨어 인터페이스(EFI: Extensible Firmware Interface)를 개발함
부트 진행 과정(boot process)
- 컴퓨터 가동을 위해 파워버튼을 누르면 부트 로더가 초기화됨
- POST(Power-On Self-Test) 수행 시작
- 다른 BIOS들이 가동을 위해 초기화 됨
- 사용자는 필요에 따라 BIOS 접근을 위한 비밀키 입력을 요구 받음
- 간단한 메모리 테스트가 수행되고 여러 파라미터들이 세트 됨
- 플러그앤플레이 디바이스들이 초기화 됨
- DMA(Direct Memory Access) 채널을 위한 자원들과 IRQ(Interrupt Request)가 할당 됨
- 부트 디바이스들이 정해지고 초기화 됨
- OS 가 초기화 됨
POST(Power-On Self-Test)
- 성공적인 부팅 및 적정 수행의 확인을 위해 필요 하드웨어에 대해 행하는 테스트
- 수행하는 일
- BIOS의 완벽한 보전 확인
- 주기억장치의 위치 결정, 확인 및 그 크기 의 결정
- 시스템 버스와 시스템 디바이스의 결정 및 시작
- 요구되는 다른 BIOS들의 시작 허용(비디오 또는 그래픽 카드 등)
- 사용자에게 BIOS 시스템 구성 페이지에 접근할 수 있는 권한 부여
- 부트 디바이스 위치 및 부트 파일을 가진 디바이스 찾기
- 운영체제에 의해 요구되는 그 외 작동준비(setup) 관련 작업들의 수행
버퍼링
- 입출력장치나 보조기억장치는 기계적 요인 때문에 중앙처리장치와 비교할 때 매우 느린 속도로 작동
- 이와 같은 입출력장치의 느린 속도를 보완하는 한 가지 방법이 버퍼링이다.
- 버퍼링은 CPU와 입출력장치를 항상 바쁘게 하고자 하는 것
- 미리 읽혀진 레코드들이 존재하는 곳은 주기억장치의 일부
-> 버퍼버퍼를 이용한 출력의 예
- 중앙처리장치는 출력할 데이터를 버퍼에 채움
- 버퍼가 다 채워지면 중앙처리장치는 채널에게 출력을 지시하고, 자신의 일을 계속함
- 채널은 출력을 수행함으로써 버퍼를 비움
- 출력을 완료함으로써 버퍼를 다 비우면 중앙처리장치에게 알림
- 입출력 장치는 채널(channel)에 연결되어 채널이 CPU와 데이터를 주고 받아 입출력은 CPU와는 무관하게 비동기적으로 수행됨
이중 버퍼링
- 중앙처리장치가 버퍼 A를 채움
- 다 채우면 채널에게 버퍼 A의 출력을 지시
- 버퍼 A에 대한 출력과는 무관하게 버퍼 B를 채움
- 채널은 버퍼 A를 비움
- 채널은 버퍼 A를 다 비웠음을 중앙처리장치에게 알림
- 중앙처리장치는 다시 버퍼 A를 채우고 채널은 버퍼 B를 비움 (여기서 1과 6, 3과 4는 동시에 발생할 수 있음)
-> 위와 같이 하나의 입력장치 또는 출력장치에 두 개 이상의 버퍼를 사용할 수 있는데, 이렇게 다중 버퍼가 사용되면 많은 양의 주기억장치가 버퍼에 할당되어 이용 가능한 주기억장치의 크기가 줄어듦입출력 위주 작업(I/O bound job)
- CPU가 입출력장치보다 훨씬 빠르다면 버퍼링은 별 의미가 없음
- CPU가 항상 빠르다면 입력 버퍼는 언제나 비어 있는(empty)상태에 있게 되므로, CPU는 항상 입력장치를 기다려야 하기 때문
- 이러한 상황은 계산에 관계되는 입출력의 양이 매우 많은 I/O bound job하에서 발생함
- CPU는 입출력장치보다 속도가 빠르기 때문에 실행 속도는 입출력장치의 속도로 한정됨
중앙처리장치 위주 작업(CPU bound job)
- 아주 복잡한 계산이 많아서 입력 버퍼는 항상 가득 차 (full) 있는 반면, 출력 버퍼는 항상 비어 있는 CPU bound job의 경우에는 CPU는 입출력장치보다 속도가 떨어질 수도 있음
-> 결론적으로 버퍼링은 CPU와 입출력장치 간의 속도 차이를 충분하지는 않지만 어느 정도 극복할 수 있도록 함
스풀링(SPOOLing)
- Simultaneous Peripheral Operation On-Line
- 버퍼링은 주기억장치를 버퍼로 사용하는 반면, 스풀링은 디스크를 매우 큰 버퍼처럼 사용하는 것
- 입출력 장치에 대한 공유를 가능하게 하기 위하여 가상 장치(virtual device)를 각 프로세스에게 제공해 주는 개념
- 프로세스들은 입력 또는 출력을 실제 입출력장치를 통하지 않고 가상 입출력장치인 디스크를 매체로 이용한 후, 다시 실제의 입력과 출력을 행하도록 함
- 이러한 모든 일들은 운영체제의 일부인 SPOOL 이라고 하는 프로그램이 수행
스풀링의 효과
- 중앙처리장치 위주(CPU bound)의 작업과 입출력 위주(I/O bound) 의 작업이 혼합되어 있는 경우, 어느 정도의 디스크 공간과 테이블을 확보함으로써 중앙처리장치는 한 작업의 계산과 다른 작업의 입출력을 중복 수행할 수 있고, 따라서 작업의 효율도 극대화할 수 있다.
- 스풀링은 작업 풀(job pool) 이라고 하는 중요한 자료 구조 형태를 제공함으로써, 일반적으로 디스크에 읽혀 들여져 대기하고 있는 여러 작업들이 실행될 수 있도록 준비시키고 운영체제가 다음에 수행할 작업을 선택할 수 있도록 한다. 즉, 작업의 완급 또는 우선순위에 따라 작업 스케줄링(job scheduling)이 가능하다.
채널(channel)
- 입출력 장치와 중앙처리 장치 사이에 입출력 전담 처리기인 입출력 채널(I/Ochannel)을 두고, 모든 입출력이 채널을 통하여 수행됨으로써 중앙처리장치는 입출력이 실제로 수행 완료될 때 까지 기다리거나 수시로 입출력장치의 상태를 점검할 필요 없이 계속해서 연산을 수행할 수 있음
- 선택 채널(select channel)
- 여러 개의 입출력장치가 연결되어 있다 하더라도 한 번에 단 하나의 입출력장치만을 선택적으로 지원
- 비교적 전송 속도가 빠른 입출력장치인 디스크나 CD-ROM 등의 입출력을 제어
- 멀티플렉서 채널(multiplexer channel)
- 다수의 저속도 입출력장치(키보드, 프린터 등)가 채널의 단일한 데이터 경로를 공유하면서 데이터를 전송
- 여러 개의 저속도 입출력장치가 멀티플렉서 채널에 연결되어 시분할(timesharing) 형태로 제어
- 채널과 중앙처리장치 간의 통신은 일반적으로 인터럽트에 의하여 이루어 짐
- CPU가 입출력 명령을 처리하는 상황에서의 채널의 동작 원리
- CPU는 채널의 현재 상태를 점검
- 채널의 상태가 양호하면 채널로 하여금 실질적인 입출력 동작을 개시하도록 함
- 채널은 해당 입출력 명령의 수행을 위한 채널 명령어를 선택한 후, 데이터의 입출력을 CPU와는 독립적으로 수행한다. 수행이 종료되면 CPU에 인터럽트를 요청
- CPU는 해당 채널의 인터럽트를 인지하여, 상황에 따른 다음 동작을 지시
인터럽트(interrupt)
- 인터럽트
- 시스템에 예기치 않은 상황이 발생하였을 때, 그것을 운영체제에 알리기 위한 메커니즘
- 중앙처리장치가 명령어를 수행하고 있는 동안, 이와 병행하게 발생하는 상황에 대처하기 위하여 필요한 제어 이동의 원인을 의미
- 채널과 중앙처리장치 간의 통신은 일반적으로 인터럽트(interrupt)에 의해 이루어진다.
- 종류
- 입출력(I/O) 인터럽트
- 해당 입출력 하드웨어가 주어진 입출력 동작을 완료하였거나 또는 입출력의 오류 등이 발생하였을 때 중앙처리장치에 대하여 요청하는 인터럽트
- 외부(external) 인터럽트
- 시스템 타이머(timer)에서 일정한 시간이 만료된 경우나 오퍼레이터가 콘솔 상의 인터럽트 키를 입력한 경우, 또는 다중처리 시스템에서 다른 처리기로부터 신호가 온 경우 등에 발생함
- SVC(SuperVisor Call) 인터럽트
- 사용자 프로그램이 수행되는 과정에서 입출력 수행, 기억장치의 할당, 또는 오퍼레이터의 개입 요구 등을 위하여 실행 중의 프로그램이 SVC 명령을 수행하는 경우에 발생
- 기계 검사(machine check) 인터럽트
- 컴퓨터 자체 내의 기계적인 장애나 오류로 인한 인터럽트
- 프로그램 에러(program error) 인터럽트
- 주로 프로그램의 실행 오류로 인해 발생
- 예를 들면, 수행 중인 프로그램에서 0으로 나누는 연산이나, 보호(protection)되어 있는 기억장소에 대한 접근, 허용되지 않는 명령어의 수행, 또는 스택의 오버플로(overflow) 등과 같은 오류가 발생할 때 일어남
- 재시작(restart) 인터럽트
- 오퍼레이터가 콘솔 상의 재시작 키를 누를 때 일어남
인터럽트 처리 과정
- CPU가 실행하는 중 인터럽트가 발생
- 이 경우 현 상태에서의 프로그램 카운터(PC)와 프로그램의 다음 수행에 도움이 되거나 필요한 제반 정보를 주기억장치의 일정한 지역에 보관함
-> 컨텍스트- 해당 인터럽트에 대처하기 위한 인터럽트 처리 루틴으로 제어를 이동시켜 이 인터럽트를 해결
- 인터럽트 처리 루틴의 수행을 완료하면,
- 인터럽트가 발생했던 지점으로 되돌아와 보관해 놓은 정보를 이용하여
- 원래 수행 중이었던 프로그램을 처리
인터럽트 처리 과정 및 PSW 위치(문맥 교환의 과정)
- 문맥 교환(context change)
- 인터럽트 발생 시 운영체제가 일단 인터럽트 된 실행중인 프로그램의 상태를 기억시켜 두고 제어권을 인터럽트 처리 루틴에게로 넘기는 작업