[OS] 운영체제 소개
[OS] 운영체제 소개

[OS] 운영체제 소개

카테고리
💻 Computer Science
작성자
박용성박용성
작성일
2024년 06월 02일
태그
OS
floatFirstTOC: right

🖥️ 시작하며

운영체제의 기본 구조와 아키텍처가 어떻게 운영체제를 도와주는지에 대해 알아봅니다.
 

🔍 운영체제 구조

notion image
notion image

🔍 컴퓨터 시스템의 특징

💡
OS와 아키텍처는 상호작용함, 대부분의 OS가 특정 아키텍처를 염두에 두고 개발됨
  • I/O의 의미:
    • 입출력(I/O)은 메인 메모리와 컨트롤러의 로컬 버퍼 간의 데이터 이동을 의미합니다.
  • I/O 장치와 CPU의 동시 실행:
    • 입출력(I/O) 장치와 CPU는 동시에 실행될 수 있습니다.
  • 장치 컨트롤러의 역할:
    • 각 장치 컨트롤러는 특정 장치 유형을 관리합니다. 예를 들어, 디스크 드라이브에는 디스크 드라이브용 컨트롤러가, 프린터에는 프린터용 컨트롤러가 있습니다.
  • 장치 컨트롤러의 로컬 버퍼:
    • 각 장치 컨트롤러는 자체 로컬 버퍼를 가지고 있습니다. 이 버퍼는 데이터를 임시로 저장하는 데 사용됩니다.
  • 장치와 메인 메모리 간 데이터 이동:
    • CPU는 데이터를 메인 메모리에서 로컬 버퍼로 이동시키거나 로컬 버퍼에서 메인 메모리로 이동시킵니다.
  • CPU의 명령 발행:
    • CPU는 I/O 장치에 특정 명령을 발행합니다. 예를 들어, 데이터를 읽거나 쓰는 명령을 장치에 보냅니다.
  • 명령 완료 여부 확인:
    • CPU는 발행한 명령이 완료되었는지 여부를 알 수 있어야 합니다. 이는 CPU가 명령의 실행 상태를 모니터링하고, 필요한 경우 추가 작업을 수행할 수 있도록 합니다.
 

🔍 Interrupts VS Exceptions

notion image
 
특징
Interrupts (인터럽트)
Exceptions (예외)
발생 원인
외부 하드웨어 장치
소프트웨어적 원인 (프로그램 오류 등)
목적
CPU의 주의를 끌어 중요한 작업 수행
프로그램 실행 중 예외 상황 처리
예시
키보드 입력, 네트워크 패킷 수신 등
0으로 나누기, 잘못된 메모리 접근 등
처리 방식
인터럽트 핸들러가 처리 후 원래 작업 재개
예외 처리 루틴이 처리 후 작업 재개 또는 종료

📌 Interrupts

💡
하드웨어가 OS에게 요청 신호를 보내는 것, 현재 작업을 중단하고 즉시 중요한 작업 수행
인터럽트에는 Polling Hardware Interrupt 두 종류가 존재합니다.

⚙️ Polling

💡
하드웨어가 요청한 작업이 끝났는지 CPU가 계속 확인하는 방식
  1. CPU는 주기적으로 각 I/O 장치의 상태를 확인합니다.
  1. I/O 장치가 데이터를 준비했는지 또는 작업을 완료했는지 여부를 확인합니다.
  1. I/O 장치가 준비된 경우, CPU는 데이터를 읽거나 씁니다.
  1. 이 과정이 반복되며, CPU는 계속해서 I/O 장치를 확인합니다.
 

⚙️ Hardware Interrupts

