floatFirstTOC: right
🖥️ 시작하며🔍 운영체제 구조🔍 컴퓨터 시스템의 특징🔍 Interrupts VS Exceptions📌 Interrupts⚙️ Polling⚙️ Hardware Interrupts💡 Polling VS Hardware Interrupts📌 Exceptions⚙️ Traps⚙️ Faults⚙️ Aborts💡 Traps VS Faults VS Aborts📌 System Calls💡 System Calls 동작 방식📌 Signals💡 Signals 처리 과정🔍 I/O의 데이터 전송 방식📌 Programmed I/O (PIO)📌 Direct Memory Access (DMA)💡 PIO VS DMA🔍 Timers🔍 Protected Instructions💡 어떻게 프로세스가 보호된 명령어를 사용할 수 있는지?💡 Protection Boundaries Crossing🔍 Memory Protection📌 간단한 방법📌 MMU (Memory Management Unit)
🖥️ 시작하며
운영체제의 기본 구조와 아키텍처가 어떻게 운영체제를 도와주는지에 대해 알아봅니다.
🔍 운영체제 구조
🔍 컴퓨터 시스템의 특징
OS와 아키텍처는 상호작용함, 대부분의 OS가 특정 아키텍처를 염두에 두고 개발됨
- I/O의 의미:
입출력(I/O)은 메인 메모리와 컨트롤러의 로컬 버퍼 간의 데이터 이동을 의미합니다.
- I/O 장치와 CPU의 동시 실행:
입출력(I/O) 장치와 CPU는 동시에 실행될 수 있습니다.
- 장치 컨트롤러의 역할:
각 장치 컨트롤러는 특정 장치 유형을 관리합니다. 예를 들어, 디스크 드라이브에는 디스크 드라이브용 컨트롤러가, 프린터에는 프린터용 컨트롤러가 있습니다.
- 장치 컨트롤러의 로컬 버퍼:
각 장치 컨트롤러는 자체 로컬 버퍼를 가지고 있습니다. 이 버퍼는 데이터를 임시로 저장하는 데 사용됩니다.
- 장치와 메인 메모리 간 데이터 이동:
CPU는 데이터를 메인 메모리에서 로컬 버퍼로 이동시키거나 로컬 버퍼에서 메인 메모리로 이동시킵니다.
- CPU의 명령 발행:
CPU는 I/O 장치에 특정 명령을 발행합니다. 예를 들어, 데이터를 읽거나 쓰는 명령을 장치에 보냅니다.
- 명령 완료 여부 확인:
CPU는 발행한 명령이 완료되었는지 여부를 알 수 있어야 합니다. 이는 CPU가 명령의 실행 상태를 모니터링하고, 필요한 경우 추가 작업을 수행할 수 있도록 합니다.
🔍 Interrupts VS Exceptions
특징 | Interrupts (인터럽트) | Exceptions (예외) |
발생 원인 | 외부 하드웨어 장치 | 소프트웨어적 원인 (프로그램 오류 등) |
목적 | CPU의 주의를 끌어 중요한 작업 수행 | 프로그램 실행 중 예외 상황 처리 |
예시 | 키보드 입력, 네트워크 패킷 수신 등 | 0으로 나누기, 잘못된 메모리 접근 등 |
처리 방식 | 인터럽트 핸들러가 처리 후 원래 작업 재개 | 예외 처리 루틴이 처리 후 작업 재개 또는 종료 |
📌 Interrupts
하드웨어가 OS에게 요청 신호를 보내는 것, 현재 작업을 중단하고 즉시 중요한 작업 수행
인터럽트에는
Polling
과 Hardware Interrupt
두 종류가 존재합니다.⚙️ Polling
하드웨어가 요청한 작업이 끝났는지 CPU가 계속 확인하는 방식
- CPU는 주기적으로 각 I/O 장치의 상태를 확인합니다.
- I/O 장치가 데이터를 준비했는지 또는 작업을 완료했는지 여부를 확인합니다.
- I/O 장치가 준비된 경우, CPU는 데이터를 읽거나 씁니다.
- 이 과정이 반복되며, CPU는 계속해서 I/O 장치를 확인합니다.
⚙️ Hardware Interrupts
하드웨어가 작업이 끝나면 CPU에게 알려주는 방식
- 인터럽트 발생: I/O 장치 또는 다른 소스에서 인터럽트 신호를 CPU에 보냅니다.
- CPU 상태 저장: 현재 작업의 상태를 저장합니다.
- 고정된 위치, 장치 번호에 의해 인덱스된 위치, 또는 시스템 스택에 저장.
- 인터럽트 유형 결정: 벡터 인터럽트 시스템을 통해 어떤 인터럽트인지 결정합니다.
- ISR로 제어 전달: 인터럽트 서비스 루틴 또는 인터럽트 핸들러가 인터럽트를 처리합니다.
- 인터럽트 처리 완료: 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
운영체제에서 제공하는 서비스에 접근하기 위한 프로그램 인터페이스
- 어플리케이션이 운영체제의 핵심 기능을 사용할 수 있도록 합니다.
💡 System Calls 동작 방식
- 사용자 모드에서 시스템 호출 요청: 사용자 프로그램이 시스템 호출을 요청합니다. 예를 들어, 파일을 열기 위해
open()
시스템 호출을 사용할 수 있습니다.
- 커널 모드로 전환: 시스템 호출이 발생하면, CPU는 사용자 모드에서 커널 모드로 전환됩니다. 커널 모드는 운영 체제가 시스템 자원에 대한 직접 접근 권한을 가지는 모드입니다.
- System Call 처리: 운영 체제는 System Call을 처리합니다. 예를 들어, 파일을 여는 시스템 호출의 경우, 운영 체제는 파일 시스템에서 해당 파일을 찾고 파일 디스크립터를 반환합니다.
- 결과 반환 및 사용자 모드로 전환: 시스템 호출이 완료되면, 결과가 사용자 프로그램에 반환되고, CPU는 다시 사용자 모드로 전환됩니다.
- 시스템 콜 테이블은 커널의 메모리 내부에 존재합니다.
📌 Signals
운영체제가 실행 중인 프로세스에 메세지를 보내 특정 동작을 유발함
- 표준화된 메시지: 시그널은 미리 정의된 번호와 의미를 가지고 있습니다. 예를 들어,
SIGINT
는 프로그램을 인터럽트(중단)하기 위한 시그널입니다.
- 특정 동작 유발: 시그널을 받으면, 프로세스는 해당 시그널에 대응하는 특정 동작을 수행합니다. 이는 기본 동작이거나, 사용자 정의 시그널 핸들러에 의해 처리될 수 있습니다.
- 제한된 IPC 형태: 시그널은 프로세스 간 통신의 제한된 형태로 사용됩니다. 이는 주로 간단한 메시지 전달이나 이벤트 알림에 사용됩니다.
- 비동기적으로 작동합니다.
💡 Signals 처리 과정
- 시그널 발생: 시그널은 키보드 입력, 다른 프로세스의 요청, 하드웨어 이벤트 등 다양한 원인에 의해 발생할 수 있습니다.
- 시그널 전송: 운영 체제는 발생한 시그널을 해당 프로세스에 전송합니다.
- 시그널 수신 및 처리: 프로세스는 시그널을 수신하고, 해당 시그널에 대응하는 기본 동작을 수행하거나, 사용자 정의 시그널 핸들러에 의해 시그널을 처리합니다.
- 프로세스 동작 변경: 시그널에 의해 프로세스의 동작이 변경됩니다.
특징 | 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에게 통보 |
인터럽트 발생 빈도 | 데이터 전송이 완료될 때마다 | 블록 전송이 완료될 때마다 |
🔍 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
- 사용자 프로그램이 특권 작업을 수행하려면 운영 체제에 호출해야 합니다:
- 운영 체제는 시스템 콜 테이블을 정의합니다.
- 시스템 콜 명령어는 다음과 같은 작업을 수행해야 합니다:
- 예외를 발생시켜 커널 핸들러를 호출합니다.
- 호출할 시스템 콜을 나타내는 매개변수를 전달합니다.
- 호출자의 상태(레지스터, 모드 비트)를 저장하여 나중에 복원할 수 있도록 합니다.
- 운영 체제는 호출자의 매개변수(예: 포인터)를 검증해야 합니다.
- 작업이 완료되면 사용자 모드로 돌아갈 방법을 제공해야 합니다.
🔍 Memory Protection
📌 간단한 방법
base
레지스터와 limit
레지스터를 설정해 물리적으로 분리합니다.📌 MMU (Memory Management Unit)
MMU는 하드웨어! TLB도 여기 들어감
- base, limit 레지스터
- 페이지 테이블 포인터, 페이지 보호, TLBs (Translation Lookaside Buffers):
- 페이지 테이블은 가상 메모리 주소를 물리적 메모리 주소로 변환하는 데 사용됩니다.
- 페이지 보호는 각 페이지에 대해 읽기/쓰기 권한을 설정합니다.
- TLB는 페이지 테이블의 최근 항목을 캐시하여 빠른 주소 변환을 지원합니다.
- 가상 메모리:
- 실제 물리적 메모리보다 더 큰 주소 공간을 사용하여 프로그램을 실행할 수 있게 합니다.
- 세그멘테이션:
- 메모리를 논리적 단위(세그먼트)로 나누어 관리합니다.
- 메모리 관리 하드웨어를 조작하는 모든 명령어는 운영 체제만이 실행할 수 있습니다. 이는 시스템의 안전성과 안정성을 보장합니다.
댓글