[OS] 1-4. 입출력 프로그래밍

공부 스파이럴·2024년 2월 22일
0

운영체제

목록 보기
11/27

대부분의 컴퓨터에 있어서 입출력은 중앙처리장치와 비정기적(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와 입출력장치를 항상 바쁘게 하고자 하는 것
  • 미리 읽혀진 레코드들이 존재하는 곳은 주기억장치의 일부
    -> 버퍼

버퍼를 이용한 출력의 예

  1. 중앙처리장치는 출력할 데이터를 버퍼에 채움
  2. 버퍼가 다 채워지면 중앙처리장치는 채널에게 출력을 지시하고, 자신의 일을 계속함
  3. 채널은 출력을 수행함으로써 버퍼를 비움
  4. 출력을 완료함으로써 버퍼를 다 비우면 중앙처리장치에게 알림

  • 입출력 장치는 채널(channel)에 연결되어 채널이 CPU와 데이터를 주고 받아 입출력은 CPU와는 무관하게 비동기적으로 수행됨

이중 버퍼링

  1. 중앙처리장치가 버퍼 A를 채움
  2. 다 채우면 채널에게 버퍼 A의 출력을 지시
  3. 버퍼 A에 대한 출력과는 무관하게 버퍼 B를 채움
  4. 채널은 버퍼 A를 비움
  5. 채널은 버퍼 A를 다 비웠음을 중앙처리장치에게 알림
  6. 중앙처리장치는 다시 버퍼 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가 입출력 명령을 처리하는 상황에서의 채널의 동작 원리
    1. CPU는 채널의 현재 상태를 점검
    2. 채널의 상태가 양호하면 채널로 하여금 실질적인 입출력 동작을 개시하도록 함
    3. 채널은 해당 입출력 명령의 수행을 위한 채널 명령어를 선택한 후, 데이터의 입출력을 CPU와는 독립적으로 수행한다. 수행이 종료되면 CPU에 인터럽트를 요청
    4. CPU는 해당 채널의 인터럽트를 인지하여, 상황에 따른 다음 동작을 지시

인터럽트(interrupt)

  • 인터럽트
    • 시스템에 예기치 않은 상황이 발생하였을 때, 그것을 운영체제에 알리기 위한 메커니즘
    • 중앙처리장치가 명령어를 수행하고 있는 동안, 이와 병행하게 발생하는 상황에 대처하기 위하여 필요한 제어 이동의 원인을 의미
  • 채널과 중앙처리장치 간의 통신은 일반적으로 인터럽트(interrupt)에 의해 이루어진다.
  • 종류
    • 입출력(I/O) 인터럽트
      • 해당 입출력 하드웨어가 주어진 입출력 동작을 완료하였거나 또는 입출력의 오류 등이 발생하였을 때 중앙처리장치에 대하여 요청하는 인터럽트
    • 외부(external) 인터럽트
      • 시스템 타이머(timer)에서 일정한 시간이 만료된 경우나 오퍼레이터가 콘솔 상의 인터럽트 키를 입력한 경우, 또는 다중처리 시스템에서 다른 처리기로부터 신호가 온 경우 등에 발생함
    • SVC(SuperVisor Call) 인터럽트
      • 사용자 프로그램이 수행되는 과정에서 입출력 수행, 기억장치의 할당, 또는 오퍼레이터의 개입 요구 등을 위하여 실행 중의 프로그램이 SVC 명령을 수행하는 경우에 발생
    • 기계 검사(machine check) 인터럽트
      • 컴퓨터 자체 내의 기계적인 장애나 오류로 인한 인터럽트
    • 프로그램 에러(program error) 인터럽트
      • 주로 프로그램의 실행 오류로 인해 발생
      • 예를 들면, 수행 중인 프로그램에서 0으로 나누는 연산이나, 보호(protection)되어 있는 기억장소에 대한 접근, 허용되지 않는 명령어의 수행, 또는 스택의 오버플로(overflow) 등과 같은 오류가 발생할 때 일어남
    • 재시작(restart) 인터럽트
      • 오퍼레이터가 콘솔 상의 재시작 키를 누를 때 일어남

인터럽트 처리 과정

  1. CPU가 실행하는 중 인터럽트가 발생
    • 이 경우 현 상태에서의 프로그램 카운터(PC)와 프로그램의 다음 수행에 도움이 되거나 필요한 제반 정보를 주기억장치의 일정한 지역에 보관
      -> 컨텍스트
  2. 해당 인터럽트에 대처하기 위한 인터럽트 처리 루틴으로 제어를 이동시켜 이 인터럽트를 해결
  3. 인터럽트 처리 루틴의 수행을 완료하면,
  4. 인터럽트가 발생했던 지점으로 되돌아와 보관해 놓은 정보를 이용하여
  5. 원래 수행 중이었던 프로그램을 처리

인터럽트 처리 과정 및 PSW 위치(문맥 교환의 과정)

  • 문맥 교환(context change)
    • 인터럽트 발생 시 운영체제가 일단 인터럽트 된 실행중인 프로그램의 상태를 기억시켜 두고 제어권을 인터럽트 처리 루틴에게로 넘기는 작업

0개의 댓글

관련 채용 정보