5 분 소요

본 글은 (KOCW) 운영체제, 이화여자대학교 반효경 교수님의 강의를 듣고 내용을 요약 및 정리했습니다. 개인 공부에 목적이 있으며, 자세한 사항은 여기를 참고하시면 됩니다.

Chapter 1.

  • 강의소개 - 28분
  • Introduction to Operating Systems - 1시간 8분

(+) 인프런의 주니온 박사님의 운영체제 공룡책 강의를 듣고 내용을 보충했습니다. 자세한 사항은 여기를 참고하시면 됩니다.

image image

이 글은 반효경 교수님의 운영체제 강의와 주니온 박사님의 운영체제 공룡책 강의를 바탕으로 컴퓨터 시스템 구조와 프로그램 실행을 정리한다. Mode bit·Timer·인터럽트·시스템 콜·동기/비동기 입출력·DMA 등 운영체제가 하드웨어와 프로그램 실행을 제어하는 핵심 개념을 다룬다.

이 글에서 다루는 것

  • Mode bit와 Timer로 CPU 제어권이 어떻게 오가는지 이해한다.
  • Device controller·인터럽트·시스템 콜로 입출력이 처리되는 과정을 살핀다.
  • 동기식/비동기식 입출력과 DMA, 서로 다른 입출력 명령어를 비교한다.
  • 저장장치 계층 구조와 프로그램이 메모리에 적재되는 방식을 정리한다.

컴퓨터 시스템 구조

컴퓨터 시스템은 CPU·Memory·입출력 장치로 이뤄지고, 운영체제는 그 위에서 사용자 프로그램과 하드웨어 사이를 중개한다.

  • 운영 체제(operating system) : 사용자/응용 프로그램과 컴퓨터 하드웨어 사이의 중개자 역할을 하는 프로그램
    • 즉, 하드웨어를 쉽게 사용하기 위한 시스템이다.
  • CPU, Memory, Input과 Output 디바이스로 이뤄져 있다.

Mode bit

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제 피해가 가지 않도록 하기 위한 보호장치 필요
  • Mode bit을 통해 하드웨어적으로 두 가지 모드의 동작을 지원한다.
  • 0: 모니터모드 (kernel mode) 1
    • OS 코드를 수행한다.
    • 보안을 해칠 수 있는 중요한 명령어는 모니터모드에서만 수행 가능한 명령으로 규정한다(특권명령).
    • Interrupt나 Exception이 발생하면 하드웨어가 mode bit을 0으로 바꾼다.
  • 1: 사용자모드 (user mode)
    • 사용자 프로그램을 수행한다. 특권명령은 수행할 수 없다.
    • 사용자 프로그램에게 cpu를 넘기기 전에 mode bit을 1로 세팅한다.

주의: mode bit 값과 모드의 대응을 헷갈리지 말 것 — 여기서는 0이 모니터모드(커널 모드), 1이 사용자모드다. 1

사용자 모드와 커널 모드 구성 요소 사이의 통신 구조(Windows 예). 응용 프로그램·Windows API·사용자 모드 드라이버는 사용자 모드에서, 커널 모드 드라이버·파일 시스템 드라이버·운영체제 커널은 커널 모드에서 동작한다.

