포시코딩

[운영체제] 2. 컴퓨터 시스템의 구조 (1) 본문

CS (Computer Science)

[운영체제] 2. 컴퓨터 시스템의 구조 (1)

포시 2023. 4. 20. 03:20
728x90

키워드

CPU, mode bit, interrupt, memory, timer, dma controller, i/o, system call

 

컴퓨터 시스템 구조

대략적으로 본 모습(좌), 자세히 본 모습(우)

Computer

CPU

  • 매 클럭 사이클마다 메모리에서 인스트럭션(기계어)을 하나씩 읽어서 실행
    • PC(Program Counter) 레지스터가 다음번에 어디의 인스트럭션을 실행하는지에 대한 주소를 가지고 있음
  • register
    • CPU 안에는 메모리보다 더 빠르면서 정보를 저장하는 작은 공간인 register가 있다.
  • mode bit
    • 지금 CPU 안에서 실행되는 것이 운영체제인지 사용자 프로그램인지 구분해주는 역할

      * 아래 내용의 이해를 돕기위해 표현하자면
      CPU를 운영체제가 가지고 있는지, 사용자 프로그램이 가지고 있는지를 표시해준다.

    • 0: 모니터 모드(커널 모드) -> 운영체제가 CPU에서 실행중 
      운영체제가 CPU에서 실행중일 땐, 메모리 접근, I/O device 접근 인스트럭션 등
      무슨 인스트럭션이든지 실행할 수 있다. => '특권명령'

    • 1: 사용자 모드 -> 사용자 프로그램이 CPU에서 실행중
      제한된 인스트럭션만 실행할 수 있다. (보안상의 이유) => '일반명령'
      I/O device 접근 등 불가
  • interrupt line: interrupt를 처리하는 역할
    • 사용자 프로그램은 직접 I/O device에 접근할 수 없다. (보안 등의 이유)
      I/O device에 접근하는 모든 인스트럭션은 운영체제를 통해서만 할 수 있기 때문에
      프로그램이 I/O device에서 뭔가를 읽어와야 된다면 스스로 운영체제한테 CPU를 넘겨주고 
      운영체제가 해당하는 작업을 I/O controller한테 시킨다. 

      device에서의 작업이 오래 걸리기 때문에
      운영체제는 지금 요청한 프로그램(A)한테 CPU를 넘기는게 아니라 
      다음 인스트럭션을 읽어 다음 프로그램(B)한테 CPU를 넘긴다. 

    • 만약 I/O device에 요청한 작업이 끝나서 데이터가 buffer에 들어오면
      I/O controller가 CPU한테 interrupt를 건다. 

    • interrupt가 들어오면 CPU 제어권이 자동으로 운영체제한테 넘어간다. 
    • CPU는 interrupt가 왜 들어왔나를 파악하는데
      아까 어떤 프로그램(A)이 요청했던 I/O 입력이 들어온 것을 캐치해서
      요청한 프로그램(A)의 메모리 공간에 카피한 후 
      방금 실행중이던 프로그램(B)이 interrupt를 당했기 때문에 일단 CPU를 넘겨준다.

    • 만약 B 프로그램한테 한정된 시간(Timer)가 남아있다면 CPU를 더 쓰게하고
      할당된 시간이 끝난다면 입력이 들어와서 준비가 완료된 프로그램(A)한테 CPU를 넘긴다. 

 

Memory

  • CPU의 작업 공간
  • 메인 CPU만 접근할 수 있다.
  • 메모리도 다른 device처럼 memory controller가 존재
    • 밑에서 나올 DMA Controller도 CPU와 마찬가지로 메모리에 접근할 수 있는데 
      동시에 접근하면 안되기 때문에 이를 중재하는 역할을 한다.

 

