Syncronization Algorithms

Syncronization Algorithms 동기화 알고리즘은 병행 시스템에서 **상호 배제(Mutual Exclusion)**를 보장하기 위한 핵심 메커니즘이다. 데커 알고리즘 (Dekker’s Algorithm) 목적: 2개 프로세스의 상호 배제 메커니즘: flag 배열(진입 의사) + turn 변수(진입 순서) 교착 상태 방지를 위한 플래그 재설정과 턴 변경 예시: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class DekkerLock: def __init__(self): # 각 프로세스의 진입 시도를 나타내는 플래그 self.flag = [False, False] # 현재 임계 영역을 사용할 차례인 프로세스 번호 self.turn = 0 def lock(self, process_id): other = 1 - process_id # 다른 프로세스의 ID # 진입 시도 표시 self.flag[process_id] = True # 다른 프로세스가 진입 시도 중이면 대기 while self.flag[other]: if self.turn != process_id: # 자신의 차례가 아니면 진입 시도 포기 self.flag[process_id] = False # 자신의 차례가 될 때까지 대기 while self.turn != process_id: pass # 다시 진입 시도 self.flag[process_id] = True def unlock(self, process_id): # 차례를 다른 프로세스에게 넘김 self.turn = 1 - process_id # 진입 시도 표시 해제 self.flag[process_id] = False 피터슨 알고리즘 (Peterson’s Algorithm) 목적: 2개 프로세스의 간단한 상호 배제 메커니즘: ...

October 5, 2024 · 4 min · Me

Process vs Thread vs Coroutine

Process vs. Thread vs. Coroutine Process, Thread, Coroutine은 모두 프로그램 실행의 단위이지만, 각각 다른 특성과 용도를 가지고 있다. Process: 독립적인 실행 단위로, 자체 메모리 공간과 시스템 자원을 가진다. 다른 프로세스와 완전히 격리되어 있어 안정성이 높다. 생성과 전환에 많은 비용이 든다. Thread: 프로세스 내부의 실행 단위로, 같은 프로세스의 다른 스레드와 메모리를 공유한다. 프로세스보다 가볍고, 생성과 전환 비용이 적다. 동시성을 제공하지만, 동기화 문제에 주의해야 한다. Coroutine: 경량 스레드라고도 불리며, 스레드 내에서 실행되는 협력적 멀티태스킹 단위. 매우 가볍고, 생성과 전환 비용이 매우 적다. 비동기 프로그래밍을 단순화하고, 동시성을 효율적으로 관리한다. Process, Thread, Coroutine의 관계는 다음과 같이 계층적으로 표현할 수 있다: CPU > Core > Process > Thread > Coroutine ...

October 6, 2024 · 3 min · Me

Multithreading vs. Multiprocessing vs Multitasking

Multithreading vs. Multiprocessing vs. Multitasking Multithreading, Multiprocessing, Multitasking은 컴퓨터 시스템에서 동시성과 병렬성을 구현하는 세 가지 주요 개념이다. Multitasking은 단일 CPU에서 여러 작업(프로세스)을 동시에 실행하는 것처럼 보이게 하는 기술이다. 실제로는 CPU가 매우 빠르게 여러 작업 간을 전환하면서 실행한다. 목적: CPU 사용률을 최대화하고 사용자에게 여러 프로그램이 동시에 실행되는 것 같은 환상을 제공한다. 구현: 시분할(time-sharing) 방식을 사용하여 각 작업에 CPU 시간을 할당한다. Multithreading은 하나의 프로세스 내에서 여러 실행 흐름(스레드)을 동시에 처리하는 기술이다. 목적: 단일 프로세스의 성능을 향상시키고 자원을 효율적으로 사용한다. 특징: 스레드들은 같은 프로세스 내의 메모리와 자원을 공유한다. Multiprocessing은 여러 개의 프로세서(또는 코어)를 사용하여 여러 작업을 실제로 동시에 처리하는 기술이다. ...

October 5, 2024 · 2 min · Me

Process vs Thread