출처: User mode and kernel mode - Microsoft Learn (https://learn.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode), CC BY 4.0 (MicrosoftDocs/windows-driver-docs) 2

Timer

  • 정해진 시간이 흐른 뒤 운영체제에 제어권이 넘어가도록 인터럽트를 발생시킨다. 3
  • 매 클럭 틱마다 값이 1씩 감소한다.
  • 타이머 값이 0이 되면 타이머 인터럽트가 발생한다.
  • cpu를 특정 프로그램이 독점하는 것으로부터 보호한다.

정리하면, mode bit는 지금 실행 중인 코드가 사용자 프로그램인지 OS인지를 구분하고, timer는 한 프로그램이 cpu를 독점하지 못하도록 막는다.

Device Controller

  • I/O device controller (DC)
    • 실제 I/O 장치 유형을 관리하는 일종의 작은 cpu
    • 제어 정보를 위해 control register, status register를 가진다.
    • 각 device controller는 Local buffer를 가진다. (일종의 data register)
  • I/O는 실제 device와 local buffer 사이에서 일어난다.
  • Device controller는 I/O가 끝났을 경우 interrupt로 cpu에 그 사실을 알린다.

  • 장치 구동기(device driver) : os코드 중 각 장치별 처리 루틴 (software)

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

입출력(I/O)의 수행

  • 모든 입출력 명령은 특권명령
  • 그렇다면 사용자 프로그램은 어떻게 I/O를 하는가? 3
    • system call로 사용자 프로그램은 운영체제에게 I/O를 요청한다.
    • trap을 사용하여 인터럽트 벡터의 특정 위치로 이동한다.
    • 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동한다.
    • 올바른 I/O 요청인지 확인한 후 I/O를 수행한다.
    • I/O 완료 시 제어권을 시스템 콜 다음 명령으로 옮긴다.

시스템 콜(System Call)

  • 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것이다. 3
    • 뒤에 나올 개념인 synchronous에 해당한다.

결국 사용자 프로그램은 시스템 콜을 통해서만 커널의 서비스를 받는다.

인터럽트(Interrupt)

  • 현대의 운영체제는 인터럽트에 의해 구동된다.
  • 인터럽트(interrupt) : 주변장치가 cpu의 서비스가 필요한 경우 신호를 발생시켜 서비스를 요청하는데, 이때 발생시키는 신호
  • 인터럽트가 발생한 시점의 레지스터와 program counter를 저장한 후 cpu의 제어를 인터럽트 처리 루틴에 넘긴다.
  • Interrupt(넓은 의미)
    • Interrupt(하드웨어 인터럽트): 하드웨어가 발생시킨 인터럽트
  • Trap(소프트웨어 인터럽트)
    • Exception: 프로그램이 오류를 범한 경우
    • System call: 프로그램이 커널 함수를 호출하는 경우
  • 인터럽트 관련 용어
    • 인터럽트 벡터(interrupt vector) : 해당 인터럽트의 처리루틴주소를 갖고 있음
    • 인터럽트 처리 루틴(interrupt service routine, 인터럽트 핸들러): 해당 인터럽트를 처리하는 커널 함수
  • CPU는 인터럽트를 감지했을 때 interrupt handler라고 불리는 기능을 실행하도록 설계되었다. 4
  • IDT(Interrupt Descriptor Table)는 각 인터럽트를 해당 인터럽트 핸들러의 주소와 연결한다. 4

image

제어 흐름을 알았으니, 다음은 입출력이 끝날 때까지 프로그램이 어떻게 기다리는지다.

입출력 구조 - 동기식 입출력과 비동기식 입출력

  • 동기식 입출력 (Synchronous I/O)
    • I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어간다.
  • 구현방법 1
    • I/O가 끝날 때까지 cpu를 낭비시킨다.
    • 매 시점 하나의 I/O만 일어날 수 있다.
  • 구현방법 2
    • I/O가 완료될 때까지 해당 프로그램에서 cpu를 빼앗는다.
    • I/O 처리를 기다리는 줄에 그 프로그램을 줄 세운다.
    • 다른 프로그램에게 cpu를 준다.
  • ex. system call
  • 비동기식 입출력 (Asynchronous I/O)
    • I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어간다.
    • ex. interrupt
  • 위 두 방식 모두 I/O의 완료는 인터럽트로 알려준다. 3

동기식과 비동기식의 차이는 결국 제어권을 언제 돌려주느냐다.

DMA(Direct Memory Access)

  • DMA(Direct Memory Access)
    • 대량 데이터 이동에서 CPU가 매 바이트를 중재하는 프로그램 입출력(programmed I/O)의 부담을 피하기 위해 사용한다. 3
    • cpu의 중재 없이 device controller가 device의 buffer storage 내용을 메모리에 block 단위로 직접 전송한다.
    • 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킨다.

핵심은 인터럽트를 얼마나 줄이느냐다.

서로 다른 입출력 명령어

  • I/O를 수행하는 special instruction에 의한 방식 1
  • Memory mapped I/O에 의한 방식 1

입출력이 이뤄지는 방식을 봤으니, 이제 데이터가 어디에 저장되는지를 본다.

저장장치 계층 구조

CPU에서 직접 접근하여 실행할 수 있는 매체를 primary 또는 executable이라고 하며, CPU가 직접 접근하여 처리할 수 없는 매체를 secondary라고 한다. 1

  • Speed
  • Cost
  • Volatility(휘발성) : 위의 내부 기억장치 - 휘발성 매체 / 아래의 외부기억장치 - 비휘발성 매체
  • 휘발성 : 컴퓨터의 전기가 나가면 휘발되는 메모리

컴퓨터 시스템의 동작원리-2

  • Caching : 더 빠른 저장장치에 많이 쓰이는 데이터들을 복사해 놓는 것 1

(아래에서 위로 갈수록 더 빠르고 비싸고 휘발성 )

Primary, 휘발성 메모리
Registers
Cache Memory
Main Memory
Secondary, 비휘발성 메모리
Magnetic Disk
Optical Disk
Magnetic Tape

프로그램의 실행(메모리 load)

  • File System 안에 실행파일 A, B(일반적으로 Bin). 실행파일을 실행시키게 되면 메모리 안에서 프로세스로 올라가게 된다. 정확하게는 중간에 가상메모리를 거치게 된다.
  • 가상메모리(Virtual Memory)는 각 실행파일마다 가지고 있는 고유의 메모리 주소 공간을 말한다. 1
  • 프로세스마다 기계어 코드를 담고 있는 code, 변수 등 프로그램이 사용하는 자료구조를 담은 data, 함수를 실행하고 리턴할 때 데이터를 쌓았다가 내보내는 stack이 있는 address space가 존재한다. 이러한 address space를 물리 공간으로 옮겨서 실행시키게 된다. 물리 공간의 커널 영역은 항상 존재하지만 사용자 프로그램의 주소 공간은 프로그램 실행이 종료되면 생겼다가 사라진다.
  • 그러나 메모리 낭비를 막기 위해 필요한 부분만 물리적 메모리에 올리고 현재 필요하지 않은 부분은 디스크 swap area에 내려놓게 된다.
  • 하드디스크의 Swap Area는 전원이 나가면 내용이 의미를 잃지만(휘발성으로 취급), File System의 File Area는 비휘발성이다.

정리하면, 실행파일은 곧바로 물리 메모리에 올라가는 것이 아니라 가상메모리를 거쳐 필요한 부분만 적재된다.

  • 또는 process의 memory layout을 이렇게 나눌 수 있다.

  • Text section : 실행 가능한 코드
  • Data section : 전역 변수
  • Heap section : 프로그램이 동작하는 동안 동적으로(dynamically) 할당되는 메모리
  • Stack section : 함수를 부를 때 일시적인 데이터 공간 (function parameters, return addresses, local variables)

커널 주소 공간의 내용

image

사용자 프로그램이 사용하는 함수

  • 함수
    • 사용자 정의 함수: 자신의 프로그램에서 정의한 함수
  • 라이브러리 함수
    • 자신의 프로그램에서 정의하지 않고 가져다 쓴 함수
    • 자신의 프로그램의 실행 파일에 포함되어 있다.
  • 커널 함수
    • 운영체제 프로그램의 함수
    • 커널 함수의 호출 = 시스템 콜

한계와 트레이드오프

  • 동기식 입출력의 두 구현방법은 비용을 서로 맞바꾼다. 구현방법 1은 I/O가 끝날 때까지 cpu를 붙잡고 있으므로 그동안 다른 프로그램이 실행되지 못하고, 구현방법 2는 cpu를 회수하는 대신 문맥 교환 비용이 추가로 든다.
  • timer는 독점을 막지만 즉시 끊지는 못한다. 타이머 값이 0이 되는 시점에만 인터럽트가 발생하므로, 그 전까지는 해당 프로그램이 cpu를 계속 사용한다.
  • DMA도 인터럽트를 완전히 없애지는 못한다. 전송 자체는 cpu의 중재 없이 이뤄지지만 block 단위마다 인터럽트가 발생하므로, 전송량이 늘면 인터럽트 처리 비용은 남는다.
  • mode bit 기반 보호는 하드웨어 지원에 의존한다. 하드웨어가 특권명령 수행 여부를 검사하지 않는 구조에서는 사용자 프로그램과 OS 코드를 나누는 이 방식이 성립하지 않는다.
  • 캐싱은 속도와 비용을 맞바꾼다. 더 빠른 저장장치는 단위 용량당 비용이 높으므로, 계층 구조에서 위쪽 계층의 용량은 제한적일 수밖에 없다.

핵심 정리

  • Mode bit와 Timer. mode bit가 사용자 프로그램과 OS 코드를 구분하고, timer가 한 프로그램의 cpu 독점을 막는다.
  • 인터럽트와 시스템 콜. 모든 입출력 명령은 특권명령이라 사용자 프로그램은 시스템 콜로만 커널에 요청한다.
  • IDT와 인터럽트 처리. CPU는 인터럽트를 감지하면 IDT가 연결한 핸들러로 제어를 넘긴다.
  • 동기/비동기 입출력. 완료까지 기다렸다가 제어를 넘기느냐, 즉시 넘기느냐로 갈리며 완료 통보는 둘 다 인터럽트다.
  • DMA. device controller가 메모리에 block 단위로 직접 전송해 인터럽트 횟수를 줄인다.

References

댓글남기기