Timer

  • 특정 프로그램이 CPU를 독점하는 것을 막기 위해 존재
    CPU의 time sharing을 구현하기 위해 존재한다고 보면 된다.

  • 매 클럭 틱마다 1씩 감소 -> 0이 되면 timer interrupt 발생
  • 사용자 프로그램이 실행되면 Timer에 어떤 값(할당시간)을 세팅 후  CPU에게 넘겨준다.

  • 할당시간이 끝나면 CPU에게 interrrupt를 건다.

  • CPU는 인스트럭션이 끝날 때마다 interrupt line을 체크하는데, 
    만약 Timer가 interrupt를 걸어왔으면 CPU는 하던 일을 멈추고
    CPU의 제어권이 사용자 프로그램에서 운영체제로 자동으로 넘어간다. 

  • 운영체제가 사용자 프로그램한테 CPU를 줄 때는 자유롭게 주지만, 한번 넘어가면 뺏을 수 없다. 
    뺏어오려면 운영체제가 CPU를 가지고 있으면서 인스트럭션을 실행해야 하는데 
    넘겨준 후에는 사용자 프로그램이 CPU를 쓰고있는 상태기 때문에 
    추가적인 하드웨어인 Timer를 통해 Timer interrupt를 걸어 CPU 제어권을 넘겨받을 수 있는 것이다. 

  • 이렇게 운영체제가 CPU를 넘겨받게되면 다음 프로그램한테 CPU를 넘겨준다. (마찬가지로 Timer에 값을 세팅한 후)

 

DMA Controller

(=Direct Memory Access)

  • 위 내용들로 보면 CPU가 interrupt를 너무 많이 당할 것으로 보인다.

  • 이럴경우 CPU가 비효율적으로 사용되기 때문에
    중간중간 들어오는 local buffer의 내용을 메모리에 복사하는 작업을
    DMA Controller가 직접 해주는 것이다.

  • 이 작업이 모두 다 끝나면 CPU로 interrupt를 한번만 걸어 CPU가 interrupt 당하는 빈도를 줄이는 역할을 한다.

 

I/O device

  • input device: 키보드, 마우스, 하드 디스크
  • output device: 프린터, 모니터, 하드 디스크

 

I/O device controller

해당 I/O 장치유형을 관리하는 일종의 작은 CPU

  • 각각의 I/O device들은 각각의 디바이스를 전담하는 작은 CPU 같은게 붙어있는데 
    이걸 device controller라고 부른다.
  • disk에서 헤드가 어떻게 움직이고 어떤 데이터를 읽을지 등 디스크의 내부를 통제하는건
    CPU의 역할이 아닌 disk에 붙어있는 disk controller가 하게된다.
  • 제어 정보를 위해 control register, status register를 가진다.
  • 일종의 data register인 local buffer를 가진다.
  • device controller는 I/O가 끝날 경우 interrupt를 통해 CPU에 그 사실을 알림

 

local buffer

  • 메인 CPU의 작업 공간인 Memory가 존재하듯, device controller도 작업 공간이 필요한데
    이걸 local buffer라고 부른다.
  • I/O는 실제 device와 local buffer 사이에서 발생

 

용어 정리

device controller(장치제어기)

  • 각 장치를 통제하는 일종의 작은 CPU
  • hardware

device driver(장치구동기)

  • 운영체제 코드 중 각 디바이스를 처리하기 위해 인터페이스에 맞게 접근할 수 있게 해주는 모듈
  • software
  • ex) 새 마우스를 연결할 때 드라이버를 설치해야 하는 상황을 이해하면 됨

 

입출력(I/O)의 수행

  • 모든 입출력 명령은 특권명령을 통해서만
  • 그렇다면 사용자 프로그램은 어떻게 I/O를 하는지?
    1. I/O 요청을 위해 사용자 프로그램이 운영체제(OS)한테 시스템 콜(System Call)
    2. 트랩(소프트웨어 인터럽트) 후 OS가 device controller한테 일을 시킴
      그 사이 CPU는 다른 프로그램에 넘어간 상태
    3. I/O 완료 시 I/O controller가 인터럽트(하드웨어 인터럽트)를 걸어 CPU한테 일을 다 한 것을 알림
    4. 제어권을 시스템 콜 다음 명령으로 옮김
  • 정리하자면
  • I/O 요청할 때는 트랩(소프트웨어 인터럽트)를 통해 요청
  • I/O가 끝나면 인터럽트(하드웨어 인터럽트)를 통해 끝났다는 사실을 알림

 

