[운영체제와 정보기술의 원리] 3장. 컴퓨터 시스템의 동작 원리 (1/2)

Joey Hong·2020년 10월 4일
1

운영체제(OS)

목록 보기
2/4

1. 🖥 컴퓨터 시스템의 구조

⚡️ 입출력 (Input-Outpu: I/O)

  1. 외부장치에서 내부장치로 데이터를 읽어옴 ➡︎ input(입력)
    • 키보드 입력 받음
    • 디스크 내용 읽음
  2. 각종 연산 수행
  3. 그 결과를 외부장치로 내보냄 ➡︎ output(출력)
    • 디스크에 데이터 저장
    • 모니터에 결과 출력

내부 장치

  • CPU
  • 메모리

외부 장치 (입출력 장치)

  • 디스크
  • 키보드
  • 마우스
  • 모니터
  • 네트워크 장치

⚡️ 컨트롤러

각 하드웨어 장치에 존재하며 이들을 제어하는 작은 CPU

  • 메모리 컨트롤러
  • 디스크 컨트롤러

2. CPU 연산과 I/O 연산

  • 입출력 장치들의 I/O 연산은 입출력 컨트롤러가 담당
  • 컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당

두 가지 일이 다른 곳에서 발생
프로그램 A, B
B가 현재 CPU를 할당받아 프로그램 코드 수행
A는 하드디스크에서 어떠한 정보를 읽어오는 작업 수행
두 가지 일이 다른 곳에서 발생하므로 동시에 수행되는 것이 가능

⚡️ 로컬 버퍼 (local buffer)

디스크나 키보드 등에서 데이터를 읽어와서 로컬버퍼에 데이터 임시 저장 후 메모리에 전달

  • 장치에서 로컬버퍼로 읽어오는 일은 컨트롤러가 담당

⚡️ 인터럽트 (interrupt)

CPU에 알려줄 필요가 있는 이벤트가 일어난 경우 컨트롤러가 발생시키는 것

  • 키보드 입력 혹은 요청된 디스크 입출력 작업의 완료 등

프로그램 B
1. B가 수행 중에 디스크에서 데이터를 읽어오라고 명령
2. 디스크 컨트롤러가 물리적인 디스크에서 내용을 읽어 이를 로컬버퍼에 저장
3. 원하는 데이터를 다 읽어오면 장치에 있는 컨트롤러가 인터럽트 발생시켜 CPU에 보고
4. 메인 CPU는 매 시점 메모리에서 명령(instruction)을 하나씩 읽어와서 수행

⚡️ 인터럽트 라인(interrupt line)

CPU 옆에서 인터럽트가 생기면 CPU에게 신호

  • CPU는 신호가 들어오면 다음 명령 수행 전에 인터럽트 처리
    • 현재 명령은 완료 후 인터럽트 처리

3. 인터럽트의 일반적 기능

⚡️ 운영체제 커널

  • 인터럽트가 들어왔을 때 해야 할 일이 프로그래밍되어 보관 (인터럽트 처리 루틴)
  • 하드웨어 및 소프트웨어 자원 관리
  • 사용자 프로그램에 필요한 서비스 제공

⚡️ 인터럽트 처리 루틴 (interrupt service routine)

  • 다양한 인터럽트에 대해 각각 처리해야 할 업무들 정의
  • 인터럽트 핸들러(interrupt handler)라고도 불림
  • 인터럽트 처리 후 돌아갈 위치 저장

CPU

  • 디스크 컨트롤러가 인터럽트 발생했을 때 CPU는 인터럽트 처리 루틴 참조해서 수행
    • 디스크의 로컬버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달
    • 해당 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시

인터럽트 라인 세팅

  • 하드웨어 인터럽트는 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅
  • 소프트웨어 인터럽트는 소프트웨어가 CPU의 인터럽트 라인을 세팅

⚡️ 인터럽트 벡터(interrupt vector)

  • 운영체제가 할 일을 쉽게 찾도록 하는 것
  • 인터럽트 종류마다 번호를 정해 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조

⚡️ 소프트웨어 인터럽트

  • 소프트웨어 인터럽트는 trap이라 불림
    • 인터럽트는 보통 하드웨어 인터럽트를 지칭
  • 예) 예외상황, 콜
    • 사용자 프로세스로부터 CPU의 제어권이 운영체제에 이양되어 처리
    • 프로그램 코드가 직접 인터럽트 라인을 세팅하는 명령 실행해 인터럽트 발생 후 제어권이 넘어감
    • 넓은 의미의 인터럽트 범주에 포함

예외상황(exception)

  • 비정상적이거나 권한이 없는 작업 시도할 때 이에 대한 처리를 위해 발생시키는 인터럽트
    • 사용자 프로그램이 0으로 나누는 연산 등 비정상적인 작업 시도
    • 자신의 메모리 영역 바깥에 접근

콜(system call)

  • 사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법
    • 사용자 프로그램에 정의되지 않고 운영체제 커널에 있는 코드 실행시
      • 인터럽트 라인 세팅을 통해 CPU 제어권을 운영체제로 넘겨 실행
      • 입출력을 수행하는 코드 작성 대신 이미 존재하는 커널의 코드를 호출해 처리

4. 인터럽트 핸들링(interrupt handling)

  • 인터럽트가 발생한 경우 처리해야 할 일의 절차
  • 운영체제는 인터럽트가 발생할 때에만 실행 (CPU제어권 획득)
    • 그럼에도 운영체제는 컴퓨터 시스템 내 모든 하드웨어 및 소프트웨어 자원을 체계적이고 효율적으로 관리

⚡️ 세부 절차