Process vs. Thread 프로세스: 독립적인 실행 단위로, 자체 메모리 공간과 시스템 자원을 가진다. 다른 프로세스와 완전히 격리되어 있어 안정성이 높다. 생성과 전환에 많은 비용이 든다. 스레드: 프로세스 내부의 실행 단위로, 같은 프로세스의 다른 스레드와 메모리를 공유한다. 프로세스보다 가볍고, 생성과 전환 비용이 적다. 동시성을 제공하지만, 동기화 문제에 주의해야 한다. https://www.geeksforgeeks.org/thread-in-operating-system/ Process vs. Thread 특성 Process Thread 정의 실행 중인 프로그램의 인스턴스 프로세스 내에서 실행되는 더 작은 실행 단위 메모리 공간 독립적인 메모리 공간 (코드, 데이터, 스택, 힙) 프로세스의 메모리 공간 공유 (코드, 데이터, 힙), 독립적인 스택 구성 요소 - 코드 영역 - 데이터 영역 - 스택 영역 - 힙 영역 - 스레드 ID - 프로그램 카운터 - 레지스터 집합 - 스택 자원 공유 다른 프로세스와 자원 공유 안 함 같은 프로세스 내 스레드 간 자원 공유 생성 비용 높음 낮음 컨텍스트 스위칭 비용이 큼 비용이 적음 (같은 프로세스 내에서) 안정성 높음 (한 프로세스의 오류가 다른 프로세스에 영향 없음) 상대적으로 낮음 (한 스레드의 오류가 전체 프로세스에 영향) 통신 프로세스 간 통신(IPC) 필요 (복잡하고 오버헤드 큼) 쉽고 빠른 통신 (공유 메모리 사용) 병렬 처리 가능하지만 오버헤드 큼 효율적인 병렬 처리 가능 메모리 구조 비교 메모리 영역 Process Thread 코드 영역 독립적 공유 데이터 영역 독립적 공유 힙 영역 독립적 공유 스택 영역 독립적 각 스레드마다 독립적 특성 상세 비교 특성 Process Thread 독립성 완전히 독립적 부분적으로 독립적 자원 공유 제한적 (IPC 필요) 쉽게 공유 가능 오류 영향 다른 프로세스에 영향 없음 같은 프로세스의 모든 스레드에 영향 동기화 필요성 낮음 - IPC 메커니즘 필요 공유 자원에 대한 동기화 필요 - 뮤텍스, 세마포어 등 사용 생성 시간 더 오래 걸림 더 빠름 종료 시간 더 오래 걸림 더 빠름 장단점 비교 구분 Process Thread 장점 - 높은 안정성 - 다른 프로세스의 영향 받지 않음 - 보안성이 높음 - 생성/종료가 빠름 - 자원 공유가 쉬움 - 통신 비용이 적음 단점 - 많은 시스템 자원 필요 - 프로세스 간 통신이 복잡 - 컨텍스트 스위칭 비용이 큼 - 동기화 문제 발생 가능 - 디버깅이 어려움 - 하나의 스레드 문제가 전체에 영향 사용 사례 비교 용도 Process 선호 Thread 선호 웹 서버 안정성이 중요한 경우 높은 동시성이 필요한 경우 GUI 앱 독립적인 작업이 많은 경우 반응성이 중요한 경우 데이터 처리 대용량 병렬 처리 데이터 공유가 많은 경우 시스템 서비스 격리가 필요한 경우 빈번한 통신이 필요한 경우 활용 예 - 독립적인 애플리케이션 - 웹 브라우저의 각 탭 - 다중 사용자 서버 - 웹 서버 요청 처리 - 게임 엔진 (렌더링, 물리 연산) - 멀티미디어 애플리케이션 동기화 메커니즘 비교 메커니즘 Process Thread 공유 메모리 명시적으로 설정 필요 기본적으로 공유 뮤텍스 프로세스 간 뮤텍스 필요 프로세스 내 뮤텍스 사용 세마포어 시스템 세마포어 필요 프로세스 내 세마포어 사용 메시지 전달 IPC 메커니즘 사용 직접 메모리 접근 이러한 차이점들을 이해하고 적절히 활용하면, 상황에 맞는 최적의 실행 단위를 선택할 수 있다. ...

