운영체제에서는 여러 프로세스가 동시에 실행되며 자원을 공유하고 협력합하지만 여러 프로세스가 하나의 공유 자원에 무질서하게 접근하면 데이터가 손상되거나 예측 불가능한 결과가 발생할 수 있습니다.

프로세스 동기화(Process Synchronization)는 혼란을 방지하고 협력하는 프로세스들이 정해진 순서와 규칙에 따라 공유 자원에 안전하게 접근하도록 조율하는 모든 메커니즘을 의미합니다. 동기화의 필요성과 임계 구역, 그리고 해결책인 세마포어와 모니터에 대하여 작성한 글 입니다.

경쟁 상태와 임계 구역

둘 이상의 프로세스가 공유 자원(변수, 파일, 메모리 등)에 동시에 접근하여 조작할 때, 접근 순서에 따라 실행 결과가 달라지는 현상을 경쟁 상태(Race Condition)라고 합니다. 예를 들어, 두 프로세스가 은행 계좌 잔액을 동시에 읽어와 각자 입금 처리를 한다면, 최종 잔액이 정상적으로 계산되지 않는 문제가 발생할 수 있습니다. 이는 데이터의 일관성을 파괴하는 심각한 오류로 이어집니다.

이러한 경쟁 상태를 유발할 수 있는, 즉 공유 자원에 접근하는 코드 영역을 임계 구역(Critical Section)이라고 합니다. 프로세스 동기화의 핵심 목표는 이 임계 구역에 한 번에 단 하나의 프로세스만 진입하도록 보장하는 것입니다.

임계 구역 문제 해결을 위한 3가지 조건

임계 구역 문제를 해결하기 위한 알고리즘은 반드시 다음 세 가지 조건을 만족해야 합니다.

 

상호 배제(Mutual Exclusion) 원칙 : 어떤 프로세스가 임계 구역을 실행 중이라면, 다른 어떤 프로세스도 해당 임계 구역에 진입할 수 없어야 합니다.

 

진행(Progress) 조건 : 임계 구역이 비어있고, 진입을 원하는 프로세스가 있다면 반드시 어느 하나는 들어갈 수 있도록 허용되어야 합니다.

한정된 대기 (Bounded Waiting) 조건 : 특정 프로세스가 임계 구역에 진입하기 위해 무한정 기다리는 상황이 발생해서는 안 됩니다.

세마포어와 모니터

복잡한 임계 구역 문제를 프로그래머가 매번 직접 해결하는 것은 어렵고 오류 발생 가능성이 높습니다. 이를 위해 운영체제와 프로그래밍 언어는 다음과 같은 고수준의 동기화 도구를 제공합니다.

세마포어 (Semaphore)

세마포어는 다익스트라가 제안한 동기화 도구로, 현재 사용 가능한 자원의 개수를 나타내는 정수 변수(S)와 두 개의 원자적 연산, P()와 V()로 구성됩니다. P() 연산은 임계 구역 진입 전 자원을 획득하려는 시도(잠금)이며, V() 연산은 임계 구역 작업 후 자원을 반납하는 행위(잠금 해제 및 신호)입니다. 만약 자원이 없다면, P() 연산을 시도한 프로세스는 자원이 생길 때까지 대기 상태에 들어갑니다.

모니터 (Monitor)

모니터는 세마포어보다 더 고수준의 동기화 추상화 도구입니다. 프로그래머가 P(), V() 연산을 직접 호출하며 발생할 수 있는 실수를 방지하기 위해 고안되었습니다. 모니터는 공유 자원과 해당 자원에 접근하는 함수들을 하나의 캡슐로 묶고, 한 번에 단 하나의 프로세스만 모니터 내부에 진입할 수 있도록 언어 차원에서 보장합니다. 프로그래머는 공유 자원에 접근하기 위해 모니터가 제공하는 인터페이스를 호출하기만 하면 되므로, 동기화 로직이 훨씬 간결하고 안전해집니다.

프로세스 간 통신 (IPC) 기법

동기화는 프로세스들이 데이터를 주고받는 통신 과정에서도 중요하게 작용합니다. 대표적인 프로세스 간 통신(IPC, Inter-Process Communication) 기법은 아래와 같습니다.

  • 파이프 (Pipe) : 운영체제가 제공하는 단방향 통신 채널로, 주로 fork()로 생성된 부모-자식 프로세스 간 통신에 사용됩니다. 양방향 통신을 위해서는 두 개의 파이프가 필요합니다.
  • 공유 메모리 (Shared Memory): 여러 프로세스가 접근할 수 있는 공통의 메모리 공간을 생성하여 통신하는 방식입니다. 데이터 복사가 필요 없어 매우 빠르지만, 동기화 문제를 프로그래머가 직접 해결해야 합니다.
  • 소켓 (Socket): 네트워크로 연결된 서로 다른 컴퓨터에 있는 프로세스 간의 양방향 통신을 위한 표준 인터페이스입니다.

