사진과 음악을 좋아하는 개발자 지망생의 블로그

시스템 구조 & 프로그램 실행(컴퓨터 시스템 구조, 입출력, 동기식 및 비동기식 입출력, 프로그램 실행) 본문

CS/운영체제

시스템 구조 & 프로그램 실행(컴퓨터 시스템 구조, 입출력, 동기식 및 비동기식 입출력, 프로그램 실행)

devculture309 2024. 12. 16. 10:34
반응형

1. 컴퓨터 시스템 구조

1) 개요

  • 컴퓨터: CPU + 메모리
    • 메모리
      • CPU의 작업 공간
      • CPU는 매 순간 메모리에서 기계어(instructions)를 읽어서 실행하게 됨
  • I/O Device
    • input: 데이터가 컴퓨터가 들어가는 것 → 마우스, 키보드 등
    • output: 컴퓨터에서 데이터를 처리 후 외부로 내보내는 것 → 디스플레이, 프린터, 스피커 등

 

 

2) 상세

Mode Bit

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 비트
  • Mode bit을 통해 하드웨어적으로 두 가지 모드 operation 지원
    • 1: 사용자 모드, 사용자 프로그램 수행
    • 0: 모니터 모드(= 커널 모드, 시스템 모드), OS코드 수행
  • 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 '특권 명령'으로 규정
    • Interrupt나 Exception 발생 시 하드웨어가 mode bit0으로 바꿈
    • 용자 프로그램에게 CPU를 넘기기 전에 mode bit1로 세팅

 

Timer

  • 특정 프로그램이 CPU를 독점하는 것을 막기 위한 장치→ 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴  → 운영체제가 cpu를 다른 사용자 프로그램에게 넘길때 특정값이 셋팅된 timer를 넣어서 넘김
  • 타이머는 매 클럭 틱 때마다 1씩 감소
  • 타이머 값이 0이 되면 타이머 인터럽트 발생
  • 타이머는 time sharing을 구현하기 위해 널리 이용됨
  • 현재 시간을 계산하기 위해서도 사용

 

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 controller는 메인 메모리에 접근하지 못하는 대신 local buffer에 접근 가능
  • 용어 구분
    • Device Driver(장치 구동기): os 코드 중 각 장치별 처리 루틴 → software
    • Device Controller(장치 제어기): 각 장치를 제어하는 일종의 작은 CPU → hardware

 

DMA Controller

  • CPU가 모든 입출력(I/O) 작업을 직접 처리하지 않도록 도와주는 장치
  • CPU 중재 없이 device controller가 device의 Buffer Storage의 내용을 메모리 block 단위로 직접 전송
    • 바이트 단위가 아니라 block 단위로 인터럽트를 발생 시킴
  • ,  DMA 컨트롤러는 CPU가 메모리와 I/O 장치 간의 세부적인 데이터 전송 작업을 직접 수행하지 않도록 하여 CPU의 작업 부하를 줄이고 시스템 성능을 향상시킴
  • DMA Controller의 필요성
    • DMA Controller가 없을 경우 CPU가 계속해서 I/O 장치의 상태를 확인하고, 데이터 전송 요청과 Interrupt를 처리해야함
    • 이렇게 CPU가 모든 I/O 작업을 직접 처리하게 되면 다른 중요한 연산을 수행할 수 있는 시간이 줄어들어 전체 시스템 성능이 저하됨
    • DMA 컨트롤러는 CPU의 개입 없이 I/O 장치와 메인 메모리 간 데이터를 직접 전송할 수 있는 장치로 I/O 장치와 메모리 간에 데이터를 직접 전송
    • 데이터 전송이 완료되면 DMA 컨트롤러가 CPU에 단 한 번의 인터럽트를 발생시켜 작업 완료를 알림

                 ⇒ CPU의 오버헤드를 줄이고 성능을 향상시키기 위해 필요함

 

 

 

2. 입출력(I/O)의 수행

1) 입출력(I/O)의 수행

  • 모든 입출력 명령은 특권 명령임 → 사용자 프로그램이 직접 입출력 명령을 할 수 없으며 시스템 콜(System Call)을 통해 수행함
    • 시스템 콜(System Call)
      • 사용자 프로그램이 운영체제의 서비스를 받기 위해 Trap 함수를 호출하는 것
  • 사용자 프로그램은 어떻게 I/O를 하는가?
    1. 사용자 프로그램이 운영체제에게 I/O요청
    2. Trap을 사용하여 인터럽트 벡터의 특정 위치로 이동
    3. 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
    4. 올바름 I/O 요청인지 확인 후 I/O 수행
    5. I/O 완료 시 제어권은 시스템콜 다음 명령으로 옯김

 

 

2) 인터럽트(Interrupt)

  • 인터럽트 당한 시점의 레지스터와 PC(Program Counter)를 저장한 후 CPU의 제어를 인터럽트 처리 루틴에 넘김
  • interrupt의 넓은 의미
    • interrupt(하드웨어 인터럽트)
      • 하드웨어가 발생시킨 인터럽트(타이머, i/o 컨트롤러가 거는 인터럽트) → 보통 말하는 Interrupt
    • Trap(소프트웨어 인터럽트)
      • Exception: 프로그램이 오류를 범한 경우
      • System Call: 프로그램이 커널 함수를 호출하는 경우
  • 인터럽트 관련 용어
    • 인터럽트 벡터
      • 해당 인터럽트의 처리 루틴 주소를 가지고 있음
    • 인터럽트 처리 루틴
      • 해당 인터럽트를 처리하는 커널 함수

 

 

 

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

