2-2주차. 컴퓨터시스템 구조

나우히즈·2024년 7월 11일

OS

목록 보기
3/27

컴퓨터 시스템 구조

  • 전원 키면 부트로더(Bootloader)가 실행되고 부트로더가 운영체제를 메모리에 올려 실행시킴.

  • 다른 응용프로그램 실행 시 메모리에 올라가서 프로세스가 됨.

  • 입출력 장치의 경우, 입출력 장치를 전담하는 작은 CPU(Device controller) 존재

  • 입출력 장치 전용 작은 메모리(로컬 버퍼) 존재.

  • CPU에서는
    1) 메모리에 있는 운영체제 상의 기계어를 읽어서 실행할 때가 있고,
    2)사용자 프로그램의 기계어를 가져와 사용하는 경우가 있음.

  • 사용자 프로그램이 악의적인 경우: CPU가 사용자 프로그램에 넘어가면 운영체제는 CPU를 더이상 제어할 방법이 줄어듦. (아예 없는 줄 알았는데 뭔가 더 방법이 있긴 한듯)

  • modebit : 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치

  • 운영체제가 CPU 사용 시 0,
    이 외 프로그램에 CPU 양도 시 1(사용자 모드)로 변경하여 넘겨줌.
    -> 위험한 기계어(특권 명령)는 사용자모드(modebit 1인 경우)에서 사용불가
    -> 권한 없는 명령어를 일반 프로그램이 사용 시, 자동적으로 CPU가 운영체제로 넘어간다.(interrupt, exception 이용)

프로그램 A가 실행되다가 디스크를 읽어야한다면, CPU는 입출력 장치를 사용하지 못하기 때문에, 입출력 장치를 관리하는 디스크 컨트롤러에 파일 읽기를 부탁함.
그 동안에 CPU는 운영체제로 넘어가고, 다른 프로그램이 CPU 사용.
-> 읽기가 완료되면, 디스크 컨트롤러는 인터럽트를 걺.
-> 일을 하던 CPU가 그 다음 기계어 실행에 앞서 인터럽트 확인
-> CPU 제어권이 자동적으로 운영체제로 넘어가게 됨 (mobebit 1->0)

즉, interrupt/exception 발생 시 modebit이 0이 되고 운영체제로 제어권 전달.
사용자 프로그램에게 CPU 제어권 전달 시 modebit이 1로 세팅

CPU 내에 레지스터가 존재. 여러가지 연산을 처리하기 위해선 인풋이 있어야함.
레지스터는 그 인풋과 연산 결과인 아웃풋을 저장하기 위한 작고 빠른 저장 공간.

Program Counter: 다음번에 실행할 명령어의 메모리 주소를 가지고있는 레지스터.
악의적으로 무한루프를 돌며 CPU를 독점하는 프로그램을 운영체제가 CPU를 회수하려면 하드웨어의 도움을 받아야함.
-> "타이머" 라는 하드웨어. 일정 시간마다 인터럽트를 발생시켜서, 운영체제가 CPU를 회수할 수 있게 함. 운영체제에서 CPU제어권을 프로그램에 넘겨줄 때, 타이머를 설정하여 일정 시간이 흐르면 자동적으로 인터럽트를 걸게함. CPU 독점 방지.

타이머의 도움을 받아 운영체제가 CPU 스케줄링을 수행함.


시스템콜

기계어를 계속 실행하다가, 파일을 읽어오는 명령을 실행하면?
-> CPU는 디스크를 전담하는 컨트롤러에 파일 읽기를 기계어로 부탁을 한다.

이러한 기계어는 특권명령에 규정된 명령어이다. 시피유가 I/O 해달라고 부탁하는 모든 기계어는 특권명령.

사용자 프로그램은 디스크의 파일 읽기를 하고 싶어도, 직접 입출력 기계어를 사용하지 못함. 특권명령이기 때문.
-> 운영체제에 해달라고 요청해야함. 이것이 "시스템콜"

시스템콜: 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것.

시스템콜을 하게 되면 사용자 프로그램 기계어에서 운영체제 기계어로 메모리 점프가 필요.
-> 인터럽트를 걸어서 CPU 제어권이 운영체제로 넘어가게 함.

인터럽트라는 것은, I/O 하드웨어들이 시피유에 정보전달을 위해 거는 것(하드웨어 인터럽트)이기도 하고,
소프트웨어가 본인이 직접 할 수 없는 일을 운영체제에 부탁하기 위해 거는 것(소프트웨어 인터럽트)이기도 함.
운영체제에 부탁하기 위해 인터럽트 거는 것을 시스템콜이라고 부름.

인터럽트

: 인터럽트 당한 시점의 레지스터와 program counter를 저장한 후 CPU 제어를 인터럽트 처리 루틴에 넘긴다.

  1. 사용자 프로그램이 불허된 기계어 를 사용한 경우 또는 익셉션(0 나누기 등)이 발생하는 경우
  2. 타이머가 다 된 경우(타이머 인터럽트)
  3. 시스템콜을 호출한 경우(I/O작업)
    모든 경우가 인터럽트 라인을 세팅하게 된다.