October 5, 2024 · 3 min · Me

코루틴(Coroutine)

코루틴 (Coroutine) 코루틴 (Coroutine) 은 복잡한 비동기 작업을 간단하고 효율적으로 처리할 수 있게 해주는 프로그래밍 개념이다. 프로그램의 실행 흐름을 제어할 수 있는 프로그래밍 구성 요소이다. 일반적인 함수와 달리, 코루틴은 실행을 일시 중단하고 재개할 수 있으며, 여러 진입점과 종료점을 가질 수 있다. 이는 마치 대화하는 것처럼, 실행을 주고받을 수 있다는 특징이 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 # Python에서의 간단한 코루틴 예제 async def simple_coroutine(): print("코루틴 시작") await asyncio.sleep(1) # 중단점 print("1초 후 재개") await asyncio.sleep(1) # 다른 중단점 print("또 1초 후 재개") # 코루틴 실행 async def main(): await simple_coroutine() asyncio.run(main()) https://medium.com/@turxan.dunya97/simple-explanation-what-is-coroutines-in-programming-d01e0ddf6f06 ...

October 5, 2024 · 29 min · Me

Thread

스레드의 기본 개념과 프로세스와의 차이점 설명. 멀티스레딩의 장점과 주요 구현 방식(POSIX Threads, Windows Threads). 유사 기술: 멀티프로세싱, 비동기 처리. Thread Thread는 프로그램 실행의 기본 단위로, 프로세스 내에서 실행되는 독립적인 작업 흐름을 의미한다. 하나의 프로세스는 여러 개의 Thread를 가질 수 있으며, 이들은 프로세스의 자원을 공유한다. Source: https://blog.devgenius.io/program-process-and-thread-explained-in-one-minute-6016e4fdf4de Thread의 구성 요소 Thread는 다음과 같은 구성 요소를 가진다: 프로그램 카운터 레지스터 집합 스택 공간 Thread ID 이러한 요소들은 각 Thread의 독립적인 실행을 가능하게 한다. Thread의 특징 경량성: Thread는 프로세스에 비해 생성과 관리가 더 빠르고 효율적이다. 자원 공유: 같은 프로세스 내의 Thread들은 코드, 데이터, 파일 등의 자원을 공유한다. 병렬 실행: 멀티코어 시스템에서는 여러 Thread가 실제로 동시에 실행될 수 있다. 기능과 역할 기능 역할 장점 병렬 처리 - 동시에 여러 작업 수행 CPU 활용도 증가 - 성능 향상 - 응답성 개선 자원 공유 - 프로세스 자원 공유 - 효율적인 메모리 사용 - 메모리 절약 - 통신 비용 감소 비동기 처리 - 독립적인 작업 수행 - 이벤트 처리 - 응답성 향상 UI 처리 효율화 Thread의 종류 Thread는 크게 두 가지로 나눌 수 있다: ...

October 4, 2024 · 4 min · Me

Multithreading

멀티 쓰레딩 (Multithreading) Multithreading은 운영 체제에서 프로그램이 여러 작업을 동시에 수행할 수 있게 해주는 기능이다. 즉, 하나의 프로세스 내에서 여러 스레드가 동시에 실행되는 것을 의미하며, 각 스레드는 프로세스의 자원을 공유하면서도 독립적인 실행 경로를 가진다. 이는 단일 프로세스 내에서 여러 실행 흐름(스레드)을 생성하고 관리하며, 현대 컴퓨터 시스템의 성능과 효율성을 크게 향상시킨다. Source: https://www.geeksforgeeks.org/multithreading-in-operating-system/ 각 스레드는 자신만의 프로그램 카운터, 레지스터 집합, 스택을 가지고 있다. 하지만 같은 프로세스 내의 스레드들은 코드, 데이터 섹션, 파일과 같은 자원을 공유한다. 이는 프로세스보다 스레드의 생성과 컨텍스트 스위칭이 더 가벼운 이유가 된다. ...

October 4, 2024 · 2 min · Me

Mutex