프로그램 A가 실행되는 도중 인터럽트 발생시
1. A의 실행 상태를 PCB에 저장
2. CPU의 제어권이 인터럽트 처리루틴으로 넘어감
3. 인터럽트 처리가 끝나면 저장된 상태를 PCB로부터 CPU상에 복원
4. 인터럽트 당하기 직전의 위치부터 실행

⚡️ 레지스터(register)

  • CPU 내부의 임시 기억장치
  • CPU에서 명령이 실행될 때 레지스터에 데이터를 읽거나 쓰면서 작업
  • 새로운 명령 실행시 기존의 레지스터값 삭제

⚡️ 프로세스 제어블록 (Process Control Block: PCB)

  • 시스템 내에서 실행되는 프로그램들을 관리하기 위한 운영체제의 자료구조
    • 각각의 프로그램마다 하나씩 존재
  • 해당 프로그램의 어느 부분이 실행 중이었는지 저장
    • 실행 중이던 코드의 메모리 주소
    • 레지스터값
    • 하드웨어 상태
    • ...

5. 입출력 구조

컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것

  • 보통 동기식 입출력을 사용하며 큐를 통한 관리로 동기성 보장

⚡️ 동기식 입출력(synchronous I/O)

프로그램이 입출력 요청을 했을 때 입출력 작업이 완료된 후에야 그 프로그램이 후곳 작업을 수행할 수 있는 방식

  • CPU는 입출력 연산이 끝날 때까지 인터럽트를 기다리며 자원 낭비
  • CPU의 명령 수행 속도는 빠름
  • 입출력 장치에서 데이터를 읽어오는 등의 입출력 연산은 상대적으로 느림

CPU를 다른 프로그램에 이양

  • 한 프로그램이 입출력 수행 중인 경우 CPU를 다른 프로그램에게 이양
    • CPU가 계속 쉬지 않고 일할 수 있도록 관리
  • 운영체제는 프로그램을 몇 가지 상태로 나눈다
    • 입출력 중인 프로그램은 봉쇄 상태(blocked state)로 전환
    • 봉쇄 상태의 프로그램에게는 CPU 할당X
  • 동기식이지만 다수의 입출력 연산이 동시에 요청되거나 처리O

큐(queue)

  • 여러 프로그램에게 CPU를 이양한 경우 여러 프로그램이 동일한 곳에 접근해서 충돌 위험O
  • 입출력 요청의 동기화를 위해 장치별로 큐를 두어 이를 방지
    • 프로그램 A가 먼저 요청했으면 이를 먼저 큐에 넣고 그 후에 발생한 B의 요청을 A의 요청 뒤에 삽입
    • 디스크는 큐에 있는 순서대로 처리해 동기성(synchronization) 보장

큐헤더

  • 장치마다 큐헤더로 큐 관리
  • 컨트롤러의 수행 속도나 장치 자체의 작업 수행 능력은 CPU에 비해 매우 떨어진다
    • 입출력이 완료될 때까지 CPU가 입출력과 관련 없는 프로그램을 수행하도록 하고 인터럽트로 입출력 연산 완료를 전달

비동기식 입출력

입출력 연산을 요청한 후에 CPU의 제어권을 입출력 연산을 호출한 프로그램에게 곧바로 다시 부여

  • 이전 작업이 완료되어야만 다음 작업을 수행할 수 있는 경우 입출력이 완료된 후에 수행
  • 이전 작업과 다음 작업이 관계없다면 입출력 연산 완료와 무관하게 처리 가능한 작업부터 처리

입출력 구조 예시

  1. 프로그램 A가 실행 중에 디스크에서 어떤 데이터 읽어오라는 명령 받음
  2. A는 시스템 콜을 통해 CPU에게 소프트웨어 인터럽트 발생
  3. CPU는 실행하던 A코드를 멈추고 현재 상태 저장
  4. CPU는 인터럽트에 의해 처리해야 할 커널의 루틴으로 이동
  5. CPU는 컨트롤러에게 입출력 연산 요청
  6. 컨트롤러는 A가 요청한 데이터를 디스크로부터 자신의 로컬버퍼로 읽어옴
  7. 이동안 운영체제는 A를 봉쇄상태로 표시해 A는 CPU 할당 불가
  8. 운영체제는 CPU를 다른 프로그램 B에 할당해 CPU 가동
  9. 원하는 정보가 로컬버퍼로 다 들어오면 컨트롤러는 CPU에게 인터럽트 발생 (하드웨어)
  10. CPU는 수행하던 프로그램 B 작업 지점 및 상태 저장 후 인터럽트 처리
  11. 로컬버퍼에 있는 A가 요청한 데이터를 A의 메모리 영역으로 읽어옴
  12. A의 봉쇄 상태 해제시켜 A에게 CPU할당해도 됨 표시
  13. A는 CPU 큐에 대기
  14. CPU는 원래 수행하던 프로그램 B 지점으로 돌아가 업무 이어서 수행
  15. A는 큐에서 대기하다가 차례가 되면 CPU 할당받고 입출력 연산 후 작업 수행

6. DMA

메모리는 CPU에 의해서만 접근 가능한 장치

  • CPU외의 장치는 CPU에게 인터럽트 발생시켜 메모리 접근 가능

비효율성 해결

  • 모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 입출력 장치가 메모리 접근을 원할 때마다 인터럽트에 의해 CPU업무 방해
    • CPU 사용 효율성 ⬇︎
    • 비효율성 극복을 위해 메모리 접근이 가능항 장치 DMA(Direct Memory Access) 추가

역할

  • 일종의 컨트롤러
  • CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 방지
  • 로컬버퍼에서 메모리로 읽어오는 작업을 CPU 대신 대행
    • byte 단위가 아닌 블록(block)이라는 큰 단위로 메모리 읽음
      • CPU를 효율적으로 관리
      • 빠른 입출력 연산 수행 가능
profile
개발기록

0개의 댓글