os
멀티쓰레드 환경에서 생길 수 있는 문제들
멀티쓰레드 환경에서 발생할 수 있는 문제들멀티쓰레드는 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있어, CPU 자원을 효율적으로 활용할 수 있게 해준다.하지만 동시에 여러 쓰레드가 동일한 자원에 접근하게 되면 다양한 문제가 발생할 수 있으며, 이들 문제는 시스템 안정성과 성능에 직접적인 영향을 미친다.1. 경쟁 조건 (Race Condition)정의여러 쓰레드가 동시에 같은 자원(예: 전역 변수, 파일 등)에 접근하고 수정하려 할 때 발생하는 문제로,실행 순서에 따라 결과가 달라지는 비결정적 현상이다.예시cpp복사편집counter++; // 읽기 → 증가 → 쓰기 (세 단계 중간에 다른 쓰레드가 개입 가능) 문제점간헐적이고 재현이 어려운 버그 발생결과값이 불안정하거나 예측 불가능해결뮤텍스, 세..
다양한 OS 스케줄링 기법
멀티스레딩 또는 멀티프로세스 환경에서의 스케줄링 기법멀티스레딩 혹은 멀티프로세스를 사용할 때 운영체제는 어떤 프로세스를 언제 실행할지를 결정하는 스케줄러를 사용한다.이때 사용되는 여러 스케줄링 정책들은 각기 다른 목적과 환경에 최적화되어 있으며, 시스템 성능과 사용자 경험에 큰 영향을 준다.1. FCFS (First-Come, First-Served)가장 먼저 도착한 프로세스를 먼저 실행하는 방식큐에 들어온 순서대로 처리되므로 구현이 간단하다단점: 실행 시간이 긴 프로세스가 먼저 들어오면 짧은 프로세스가 오래 대기하는 현상이 발생할 수 있다 (Convoy Effect)주로 배치 처리 시스템에서 사용2. Round Robin (RR)모든 프로세스에 동일한 시간 할당량(타임퀀텀)을 부여실행 중 타임퀀텀이 만..
쓰레드와 프로세스 (Thread & Process)
프로세스(Process)란?프로세스는 실행 중인 프로그램으로, 운영체제로부터 자원을 독립적으로 할당받는 실행 단위이다.하나의 프로세스는 고유한 메모리 공간을 가지며, CPU, 메모리, 파일, 입출력 자원 등을 할당받아 독립적으로 실행된다.특징코드, 데이터, 힙, 스택 등 고유의 메모리 공간을 가진다다른 프로세스와 메모리를 공유하지 않음프로세스 간 통신은 별도의 메커니즘(IPC, 파이프, 소켓 등)을 사용해야 하므로 통신 비용이 크다하나의 프로세스가 오류로 종료되더라도 다른 프로세스에는 영향을 주지 않음쓰레드(Thread)란?쓰레드는 프로세스 내에서 실행 흐름을 분리한 최소 실행 단위이다.한 프로세스 내에서 여러 쓰레드가 동시에 실행될 수 있으며, 메모리 공간을 공유하면서 작업을 나누어 수행한다.특징같은 ..
경쟁 조건(Race Condition)이란?
경쟁 조건(Race Condition)이란?경쟁 조건(Race Condition)은 둘 이상의 스레드 또는 프로세스가 동시에 동일한 공유 자원에 접근할 때,실행 순서나 타이밍에 따라 프로그램의 결과가 달라지는 현상을 말한다.이러한 현상은 공유 자원에 대한 접근이 적절히 동기화되지 않았을 때 발생하며,예상치 못한 동작, 논리 오류, 데이터 손상 등으로 이어질 수 있다.경쟁 조건의 특징멀티스레드 또는 멀티프로세싱 환경에서 주로 발생재현이 어렵고 디버깅이 매우 까다로운 대표적인 동시성 버그프로그램 테스트 중에는 잘 나타나지 않다가 실제 환경에서 간헐적으로 터지는 경우가 많음공유 자원: 변수, 메모리, 파일, 소켓 등경쟁 조건 예시이전 글 "임계영역이란?"에 나오는 카운터 예제 참고.경쟁 조건 해결 방법경쟁 조..
파편화 (Fragmentation)
파편화(Fragmentation)란?파편화는 메모리를 할당하고 해제하는 과정에서 사용하지 못하는 공간이 군데군데 생겨나는 현상이다.전체 메모리의 총합은 충분해 보이지만, 연속된 큰 공간이 없거나 공간이 낭비되어 새로운 메모리 할당이 실패하게 된다.운영체제의 메모리 관리 효율성을 저해하는 주요 원인 중 하나로, 외부 파편화와 내부 파편화로 나뉜다.파편화의 종류1. 외부 파편화 (External Fragmentation)여러 프로세스의 할당과 해제가 반복되면서, 빈 공간이 조각조각 흩어진 상태메모리 총량은 충분하지만, 요구된 크기만큼 연속된 공간이 없어 할당에 실패한다.주로 가변 크기 메모리 할당 방식에서 발생한다.2. 내부 파편화 (Internal Fragmentation)프로세스에 할당된 메모리 블록이 ..
동기화 객체란?
동기화 객체란?멀티스레드 환경에서 여러 실행 흐름이 공유 자원에 동시에 접근하면 충돌이나 비정상적인 동작이 발생할 수 있다. 이를 방지하기 위해 사용되는 도구가 동기화 객체(Synchronization Primitives)이다.대표적인 동기화 객체로는 뮤텍스(Mutex), 세마포어(Semaphore), 스핀락(Spin Lock)이 있으며,각각의 특징과 사용 목적은 다르다.뮤텍스 (Mutex)뮤텍스는 Mutual Exclusion의 줄임말로, 단일 자원에 대해 하나의 스레드만 접근할 수 있도록 제한한다.lock()과 unlock()으로 자원 접근을 제어한다.락을 획득한 스레드만 해제할 수 있는 소유 개념이 존재한다.다른 스레드가 락을 요청하면 커널이 해당 스레드를 대기 상태로 전환시킨다.일반적으로 임계영역..
데드락(Deadlock)이란?
데드락(Deadlock)이란?멀티프로세스나 멀티스레드 환경에서 여러 실행 흐름이 자원을 점유한 채 서로가 가진 자원을 기다리며 영원히 진행되지 못하는 상태를 데드락(Deadlock)이라고 한다.예를 들어, 스레드 A가 자원 X를 점유한 상태에서 자원 Y를 기다리고, 스레드 B가 자원 Y를 점유한 상태에서 자원 X를 기다리는 상황이면 두 스레드는 서로를 기다리며 영원히 멈춰버리게 된다.데드락 예시 코드#include #include #include pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;void* task1(void*) { pthread_mutex_lock(&lo..
임계영역(Critical Section) 이란?
임계영역(Critical Section)이란?멀티스레드 혹은 멀티프로세스 환경에서는 여러 실행 흐름이 동시에 동일한 자원에 접근할 수 있다. 이때, 공유 자원을 동시에 수정하거나 읽으면 예기치 못한 결과나 충돌이 발생할 수 있다. 이러한 문제를 방지하기 위해 등장한 개념이 임계영역(Critical Section)이다.임계영역이란, 공유 자원에 접근하는 코드 영역 중 동시에 하나의 실행 흐름만 진입할 수 있도록 보호되어야 하는 부분을 말한다.예시다음은 두 개의 스레드가 동시에 하나의 전역 변수 counter를 증가시키는 코드이다.#include #include int counter = 0;void* increment(void* arg) { for (int i = 0; i 위 코드는 두 개의 스레드가..