💡
하드웨어가 작업이 끝나면 CPU에게 알려주는 방식
  1. 인터럽트 발생: I/O 장치 또는 다른 소스에서 인터럽트 신호를 CPU에 보냅니다.
  1. CPU 상태 저장: 현재 작업의 상태를 저장합니다.
      • 고정된 위치, 장치 번호에 의해 인덱스된 위치, 또는 시스템 스택에 저장.
  1. 인터럽트 유형 결정: 벡터 인터럽트 시스템을 통해 어떤 인터럽트인지 결정합니다.
  1. ISR로 제어 전달: 인터럽트 서비스 루틴 또는 인터럽트 핸들러가 인터럽트를 처리합니다.
  1. 인터럽트 처리 완료: ISR이 인터럽트 처리를 완료하고, 저장된 CPU 상태를 복원한 후 원래 작업을 재개합니다.
 

💡 Polling VS Hardware Interrupts

특징
Polling (폴링)
Hardware Interrupts (하드웨어 인터럽트)
동작 방식
CPU가 주기적으로 I/O 장치 상태를 확인
I/O 장치가 인터럽트 신호를 보내 CPU가 처리
CPU 자원 소모
높음 (지속적인 확인 필요)
낮음 (필요할 때만 처리)
응답 시간
일정하지만, I/O 장치에 따라 다를 수 있음 (상태 확인 사이의 지연 존재 가능성)
매우 빠름 (즉시 처리)
구현 복잡성
간단
복잡
사용 예시
단순 임베디드 시스템
대부분의 현대 컴퓨터 시스템 (키보드, 네트워크 등)

📌 Exceptions

💡
OS가 어플리케이션에게 신호를 보내는 것

⚙️ Traps

  • 의도적 (Intentional):
    • 트랩은 주로 의도적으로 발생시키는 예외입니다.
    • System Call, 디버깅 시의 브레이크포인트, 특수 명령어 실행 등의 상황에서 발생합니다.
  • 처리 방식:
    • 트랩이 발생하면, 예외 처리 루틴을 수행한 후 제어를 "다음" 명령어로 돌려줍니다. 이는 트랩이 발생한 명령어가 성공적으로 완료된 것으로 간주하기 때문입니다.

⚙️ Faults

  • 비의도적이지만 회복 가능성 있음 (Unintentional but possibly recoverable):
    • 폴트는 주로 의도치 않게 발생하지만, 경우에 따라 회복이 가능한 예외입니다.
    • 페이지 폴트(Page Fault), 보호 폴트(Protection Fault) 등이 이에 해당합니다.
  • 처리 방식:
    • 폴트가 발생하면, 예외 처리 루틴을 수행합니다.
    • 회복 가능한 경우, 폴트가 발생한 "현재" 명령어를 다시 실행합니다.
    • 회복 불가능한 경우, 프로그램을 종료하거나 중단시킵니다.

⚙️ Aborts

  • 비의도적이고 회복 불가능 (Unintentional and unrecoverable):
    • 어보트는 주로 의도치 않게 발생하며 회복이 불가능한 예외입니다.
    • Parity Error, Machine Check 등 시스템의 심각한 오류로 인해 발생합니다.
  • 처리 방식:
    • 어보트가 발생하면, 현재 프로그램을 즉시 종료하고 시스템 상태를 안정화시키기 위한 조치를 취합니다.
 

💡 Traps VS Faults VS Aborts

유형
의도성
예시
처리 방식
Traps
의도적 (Intentional)
시스템 호출, 브레이크포인트 트랩 등
예외 처리 후 "다음" 명령어로 제어를 돌림
Faults
비의도적이지만 회복 가능성 있음
페이지 폴트 (회복 가능), 보호 폴트 (회복 불가능)
회복 가능하면 "현재" 명령어를 다시 실행, 회복 불가능하면 프로그램 종료
Aborts
비의도적이고 회복 불가능
패리티 오류, 기계 검사 등
현재 프로그램을 종료하고 시스템 상태를 안정화

📌 System Calls

💡
운영체제에서 제공하는 서비스에 접근하기 위한 프로그램 인터페이스
  • 어플리케이션이 운영체제의 핵심 기능을 사용할 수 있도록 합니다.
