OS, Container/Operating System

Operating-System Operations: 운영체제의 핵심 작동 원리

JunMoo 2024. 9. 9. 15:54

운영체제(OS)는 컴퓨터 하드웨어와 소프트웨어 자원을 효율적으로 관리하고 사용자와 응용 프로그램에 서비스를 제공하는 시스템 소프트웨어입니다. OS의 주요 작동 원리를 Python 코드 예제와 함께 살펴보겠습니다.

프로세스 관리

프로세스 관리는 OS의 가장 중요한 기능 중 하나입니다. 프로세스는 실행 중인 프로그램의 인스턴스를 의미하며, 여러 상태를 거치게 됩니다.프로세스 상태 전이프로세스는 생성부터 종료까지 다음과 같은 상태를 거칩니다:

  1. 생성(NEW)
  2. 준비(READY)
  3. 실행(RUNNING)
  4. 대기(WAITING)
  5. 종료(TERMINATED)

이를 Python 코드로 표현하면 다음과 같습니다:

class Process:
    def __init__(self, pid):
        self.pid = pid
        self.state = 'NEW'

    def change_state(self, new_state):
        print(f"Process {self.pid} changing from {self.state} to {new_state}")
        self.state = new_state

# 프로세스 상태 전이 시뮬레이션
process1 = Process(1)
process1.change_state('READY')
process1.change_state('RUNNING')
process1.change_state('WAITING')
process1.change_state('READY')
process1.change_state('RUNNING')
process1.change_state('TERMINATED')

이 코드는 프로세스의 상태 변화를 시뮬레이션합니다. 실제 OS에서는 이러한 상태 전이가 스케줄러에 의해 관리됩니다.

스케줄링 알고리즘

OS는 다양한 스케줄링 알고리즘을 사용하여 CPU 시간을 프로세스에 할당합니다. 간단한 라운드 로빈 스케줄링 알고리즘을 Python으로 구현해 보겠습니다:

from collections import deque

class Scheduler:
    def __init__(self, time_quantum):
        self.ready_queue = deque()
        self.time_quantum = time_quantum

    def add_process(self, process):
        self.ready_queue.append(process)

    def run(self):
        while self.ready_queue:
            current_process = self.ready_queue.popleft()
            print(f"Running process {current_process.pid} for {self.time_quantum} time units")
            current_process.change_state('RUNNING')
            
            # 실제로는 여기서 프로세스를 실행
            
            if current_process.state != 'TERMINATED':
                current_process.change_state('READY')
                self.ready_queue.append(current_process)

# 스케줄러 사용 예
scheduler = Scheduler(time_quantum=100)
for i in range(1, 4):
    scheduler.add_process(Process(i))

scheduler.run()

이 스케줄러는 기본적인 라운드 로빈 알고리즘을 구현합니다. 각 프로세스는 정해진 시간 할당량(time quantum) 동안 실행된 후, 다시 대기열의 끝으로 이동합니다.

메모리 관리

메모리 관리는 물리적 메모리를 효율적으로 사용하고 프로세스 간 메모리 보호를 제공합니다. 가상 메모리 시스템의 핵심 개념인 페이징을 간단히 구현해 보겠습니다:

class PageTable:
    def __init__(self, page_size):
        self.page_size = page_size
        self.table = {}

    def add_mapping(self, virtual_page, physical_frame):
        self.table[virtual_page] = physical_frame

    def get_physical_address(self, virtual_address):
        virtual_page = virtual_address // self.page_size
        offset = virtual_address % self.page_size
        
        if virtual_page in self.table:
            physical_frame = self.table[virtual_page]
            return physical_frame * self.page_size + offset
        else:
            raise Exception("Page fault")

# 페이지 테이블 사용 예
page_table = PageTable(page_size=4096)
page_table.add_mapping(0, 5)  # 가상 페이지 0은 물리 프레임 5에 매핑
page_table.add_mapping(1, 10)  # 가상 페이지 1은 물리 프레임 10에 매핑

print(page_table.get_physical_address(100))  # 가상 주소 100의 물리 주소 출력
print(page_table.get_physical_address(4500))  # 가상 주소 4500의 물리 주소 출력

이 코드는 간단한 페이지 테이블을 구현하여 가상 주소를 물리 주소로 변환하는 과정을 보여줍니다. 실제 OS에서는 이보다 훨씬 복잡한 메모리 관리 기법을 사용합니다.운영체제의 작동 원리는 이보다 훨씬 복잡하고 다양하지만, 이러한 기본 개념들이 현대 컴퓨팅 시스템의 효율성, 안정성, 보안성을 보장하는 기반이 됩니다. 프로세스 관리, 스케줄링, 메모리 관리 등의 핵심 기능들이 유기적으로 작동하여 우리가 사용하는 컴퓨터 시스템을 원활하게 운영합니다.