정리

프로세스 동기화는 병렬 컴퓨팅 환경에서 데이터의 무결성을 지키고 시스템의 안정성을 보장하기 위하여 필수적입니다. 경쟁 상태와 임계 구역의 개념을 이해하고, 세마포어나 모니터와 같은 동기화 도구를 올바르게 사용하는 것은 신뢰할 수 있는 멀티스레드/멀티프로세스 프로그램을 개발하는 데 있어 중요합니다.

728x90

'운영체제' 카테고리의 다른 글

물리 메모리  (0) 2025.10.15
교착 상태(Deadlock)  (1) 2025.10.13
CPU 스케줄링  (0) 2025.10.02
컴퓨터 하드웨어와 성능의 이해  (0) 2025.09.20
프로세스와 스레드  (0) 2025.09.19

다중 프로그래밍 시스템에서 운영체제의 가장 중요한 역할 중 하나는 한정된 CPU 자원을 여러 프로세스에 효율적으로 배분하는 것입니다. "어떤 프로세스에게, 언제, 얼마만큼의 CPU를 할당할 것인가?"를 결정하는 것을 CPU 스케줄링이라고 합니다.
CPU 스케줄링의 핵심 개념과 대표적인 알고리즘들을 분석하고, 각 방식의 장단점을 비교하여 시스템 성능에 어떤 영향을 미치는가에 대한 글 입니다.


CPU 스케줄링의 핵심 개념

  • CPU Scheduling : 준비 상태의 프로세스 중 하나를 선택하여 CPU를 할당하는 단기(Low-level) 스케줄링 작업입니다.
  • Preemptive Scheduling(선점형) : 운영체제가 현재 실행 중인 프로세스를 강제로 중단시키고 다른 프로세스에게 CPU를 할당할 수 있는 방식이며 현대 운영체제의 기본 동작 방식입니다.
  • Non-preemptive Scheduling(비선점형) : 한 프로세스가 CPU를 점유하면, 해당 작업이 완료될 때까지 다른 프로세스가 개입할 수 없는 방식입니다.
  • Starvation(기아 현상) : 특정 프로세스가 계속해서 CPU를 할당받지 못하고 무한히 대기하는 현상입니다.
  • Aging(에이징) : 기아 현상을 방지하기 위하여 대기 시간이 길어진 프로세스의 우선순위를 점진적으로 높여주는 기법입니다.

스케줄링 알고리즘 성능 평가 지표

알고리즘의 성능은 다음과 같은 지표를 통해 평가되며, 좋은 알고리즘은 이 시간들을 최소화하는 것을 목표로 합니다.

  • Waiting Time(대기 시간) : 프로세스가 CPU를 할당받기 위해 준비 큐에서 기다린 총 시간입니다.
  • Response Time(응답 시간) : 작업 요청 후 첫 번째 반응이 나타나기까지 걸린 시간입니다.
  • Turnaround Time(반환 시간) : 프로세스가 시스템에 제출된 순간부터 완료될 때까지 걸린 총 시간으로, 대기 시간 + 실행 시간으로 계산됩니다.

주요 스케줄링 알고리즘 분석

비선점형 알고리즘

  1. FCFS(First-Come, First-Served) : 가장 단순한 방법으로 준비 큐에 도착한 순서대로 처리합니다. 그러나, 실행 시간이 긴 프로세스가 먼저 도착하면 뒤따르는 짧은 프로세스들의 대기 시간이 길어지는 '콘보이 효과'가 발생할 수 있습니다.
  2. SJF(Shortest Job First) : 실행 시간이 가장 짧은 프로세스를 먼저 처리하여 시스템의 평균 대기 시간을 최소화하는 최적 알고리즘입니다. 그러나 실제 실행 시간을 정확히 예측하기 어렵고, 긴 작업이 계속해서 순위가 밀리는 '기아 현상'이 발생할 수 있다는 단점이 있습니다.
  3. HRN(Highest Response-ratio Next) : SJF의 기아 현상을 보완한 알고리즘입니다. 우선순위를 (대기 시간 + 실행 시간) / 실행 시간으로 계산하여, 오래 기다린 프로세스의 우선순위를 동적으로 높여줍니다.