notion image

💡 System Calls 동작 방식

  1. 사용자 모드에서 시스템 호출 요청: 사용자 프로그램이 시스템 호출을 요청합니다. 예를 들어, 파일을 열기 위해 open() 시스템 호출을 사용할 수 있습니다.
  1. 커널 모드로 전환: 시스템 호출이 발생하면, CPU는 사용자 모드에서 커널 모드로 전환됩니다. 커널 모드는 운영 체제가 시스템 자원에 대한 직접 접근 권한을 가지는 모드입니다.
  1. System Call 처리: 운영 체제는 System Call을 처리합니다. 예를 들어, 파일을 여는 시스템 호출의 경우, 운영 체제는 파일 시스템에서 해당 파일을 찾고 파일 디스크립터를 반환합니다.
  1. 결과 반환 및 사용자 모드로 전환: 시스템 호출이 완료되면, 결과가 사용자 프로그램에 반환되고, CPU는 다시 사용자 모드로 전환됩니다.
  • 시스템 콜 테이블은 커널의 메모리 내부에 존재합니다.
 
 

📌 Signals

💡
운영체제가 실행 중인 프로세스에 메세지를 보내 특정 동작을 유발함
  • 표준화된 메시지: 시그널은 미리 정의된 번호와 의미를 가지고 있습니다. 예를 들어, SIGINT는 프로그램을 인터럽트(중단)하기 위한 시그널입니다.
  • 특정 동작 유발: 시그널을 받으면, 프로세스는 해당 시그널에 대응하는 특정 동작을 수행합니다. 이는 기본 동작이거나, 사용자 정의 시그널 핸들러에 의해 처리될 수 있습니다.
  • 제한된 IPC 형태: 시그널은 프로세스 간 통신의 제한된 형태로 사용됩니다. 이는 주로 간단한 메시지 전달이나 이벤트 알림에 사용됩니다.
  • 비동기적으로 작동합니다.
 

💡 Signals 처리 과정

  1. 시그널 발생: 시그널은 키보드 입력, 다른 프로세스의 요청, 하드웨어 이벤트 등 다양한 원인에 의해 발생할 수 있습니다.
  1. 시그널 전송: 운영 체제는 발생한 시그널을 해당 프로세스에 전송합니다.
  1. 시그널 수신 및 처리: 프로세스는 시그널을 수신하고, 해당 시그널에 대응하는 기본 동작을 수행하거나, 사용자 정의 시그널 핸들러에 의해 시그널을 처리합니다.
  1. 프로세스 동작 변경: 시그널에 의해 프로세스의 동작이 변경됩니다.
 
특징
System Calls
Signals
Interrupts
정의
운영 체제 서비스에 대한 프로그래밍 인터페이스 프로세스 → 운영체제
실행 중인 프로세스에 표준화된 메시지 운영체제 → 프로세스
하드웨어나 소프트웨어 이벤트에 의해 CPU의 실행이 중단되는 상황 하드웨어 → 운영체제
발생 원인
프로그램이 운영 체제의 기능을 요청할 때
사용자 입력, 다른 프로세스, 하드웨어 이벤트 등
하드웨어 장치(I/O 장치, 타이머 등) 또는 소프트웨어 이벤트
비동기성
비동기적이지 않음 (동기적)
비동기적
비동기적
주요 목적
운영 체제의 기능 사용 (파일 조작, 프로세스 관리, 메모리 관리 등)
특정 동작 유발 (프로세스 중단, 종료, 오류 처리 등)
즉각적인 주의와 처리 필요 (데이터 전송 완료, 타이머 만료 등)
동작 방식
함수 호출 형태로 프로세스에 의해 명시적으로 호출됨
프로세스 실행 중 특정 이벤트 발생 시 운영 체제가 비동기적으로 전달
하드웨어 신호에 의해 CPU가 현재 작업을 중단하고 처리 루틴 실행
처리 순서
호출된 순서대로 처리
비동기적으로 발생하여 처리됨
발생 즉시 처리
예시
open(), read(), write(), fork()
SIGINT, SIGTERM, SIGKILL, SIGSEGV
키보드 입력, 디스크 I/O 완료, 타이머 신호
핸들러 설정 가능 여부
프로세스가 명시적으로 호출함
프로세스가 시그널 핸들러를 설정할 수 있음
운영 체제가 인터럽트 핸들러를 설정함
기본 동작
운영 체제에서 정의된 기능 수행
기본 시그널 핸들러가 실행됨 (종료, 무시, 코어 덤프 등)
운영 체제에 의해 정의된 인터럽트 서비스 루틴(ISR)이 실행됨
사용 사례
파일 시스템 접근, 프로세스 생성 및 종료, 메모리 할당 및 해제 등
프로그램 종료, 프로세스 간 통신, 비정상 상황 처리
I/O 완료 알림, 타이머 이벤트 처리, 하드웨어 오류 처리
 