시스템 콜(System Call)

  • 사용자 프로그램이 운영체제 코드를 직접 수행하는 것이 불가능하기 때문에
    사용자 프로그램이 운영체제에게 (I/O 뿐만이 아닌) 운영체제한테 뭔가를 요청할 때 사용

  • 시스템 콜은 일반적인 함수 호출이랑은 다른데
    1. 일반적인 함수 호출이란
      만약 메인 함수가 실행되고 -> if문이든 for문이든 실행될 때

      CPU는 인스트럭션을 통해 메모리 안에서
      메모리 주소만 바꾸는 방법을 통해 실행되겠지만

    2. 프로그램이 실행되다 I/O요청을 위해 운영체제의 함수를 호출(시스템 콜)을 한다면
      메모리 주소만 바꾸는 식으로 실행되는게 아니라 

      device controller들이 CPU한테 interrupt를 걸듯 
      프로그램이 직접 interrupt line을 세팅하는 인스트럭션을 실행한다.
      (프로그램이 운영체제한테 요청하기위해 소프트웨어적으로 interrupt를 거는거임)

      CPU는 interrupt가 들어왔기 때문에 mode bit이 0으로 바뀌고 운영체제한테 제어권이 넘어간다.
      이렇게 비로소 운영체제한테 CPU 제어권이 넘어왔기 때문에
      device controller한테 I/O를 수행하게끔 부탁할 수 있게되는 것이다.

 

인터럽트(Interrupt)

넓은 의미의 인터럽트는 아래의 하드웨어 인터럽트, 소프트웨어 인터럽트 둘 다를 말하지만
보통 인터럽트는 하드웨어 인터럽트를 말하고
소프트웨어 인터럽트는 트랩(Trap)이라고 지칭한다.

Interrupt(하드웨어 인터럽트)

  • 하드웨어가 발생시킨 인터럽트
  • 위 내용 중 I/O controller가 발생시키는 인터럽트가 여기에 해당

Trap(소프트웨어 인터럽트)

  • Exception: 프로그램이 오류를 범한 경우
  • System Call: 프로그램이 커널 함수를 호출하는 경우

중요성

  • CPU를 특정 프로그램이 독점하는 것을 막기 위해 Timer interrupt 사용
  • I/O 요청을 하기 위해 시스템 콜을 통해 interrupt 사용
  • 요청한 I/O가 다 끝났다는 것을 알려주기 위해 I/O Controller가 interrupt 사용

현대의 운영체제는 인터럽트에 의해 구동된다라고 볼 수 있다.

운영체제는 인터럽트가 들어올 때만 CPU 제어권이 넘어오고 보통의 경우엔 CPU를 사용할 일이 없다.

 

인터럽트 관련 용어

인터럽트 벡터

  • 해당 인터럽트의 처리 루틴 주소를 가지고 있다.
  • 인터럽트 종류마다 그 인터럽트가 생겼을 때 어디 있는 함수를 실행해야 하는지에 대한
    함수 주소를 정리해놓은 테이블 같은 것을 인터럽트 벡터라고 한다.

인터럽트 처리 루틴

(=Interrupt Service Routine, 또는 인터럽트 핸들러)

  • 인터럽트 종류가 여러 개 있고 해야할 일이 다를텐데
    각각의 인터럽트 종류마다 무슨 일을 해야할지가 운영체제 코드에 다 정의가 되어있다.
  • 각 인터럽트마다 처리해야될 코드를 인터럽트 처리 루틴이라고 한다.
  • 딱딱하게 표현하자면, 해당 인터럽트를 처리하는 커널 함수
728x90