선점형 알고리즘

  1. Round Robin(RR) : 모든 프로세스에게 타임 슬라이스(Time Slice)라는 동일한 크기의 CPU 시간을 할당하고, 시간이 만료되면 준비 큐의 맨 뒤로 보내는 방식입니다. 시분할 시스템의 근간을 이루며, 응답 시간이 빠르지만 잦은 문맥 교환으로 인한 오버헤드가 발생할 수 있습니다.
  2. SRT(Shortest Remaining Time) : SJF의 선점형 버전이며, 새로운 프로세스가 도착하면 현재 실행 중인 프로세스의 '남은 시간'과 비교하여 더 짧은 쪽에게 CPU를 할당합니다.
  3. Multi-level Feedback Queue(MFQ) : 현대 운영체제에서 널리 사용되는 복합적인 방식입니다. 여러 개의 우선순위 큐를 두고 프로세스는 실행 패턴에 따라 큐 사이를 동적으로 이동합니다. 일반적으로 CPU를 짧게 사용하는 대화형 작업은 높은 우선순위 큐에, 오래 사용하는 CPU 집중 작업은 낮은 우선순위 큐로 이동시켜 시스템의 응답성과 처리율을 동시에 만족시키려 노력합니다.

주의점


대기 시간과 응답 시간은 다릅니다. 
대기 시간은 실행 '전'까지의 총 대기 시간을, 응답 시간은 실행 '후' 첫 반응까지의 시간을 의미합니다.

SJF가 항상 최선은 아닙니다. 
실행 시간 예측의 어려움과 기아 현상이라는 치명적인 약점이 존재합니다.

선점형 방식이 항상 효율적인 것은 아닙니다. 

문맥 교환에 따르는 오버헤드 때문에, 특정 상황에서는 라운드 로빈의 평균 대기 시간이 FCFS보다 길어질 수도 있습니다.

MFQ의 핵심은 '피드백'입니다. 

프로세스가 큐 사이를 이동(피드백)하며 우선순위가 동적으로 변하는 것이 MLQ와의 가장 큰 차이점입니다.


정리

완벽한 CPU 스케줄링 알고리즘은 존재하지 않습니다. 각 알고리즘은 시스템의 목표(빠른 응답, 높은 처리율 등)와 주어진 작업의 특성에 따라 달라집니다.
운영체제에 대하여 다양한 알고리즘의 원리를 이해하고, 이를 조합하여 시스템의 목적에 가장 부합하는 최적의 스케줄링 전략을 구현해야 하며, 시스템의 효율성과 사용자 만족도 사이의 균형을 맞춰야 합니다.



 
728x90

'운영체제' 카테고리의 다른 글

교착 상태(Deadlock)  (1) 2025.10.13
프로세스 동기화와 임계 구역 문제  (0) 2025.10.11
컴퓨터 하드웨어와 성능의 이해  (0) 2025.09.20
프로세스와 스레드  (0) 2025.09.19
저장장치의 계층 구조  (0) 2025.09.18

IP 주소란?

IP 주소는 인터넷에 연결된 모든 장치를 구별하기 위한 고유한 식별 번호입니다. 현재 우리는 두 가지 버전의 IP 주소를 함께 사용하고 있습니다.

  • IPv4 (Internet Protocol version 4): 32비트로 구성된 주소 체계로, 약 43억 개의 주소를 표현할 수 있습니다. 인터넷 초창기에는 충분할 것으로 예상했지만, 기기 수가 폭발적으로 증가하며 주소 고갈 문제에 직면했습니다.
  • IPv6 (Internet Protocol version 6): IPv4의 주소 부족 문제를 해결하기 위해 등장한 128비트 주소 체계입니다. 거의 무한에 가까운 주소를 생성할 수 있어 사물 인터넷(IoT) 시대의 기반이 되고 있습니다.

IP 주소의 표기법
컴퓨터는 IP 주소를 32개의 0과 1로 이루어진 2진수로 인식하지만, 사람이 이를 직접 사용하기는 어렵습니다. 그래서 우리는 보통 다음과 같은 방식으로 IP 주소를 표기합니다.

  • 점-십진 표기법 (Dotted-Decimal) : 32비트를 8비트씩 네 부분으로 나누어 각각 10진수로 변환하고 점(.)으로 구분하는 방식입니다. (예: 192.168.1.1)
  • 도메인 이름 (Domain Name) : 숫자로 된 IP 주소를 사람이 기억하기 쉬운 문자로 변환한 것입니다. (예: www.kanghyun.dev) 이 변환은 DNS(Domain Name System)를 통해 이루어집니다.

네트워크와 호스트