1) 동기식 입출력 (Sychronouse I/O)

  • CPU가 I/O 작업이 끝난 것을 확인한 후에야 사용자 프로그램이 계속 실행될 수 있도록 제어를 넘김
    • 보통 Strorage에 데이터가 잘 쓰여졌는지 확인하고 싶을때 동기식 사용
  • 구현 방법
    • 방법 1
      • I/O가 끝날 때까지 CPU를 낭비시키는 방식
      • 매시점 하나의 I/O만 일어날 수 있음 → CPU 낭비 뿐만 아니라 I/O 장비 낭비도 유발함
    • 방법 2
      • I/O가 완료될 때까지 해당 프로그램에서 CPU를 회수
      • I/O 처리를 기다리는 프로그램을 대기열에 넣고, 다른 프로그램에 CPU를 할당하여 자원 낭비를 줄임
      • 즉, I/O 작업이 끝난 후에야 해당 프로그램이 다시 실행될 수 있음 ⇒ 프로그램 관점에서는 동기적으로 I/O 작업을 기다리는 방식
      • 방법1에 비해 낭비가 CPU를 효율적으로 사용할 수 있어 선호하는 방법임

 

 

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

  • I/O 작업을 요청한 후에 바로 사용자 프로그램이 다른 작업을 계속 수행함
  • I/O는 보통 비동기식으로 하는 것이 자연스러움

※ 동기식 비동기식 모두 I/O 완료 시 인터럽트로 알려줌

 

 

 

4. 서로 다른 입출력 명령어

1) 일반적인 방식(좌측)

  • I/O 작업을 위한 특별한 명령어가 존재함 ⇒ 메인 메모리 접근 명령어I/O 작업 명령어가 각각 따로 실행

 

 

2) Memory-Mapped I/O (우측)

  • I/O 장치의 주소가 메모리 주소 공간 내에 포함되어 있음 ⇒ 메모리 접근 명령어만으로도 I/O 작업을 처리할 수 있음

 

 

 

5. 프로그램 실행

1) 메모리 Load

  • 프로그램의 실행 과정
    • 프로그램은 실행 파일 형태로 저장되며, 실행 시 메모리로 올라가 프로세스가 됨
    • 다만, 물리 메모리에 바로 올라가는 것이 아니라 가상 메모리를 통해 올라감
  • 메모리 주소 공간과 가상 메모리
    • 프로그램은 실행 시 독자적인 메모리 주소(논리 주소) 공간을 갖게 되며, 이 공간은 코드, 데이터, 스택 영역으로 구성됨
    • 이때, 모든 메모리 공간을 물리 메모리에 올리지 않고 필요한 부분만 올려서 메모리 낭비를 줄임
    • 사용하지 않는 데이터는 하드디스크의 스왑 영역으로 내리고 필요한 부분만 메인 메모리에 올리며, 이러한 방식을 가상 메모리(Virtual Memory)라고 함
  • 파일 시스템과 스왑 영역의 차이
    • 파일 시스템은 전원이 꺼져도 데이터가 유지되지만, 스왑 영역은 데이터가 유지되지 않아 다른 방식으로 관리됨
  • 메모리 주소 변환(Address Transition)
    • 프로세스의 논리 주소를 물리 메모리 주소로 변환하는 주소 변환 계층이 존재하며, 이는 하드웨어 장치로 처리함

 

 

2) 커널 주소 공간의 내용

Code

  • 자원 관리편리한 서비스 제공을 위한 코드가 포함됨
  • 시스템 호출(System Call)인터럽트 처리를 위한 코드도 포함되어 있음

 

Data

  • 운영체제에서 사용하는 여러 자료구조가 저장됨
  • 하드웨어에 필요한 자료구조프로세스 관리를 위한 데이터들이 포함됨

 

Stack

  • 운영체제는 함수 호출 구조로 작성되어 있어, 함수 호출 시 스택 영역을 사용함
  • 운영체제 코드는 여러 프로그램에서 호출될 수 있으며, 호출 시 사용자 프로그램에 해당하는 함수 내용이 스택에 올라감

 

 

3) 함수

사용자 정의 함수

  • 프로그램 내에서 직접 정의한 함수
  • 사용자가 작성한 코드를 호출하여 사용

 

라이브러리 함수

  • 프로그램 외부에서 가져다 사용하는 함수
  • 실행 파일을 생성하면 사용자 정의 함수와 함께 라이브러리 함수도 실행 파일에 포함

 

커널 함수

  • 운영체제의 함수로, 시스템 자원 관리를 위한 기능을 제공함
  • 커널 함수를 사용자 프로그램이 호출할 때는 시스템 호출(System Call)을 사용하여, 명령어 메모리 주소가 사용자 공간에서 커널 공간으로 전환됨 → 프로세스 메모리 공간에 커널 함수가 저장되는 것이 아님

 

프로그램 실행 단계

  • User Mode (사용자 모드)
    • 프로그램이 CPU를 직접 사용하며 실행되는 상태
    • 사용자 정의 함수라이브러리 함수를 호출해도 이 모드에서 실행됨
  • Kernel Mode (커널 모드)
    • 프로그램이 시스템 호출(System Call)을 통해 운영체제의 기능을 사용할 때, 커널 모드로 전환됨
    • 이때 CPU의 제어권이 사용자 프로그램에서 커널로 넘어가 운영체제가 자원을 관리함
  • 모드 전환
    • 시스템 호출이 완료되면 다시 User Mode로 전환되며, 사용자 프로그램에게 CPU의 제어권이 반환
    • 이후 프로그램이 다시 시스템 호출을 하면 다시 Kernel Mode로 전환
반응형