🔍 I/O의 데이터 전송 방식

📌 Programmed I/O (PIO)

💡
CPU가 직접 I/O 장치와 메모리 간의 데이터 전송을 담당하는 방식
  • 특수한 I/O 명령어를 사용하거나 Memory-Mapped I/O 방식을 사용합니다.
  • CPU는 데이터 전송이 완료될 때까지 I/O 장치의 상태를 지속적으로 폴링합니다.
  • CPU가 모든 데이터 전송 작업을 직접 처리하기 때문에 CPU의 개입이 큽니다.

📌 Direct Memory Access (DMA)

💡
I/O 장치에서 CPU의 개입 없이 데이터를 직접 메모리로 전송하는 방식 (인터럽트의 한 종류)
  • DMA 컨트롤러가 데이터 전송을 관리합니다.
  • 데이터 블록을 버퍼에서 메인 메모리로, 또는 메인 메모리에서 버퍼로 직접 전송합니다.
  • 데이터 전송이 완료되면, DMA 컨트롤러가 CPU에게 인터럽트를 발생시켜 작업이 완료되었음을 알립니다.
 

💡 PIO VS DMA

특징
Programmed I/O (PIO)
Direct Memory Access (DMA)
정의
CPU가 I/O 장치와 메모리 간 데이터를 직접 전송
DMA 컨트롤러가 CPU 개입 없이 데이터를 직접 전송
CPU 개입
높음
낮음
데이터 전송 속도
상대적으로 느림
고속 데이터 전송 가능
적합한 작업
저속 I/O 작업 (키보드 입력, 간단한 센서 데이터 읽기 등)
고속 I/O 작업 (디스크 드라이브, 네트워크 패킷 처리 등)
효율성
CPU가 지속적으로 폴링하며, 다른 작업에 사용 가능한 시간 감소
CPU가 다른 작업을 수행할 수 있어 시스템 효율성 증가
폴링 사용 여부
CPU가 I/O 장치의 상태를 지속적으로 확인
DMA 컨트롤러가 데이터 전송을 관리, 완료 시에만 CPU에게 통보
인터럽트 발생 빈도
데이터 전송이 완료될 때마다
블록 전송이 완료될 때마다
notion image
notion image

🔍 Timers

💡
운영 체제가 실행 중인 프로그램으로부터 CPU의 제어를 가져오는 방법
  • 주기적인 인터럽트를 생성하는 하드웨어 타이머 사용:
    • 하드웨어 타이머는 정기적으로 인터럽트를 생성하도록 설정됩니다. 타이머는 메인보드에 존재합니다.
  • 타이머 인터럽트가 발생하면 제어가 운영 체제로 돌아갑니다:
    • 타이머 인터럽트가 발생하면, 실행 중인 프로그램으로부터 제어가 운영 체제로 넘어갑니다.
  • 운영 체제는 타이머를 인터럽트할 시간으로 미리 로드합니다:
    • 예를 들어, Linux 2.4에서는 10ms, Linux 2.6에서는 1ms로 설정됩니다. 현재 Linux에서는 동적으로 변경됩니다.
  • 타이머는 운영체제만이 로드 가능합니다.
 