IP 주소는 단순히 32자리 숫자의 나열이 아닌 두 가지 중요한 부분으로 나뉩니다.

  • 네트워크 ID (NetID) : 해당 장치가 속한 네트워크의 주소를 나타냅니다. 우편 주소의 ‘도시’나 ‘도로명’과 같습니다.
  • 호스트 ID (HostID) : 해당 네트워크 내에서 장치를 구별하는 고유 번호입니다. 우편 주소의 ‘상세 주소(번지)’와 같습니다.

라우터는 데이터를 전송할 때 먼저 네트워크 ID를 보고 데이터를 올바른 네트워크로 보냅니다. 데이터가 해당 네트워크에 도착하면, 그제야 호스트 ID를 보고 최종 목적지 장비로 전달합니다. 이러한 계층적 구조 덕분에 인터넷은 효율적으로 동작할 수 있습니다.

서브넷 마스크

32비트 IP 주소에서 어디까지가 네트워크 ID이고 어디부터가 호스트 ID인지 경계를 알려주는 것이 서브넷 마스크(Subnet Mask)입니다.

서브넷 마스크 역시 IP 주소처럼 32비트 숫자로 구성되며, 2진수로 표현했을 때 ‘1’로 채워진 부분은 네트워크 ID를, ‘0’으로 채워진 부분은 호스트 ID를 의미합니다.

예를 들어, 255.255.255.0이라는 서브넷 마스크는 2진수로 11111111.11111111.11111111.00000000이므로, 앞의 24비트는 네트워크 ID, 뒤의 8비트는 호스트 ID임을 나타냅니다.

서브네팅

과거에는 IP 주소를 A, B, C와 같은 클래스(Class)로 나누어 네트워크의 크기를 고정했습니다. 예를 들어 C 클래스는 254개의 호스트를 가질 수 있었고, B 클래스는 65,534개를 가질 수 있었습니다. 이 방식은 만약 300개의 호스트가 필요한 기관이 B 클래스를 할당받으면 6만 개가 넘는 주소가 낭비되는 비효율을 낳았습니다.

이러한 문제를 해결하기 위해 등장한 기술이 서브네팅(Subnetting)입니다. 서브네팅은 할당받은 하나의 큰 네트워크를 필요에 맞게 여러 개의 작은 네트워크(서브넷)로 나누어 사용하는 기술입니다.

 

서브네팅의 원리

서브네팅은 호스트 ID 부분의 비트를 빌려와 네트워크 ID를 확장하는 방식으로 이루어집니다. 예를 들어, 호스트 ID에서 3비트를 빌려오면, 2³ = 8개의 작은 서브넷을 만들 수 있습니다. 이렇게 하면 주소를 필요한 만큼만 할당하여 낭비를 줄이고, 네트워크를 기능별(예: 경리부, 생산부) 또는 지역별로 분리하여 관리하기 용이해집니다. 또한, 네트워크 트래픽을 분산시켜 성능을 향상시키고 보안을 강화하는 효과도 있습니다.

특별한 IP 주소들

모든 IP 주소를 장비에 할당할 수 있는 것은 아닙니다. 몇몇 주소는 특별한 용도로 예약되어 있습니다.

  • 네트워크 주소 : 호스트 ID 부분이 모두 0인 주소로, 해당 네트워크 자체를 대표합니다. (예: 192.168.5.0)
  • 브로드캐스트 주소 : 호스트 ID 부분이 모두 1인 주소로, 해당 네트워크의 모든 호스트에게 데이터를 한 번에 전송할 때 사용됩니다. (예: 192.168.5.255)
  • 사설 IP 주소 (Private Address) : 공유기를 사용하는 가정이나 회사 내부 네트워크에서 자유롭게 사용할 수 있도록 약속된 주소 대역입니다. (10.x.x.x, 172.16.x.x ~ 172.31.x.x, 192.168.x.x) 이 주소들은 인터넷에서 직접 사용될 수 없습니다.
  • 루프백 주소 (Loopback Address) : 127.0.0.1은 컴퓨터가 자기 자신을 가리키는 주소로, 주로 네트워크 소프트웨어를 테스트하는 데 사용됩니다.

정리

IP 주소와 서브네팅은 현대 네트워크를 이해하는 데 가장 기본이 되는 핵심적인 개념입니다. IP 주소는 네트워크 ID와 호스트 ID라는 체계적인 구조를 가지며, 서브넷 마스크는 그 구조를 구분하는 기준이 됩니다. 그리고 서브네팅은 이 구조를 유연하게 변경하여 한정된 IP 주소를 효율적으로 사용하고 네트워크를 체계적으로 관리하는 강력한 도구입니다.

728x90