인터럽트를 누가 발생시키냐에 따라 두 가지로 나뉨

  • 하드웨어가 인터럽트를 걸는 경우(1, 2)

  • 소프트웨어가 인터럽트(트랩)을 건 경우(3)

  • interrupt 의 의미(광의)
    1) 하드웨어 인터럽트: 하드웨어가 발생시킨 인터럽트(타이머와 같은). 일반적인 경우.
    2) Trap(소프트웨어 인터럽트):
    Exception -> 프로그램이 오류를 범한 경우
    System call-> 프로그램이 커널 함수를 호출하는 경우

  • 인터럽트 관련 용어
    인터럽트 벡터: 해당 인터럽트의 처리 루틴 주소를 가지고 있음.

  • 인터럽트 처리 루틴
    해당 인터럽트를 처리하는 커널 함수

각 인터럽트마다 인터럽트 라인에 적히는 내용이 달라짐.

인터럽트 종류 별로 해당하는 인터럽트가 발생했을 때, 운영체제 내에 어떤 코드를 실행해야하는지를 가리키는 "인터럽트 벡터"를 통해 처리 루틴 주소로 갈 수 있음.

현대의 운영체제는 인터럽트에 의해 구동된다. 인터럽트가 들어올 때 운영체제가 CPU를 쓸 수 있게된다.

Device Controller

  • I/O device controller
    해당 I/O 장치유형을 관리하는 일종의 작은 CPU
    제어 정보를 위해 control register, status register를 가짐
    local buffer를 가짐(일종의 data register)

  • I/O는 실제 device 와 local buffer 사이에서 일어남

  • Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림

  • device driver(장치 구동기): 운영체제 내에서 특정 장치를 제어하기 위한 소프트웨어로, CPU가 입출력 장치에 명령을 내릴 수 있도록 하는 소프트웨어.

  • device controller(장치 제어기): 각 장치를 통제하는 일종의 작은 CPU(하드웨어)


동기식 입출력과 비동기식 입출력

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

  • I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감.
  • 구현 방법 1
    I/O가 끝날 때 까지 CPU를 낭비시킴
    매시점 하나의 I/O만 일어날 수 있음
  • 구현 방법 2
    I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
    I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
    다른 프로그램에게 CPU를 할당함
  • 일반적인 읽기의 동작 방식.

비동기식 입출력(asynchronous I/O)

  • I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 CPU 제어가 사용자 프로그램에 즉시 넘어감.
  • 입출력 결과를 모르는 상태에서, 입출력 결과와 무관한 일을 진행하기 위함.
  • 쓰는 작업은 그 결과를 몰라도 되기에 비동기식으로 동작

-> 두 경우 모두 I/O의 완료는 인터럽트로 알려줌

Synchronous란?
: 싱크를 맞춘다고 하는 느낌을 생각하기. 시간에 맞추어 여럿이 동일한 처리를 하게끔.


DMA(Direct Memory Access)

  • 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
  • CPU의 중재 없이 device controller 가 device 의 buffer storage 의 내용을 메모리에 블록 단위로 직접 전송
  • 바이트 단위가 아닌 블록 단위로 인터럽트를 발생시킨다.
  • CPU는 대단히 빨라서, 놀지 않고 작업을 한다.
  • 인터럽트 처리도 나름의 오버헤드. 일을 진행에 지장을 줌.
  • 고속 I/O 장치들은 입출력이 끝날 때마다 인터럽트를 걸기에 CPU가 비효율적이게됨.
    -> DMA 컨트롤러를 통해 메모리에 접근함.
    메모리에 접근할 수 있는 장치는 CPU가 있는데, DMA를 통해서도 메모리로 바로 접근이 가능.

인터럽트가 너무 자주 걸리는 것을 막기 위해 DMA 사용.
아주 작은 크기의 데이터(1바이트)가 입출력 로컬 버퍼에 있다고 해서 인터럽트를 거는 것 대신, 일정크기(예를 들어, 512바이트) 의 데이터 블록이 모였을 때(로컬 버퍼에 찼을 때), DMA가 메모리에 복사하는 작업을 함.

작은 데이터에 대해 여러번 인터럽트를 걸지 않고 버퍼를 통해 한 뭉텅이로 모아서 인터럽트를 걸게 되어 효율적이게 됨.

CPU에서 처리하는 것은 기계어(Instruction).

서로 다른 입출력 기계어

I/O를 수행하는 특별한 Instruction에 의해

-> I/O 하는 기계어 따로, 메모리 접근하는 기계어 따로.

Memory Mapped I/O에 의해

메모리 접근 기계어로 I/O도 처리할 수 있음. 이 경우 메모리 주소가 I/O 장치까지 확장됨.
-> 메모리 접근하는 기계어로 I/O도 처리하는. 다만 메모리 주소가 I/O  장치까지 연장해서 매겨지도록 함.

0개의 댓글