Mutex Mutex(Mutual Exclusion) 는 공유 자원에 대한 접근을 동기화하는 객체. 한 번에 하나의 스레드만이 Mutex 를 소유할 수 있으며, 소유권 개념이 있어 Mutex 를 획득한 스레드만이 이를 해제할 수 있다. Source: https://www.geeksforgeeks.org/std-mutex-in-cpp/ 주요 특징 두 가지 상태 (잠김/열림) 를 가집니다. 한 번에 하나의 스레드만 소유할 수 있습니다. 소유한 스레드만이 잠금을 해제할 수 있습니다. Mutex 의 종류 일반 Mutex (Normal Mutex) 가장 기본적인 형태의 Mutex. 단순한 상호 배제 기능을 제공하며, 재진입이 불가능하다. 가장 빠른 성능을 제공하지만 우선순위 상속과 같은 고급 기능은 지원하지 않는다. ...

October 4, 2024 · 51 min · Me

조건 변수 (Condition Variable)

조건 변수 (Condition Variable) 조건 변수 (Condition Variables) 는 프로세스 동기화에서 중요한 역할을 하는 동기화 기본 요소로, 스레드가 특정 조건이 충족될 때까지 대기하도록 하는 메커니즘을 제공한다. 스레드가 특정 조건이 만족될 때까지 대기하고, 조건이 충족되면 다른 스레드가 대기 중인 스레드를 깨우는 데 사용된다. 뮤텍스와의 연관 조건 변수는 일반적으로 뮤텍스와 함께 사용된다. 뮤텍스는 조건을 원자적으로 검사하고 변경할 수 있도록 보장한다. 주요 연산 wait(): 스레드가 조건이 충족될 때까지 대기하도록 한다. signal()/notify_one(): 대기 중인 단일 스레드를 깨운다. broadcast()/notify_all(): 해당 조건 변수에서 대기 중인 모든 스레드를 깨운다. 사용 패턴 조건을 보호하는 뮤텍스를 획득한다. 조건을 테스트한다. 조건이 거짓이면 wait() 를 호출하여 대기한다. 조건이 참이면 작업을 수행하고 뮤텍스를 해제한다. 가짜 깨우기 (Spurious Wakeup) 가짜 깨우기는 조건 변수 (Condition Variable) 를 사용할 때 발생할 수 있는 현상이다. 스레드가 실제로 signal 이나 broadcast 를 받지 않았는데도 wait 상태에서 깨어나는 현상을 말한다. ...

October 4, 2024 · 32 min · Me

원자적 연산 (Atomic Operation)

원자적 연산 (Atomic Operation) 원자적 연산(Atomic Operation)은 멀티스레딩 환경에서 데이터의 일관성과 안전성을 보장하기 위한 중요한 개념으로, 상호 배제(Mutual Exclusion)를 구현하는 데 중요한 역할을 한다. 원자적 연산이란, 더 이상 쪼개질 수 없는 최소 단위의 연산을 의미하는데 중단되거나 간섭받지 않고 완전히 실행되는 연산을 말한다. 이는 마치 물리학에서 원자가 더 이상 쪼개질 수 없는 가장 작은 단위인 것처럼, 컴퓨터 과학에서도 더 이상 분할할 수 없는 가장 작은 실행 단위를 의미한다. 주요 특징 불가분성: 원자적 연산은 중간에 중단되거나 다른 프로세스에 의해 간섭받지 않는다. 일관성: 연산이 성공적으로 완료되거나 아예 실행되지 않는다. 가시성: 다른 스레드에서 원자적 연산의 결과를 즉시 확인할 수 있다. 원자적 연산의 중요성 데이터 무결성 보장: 여러 스레드가 동시에 같은 데이터에 접근할 때 발생할 수 있는 경쟁 조건(Race Condition)을 방지한다. 동기화 구현: 원자적 연산은 복잡한 동기화 메커니즘의 기본 구성 요소이다. 성능 향상: 락(Lock)과 같은 고수준의 동기화 메커니즘보다 더 가볍고 빠르다. 원자적 연산의 예시 읽기-수정-쓰기(Read-Modify-Write) 연산: ...

October 4, 2024 · 33 min · Me