- Authors

- Name
- Youngju Kim
- @fjvbn20031
운영체제란 무엇인가
운영체제(Operating System)는 컴퓨터 하드웨어를 관리하고, 응용 프로그램에게 실행 환경을 제공하는 소프트웨어다. 사용자와 하드웨어 사이의 중재자 역할을 수행한다.
운영체제의 네 가지 구성 요소
컴퓨터 시스템은 크게 네 가지 요소로 구성된다.
- 하드웨어: CPU, 메모리, I/O 장치 등 기본 자원을 제공한다
- 운영체제: 하드웨어를 제어하고 응용 프로그램 간 자원을 조율한다
- 응용 프로그램: 워드 프로세서, 컴파일러, 웹 브라우저 등 사용자 문제를 해결한다
- 사용자: 사람, 다른 기계, 또는 다른 컴퓨터
운영체제의 역할
운영체제는 관점에 따라 두 가지로 정의할 수 있다.
- 자원 할당자(Resource Allocator): CPU 시간, 메모리 공간, 저장 장치, I/O 장치 등 모든 자원의 관리자
- 제어 프로그램(Control Program): 프로그램 실행을 제어하여 오류와 부적절한 사용을 방지
더 보편적인 정의로는, 운영체제는 컴퓨터에서 항상 실행 중인 프로그램인 **커널(kernel)**이다.
컴퓨터 시스템 구성
인터럽트(Interrupt)
인터럽트는 하드웨어가 CPU에게 이벤트 발생을 알리는 메커니즘이다. I/O 장치가 작업을 완료하면 인터럽트를 통해 CPU에 신호를 보낸다.
[인터럽트 처리 과정]
1. I/O 장치가 작업 완료
2. 장치 컨트롤러가 인터럽트 신호 발생
|
v
3. CPU가 현재 작업 중단
4. 현재 상태(PC, 레지스터)를 스택에 저장
|
v
5. 인터럽트 벡터를 통해 ISR 주소 확인
6. ISR(Interrupt Service Routine) 실행
|
v
7. 저장된 상태 복원
8. 중단된 작업 재개
인터럽트의 종류는 다음과 같다.
- 하드웨어 인터럽트: I/O 장치, 타이머 등에 의해 발생
- 소프트웨어 인터럽트(트랩): 오류(0으로 나누기)나 시스템 콜에 의해 발생
// 인터럽트 벡터 테이블 개념도
// 각 인터럽트 번호에 대응하는 ISR 주소를 저장
typedef void (*isr_handler_t)(void);
isr_handler_t interrupt_vector_table[256];
// 인터럽트 번호 0: 0으로 나누기 예외
// 인터럽트 번호 1: 디버그 예외
// 인터럽트 번호 14: 페이지 폴트
// ...
// 인터럽트 번호 32~255: 사용자 정의(I/O 장치 등)
void handle_interrupt(int interrupt_number) {
// 인터럽트 벡터에서 핸들러를 찾아 실행
isr_handler_t handler = interrupt_vector_table[interrupt_number];
if (handler != NULL) {
handler();
}
}
저장 장치 계층 구조
저장 장치는 속도, 비용, 휘발성에 따라 계층을 이룬다.
[저장 장치 계층]
빠름 / 비쌈 / 작음
+-----------+
| 레지스터 | < 1ns
+-----------+
| 캐시 (L1) | ~1ns
+-----------+
| 캐시 (L2) | ~4ns
+-----------+
| 캐시 (L3) | ~10ns
+-----------+
| 메인 메모리 | ~100ns (휘발성)
+-----------+
| SSD | ~100us (비휘발성)
+-----------+
| HDD | ~10ms
+-----------+
느림 / 저렴 / 큼
캐싱(Caching)은 느린 저장소의 데이터를 빠른 저장소에 임시로 복사하는 기법이다. 동일한 데이터에 다시 접근할 때 빠른 저장소에서 읽으므로 성능이 향상된다.
I/O 구조
I/O 작업은 CPU와 장치 컨트롤러 간의 상호작용으로 이루어진다.
- 프로그래밍된 I/O: CPU가 직접 데이터를 한 바이트씩 전송 (비효율적)
- 인터럽트 기반 I/O: 장치가 준비되면 인터럽트로 CPU에 알림
- DMA(Direct Memory Access): 대량 데이터 전송 시 CPU 개입 없이 장치 컨트롤러가 직접 메모리에 접근
[DMA 동작 과정]
CPU DMA 컨트롤러 메모리
| | |
|-- DMA 전송 요청 --------->| |
| (소스, 목적지, 크기) | |
| |--- 데이터 전송 --->|
| |--- 데이터 전송 --->|
| |--- 데이터 전송 --->|
|<-- 전송 완료 인터럽트 ----| |
| | |
컴퓨터 시스템 아키텍처
멀티프로세서 시스템
현대 컴퓨터는 대부분 멀티프로세서 시스템이다. 장점은 다음과 같다.
- 처리량 증가: N개의 프로세서가 있으면 처리 속도가 향상된다 (단, N배는 아님)
- 규모의 경제: 여러 단일 프로세서 시스템보다 비용 효율적
- 신뢰성 향상: 하나가 고장나도 전체 시스템은 계속 동작 (graceful degradation)
멀티프로세서 시스템에는 두 가지 유형이 있다.
- 비대칭 멀티프로세싱(AMP): 하나의 마스터 프로세서가 시스템을 제어하고, 나머지는 지시를 따름
- 대칭 멀티프로세싱(SMP): 각 프로세서가 동등한 위치에서 OS 기능을 수행
[SMP 아키텍처]
CPU 0 CPU 1 CPU 2
[레지스터] [레지스터] [레지스터]
[캐시] [캐시] [캐시]
| | |
+------+------+------+------+
| |
[공유 메모리] [I/O 시스템]
멀티코어 시스템
멀티코어 프로세서는 하나의 칩에 여러 코어를 포함한다. 같은 칩 안에서 통신하므로 별도 프로세서 간 통신보다 빠르고 전력 소비도 적다.
[멀티코어 프로세서 구조]
+--------------------------------------+
| 하나의 CPU 칩 |
| +--------+ +--------+ +--------+ |
| | 코어 0 | | 코어 1 | | 코어 2 | |
| |[L1캐시] | |[L1캐시] | |[L1캐시] | |
| +--------+ +--------+ +--------+ |
| +----------+ |
| | L2 캐시 | |
| +----------+ |
+--------------------------------------+
|
[메인 메모리]
NUMA (Non-Uniform Memory Access)
CPU 수가 많아지면 시스템 버스가 병목이 된다. NUMA는 각 CPU에 자체 로컬 메모리를 제공하여 이 문제를 해결한다.
[NUMA 아키텍처]
+------------------+ 인터커넥트 +------------------+
| 노드 0 |<================>| 노드 1 |
| CPU 0 CPU 1 | | CPU 2 CPU 3 |
| [로컬 메모리 0] | | [로컬 메모리 1] |
+------------------+ +------------------+
로컬 메모리 접근: 빠름 (~100ns)
원격 메모리 접근: 느림 (~300ns)
운영체제 운영 방식
이중 모드(Dual-Mode) 운영
OS는 사용자 프로그램의 잘못된 동작으로부터 시스템을 보호해야 한다. 이를 위해 두 가지 실행 모드를 제공한다.
- 사용자 모드(User Mode): 응용 프로그램 실행. 특권 명령어 실행 불가
- 커널 모드(Kernel Mode): OS 코드 실행. 모든 명령어 실행 가능
[모드 전환 과정]
사용자 모드 커널 모드
| |
|-- 시스템 콜 호출 ---------------->|
| (트랩 발생, 모드 비트 0) |
| |-- 시스템 콜 처리
| |
|<-- 시스템 콜 반환 ---------------|
| (모드 비트 1로 복원) |
| |
// 시스템 콜 예시: 파일 읽기
// 사용자 프로그램에서 read() 호출
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
char buffer[1024];
// open()은 시스템 콜을 통해 커널 모드로 전환
int fd = open("data.txt", O_RDONLY);
// read()도 시스템 콜 - 커널이 I/O 수행
ssize_t bytes = read(fd, buffer, sizeof(buffer));
printf("읽은 바이트: %zd\n", bytes);
close(fd);
return 0;
}
타이머(Timer)
타이머는 프로그램이 CPU를 독점하는 것을 방지한다. 일정 시간이 지나면 인터럽트를 발생시켜 OS에 제어를 넘긴다.
- 고정 타이머: 일정 간격으로 인터럽트 발생
- 가변 타이머: 고정 클럭 + 카운터로 구현. 카운터가 0이 되면 인터럽트 발생
자원 관리
프로세스 관리
프로세스는 실행 중인 프로그램이다. OS는 다음을 수행한다.
- 프로세스 생성 및 삭제
- 프로세스 일시 정지 및 재개
- 프로세스 동기화 메커니즘 제공
- 프로세스 간 통신(IPC) 메커니즘 제공
- 교착 상태(Deadlock) 처리 메커니즘 제공
메모리 관리
메인 메모리는 CPU가 직접 접근할 수 있는 유일한 대용량 저장소다. OS는 다음을 관리한다.
- 메모리의 어느 부분이 사용 중인지, 누가 사용하는지 추적
- 어떤 프로세스와 데이터를 메모리에 올리고 내릴지 결정
- 필요에 따라 메모리 공간 할당 및 해제
저장 장치 관리
OS는 저장 장치의 물리적 특성을 추상화하여 논리적 파일 개념을 제공한다.
- 파일 시스템 관리: 파일 생성/삭제, 디렉터리 관리, 접근 제어
- 대용량 저장 장치 관리: 디스크 스케줄링, 빈 공간 관리, 저장 장치 할당
- 캐싱: 자주 접근하는 데이터를 더 빠른 저장소에 유지
I/O 서브시스템
OS의 I/O 서브시스템은 하드웨어 장치의 차이를 숨긴다.
- 버퍼링(Buffering): 전송 중 데이터를 임시 저장
- 캐싱(Caching): 자주 사용하는 데이터의 복사본 유지
- 스풀링(Spooling): 프린터 같은 장치의 출력을 대기열에 저장
보호와 보안
- 보호(Protection): OS가 정의한 자원에 대한 프로세스/사용자의 접근을 제어하는 메커니즘
- 보안(Security): 외부 또는 내부의 공격을 방어. 인증, 권한 부여, 감사 등을 포함
각 사용자에게는 고유 ID(UID)가 부여되고, 그룹 ID(GID)를 통해 그룹 단위 접근 제어도 가능하다. 권한 상승(privilege escalation)은 일시적으로 더 높은 권한을 얻는 메커니즘으로, Unix에서는 setuid 비트를 통해 구현한다.
정리
[운영체제 핵심 개념 요약]
+------------------------------------------+
| 응용 프로그램 |
+------------------------------------------+
| 운영체제 (커널) |
| +------+ +--------+ +--------+ +------+ |
| |프로세스| |메모리 | |파일 | |I/O | |
| |관리 | |관리 | |시스템 | |관리 | |
| +------+ +--------+ +--------+ +------+ |
+------------------------------------------+
| 하드웨어 |
| CPU / 메모리 / 디스크 / I/O 장치 |
+------------------------------------------+
운영체제는 하드웨어와 사용자 사이에서 자원을 관리하고, 프로그램 실행 환경을 제공하며, 시스템을 보호하는 핵심 소프트웨어다. 이중 모드 운영, 인터럽트, 타이머 등의 하드웨어 지원을 활용하여 안전하고 효율적인 시스템 운영을 보장한다.