🔍 Protected Instructions

💡
보호된 명령어는 OS만 사용 가능
  • Direct I/O access (직접 I/O 접근)
    • I/O 장치에 직접 접근하기 위해서는 특권 명령어를 사용하거나 메모리 맵핑을 통해 접근합니다.
  • Memory state management (메모리 상태 관리)
    • 운영 체제는 메모리 상태 관리를 위해 페이지 테이블을 업데이트하거나 페이지 테이블 포인터를 설정합니다.
    • TLB를 로드하는 등의 작업도 운영 체제에 의해 관리됩니다.
  • Setting special "mode bits" (특별 "모드 비트" 설정)
    • 운영 체제는 CPU의 작동 모드를 설정하기 위해 특별한 모드 비트를 설정합니다. 이러한 비트는 CPU가 사용자 모드인지 커널 모드인지 결정하는 데 사용됩니다.
 

💡 어떻게 프로세스가 보호된 명령어를 사용할 수 있는지?

  • 아키텍처는 최소한 두 가지 운영 모드를 지원:
    • 커널 모드와 사용자 모드
    • IA-32에서는 4개의 특권 레벨 지원: Ring 0 > 1 > 2 > 3
  • 모드는 보호된 프로세서 레지스터의 상태 비트로 설정됩니다:
    • 사용자 프로그램은 사용자 모드에서, 운영 체제는 커널 모드에서 실행
    • IA-32의 경우, 현재 특권 레벨(CPL)은 CS 레지스터 에 저장
  • 보호된 명령어는 오직 커널 모드에서만 실행될 수 있습니다.
 

💡 Protection Boundaries Crossing

  • 사용자 프로그램이 특권 작업을 수행하려면 운영 체제에 호출해야 합니다:
    • 운영 체제는 시스템 콜 테이블을 정의합니다.
  • 시스템 콜 명령어는 다음과 같은 작업을 수행해야 합니다:
    • 예외를 발생시켜 커널 핸들러를 호출합니다.
    • 호출할 시스템 콜을 나타내는 매개변수를 전달합니다.
    • 호출자의 상태(레지스터, 모드 비트)를 저장하여 나중에 복원할 수 있도록 합니다.
    • 운영 체제는 호출자의 매개변수(예: 포인터)를 검증해야 합니다.
    • 작업이 완료되면 사용자 모드로 돌아갈 방법을 제공해야 합니다.
 
notion image
 

🔍 Memory Protection

📌 간단한 방법

base 레지스터와 limit 레지스터를 설정해 물리적으로 분리합니다.
notion image

📌 MMU (Memory Management Unit)

💡
MMU는 하드웨어! TLB도 여기 들어감
  • base, limit 레지스터
  • 페이지 테이블 포인터, 페이지 보호, TLBs (Translation Lookaside Buffers):
    • 페이지 테이블은 가상 메모리 주소를 물리적 메모리 주소로 변환하는 데 사용됩니다.
    • 페이지 보호는 각 페이지에 대해 읽기/쓰기 권한을 설정합니다.
    • TLB는 페이지 테이블의 최근 항목을 캐시하여 빠른 주소 변환을 지원합니다.
  • 가상 메모리:
    • 실제 물리적 메모리보다 더 큰 주소 공간을 사용하여 프로그램을 실행할 수 있게 합니다.
  • 세그멘테이션:
    • 메모리를 논리적 단위(세그먼트)로 나누어 관리합니다.
  • 메모리 관리 하드웨어를 조작하는 모든 명령어는 운영 체제만이 실행할 수 있습니다. 이는 시스템의 안전성과 안정성을 보장합니다.
 
 
 

댓글

guest