Operating Systems: Three Easy Pieces - Concurrency Bugs

많은 사람들이 오랜 시간 동안 동시성 버그에 대해 시간과 노력을 들여 연구해 왔습니다. 대부분 교착 상태에 초점이 맞춰졌고, 이는 이전 장에서도 언급했듯 이번 장에서 더 깊이 다룰 것입니다. 이번에는 하드웨어와 밀접한 설명이 많아 c로 진행합니다. What Types Of Bugs Exist 다음 4가지 주요 오픈 소스 애플리케이션에 초점을 두고 예시를 들어 봅시다. MySQL (인기 있는 데이터베이스 관리 시스템) Apache (잘 알려진 웹 서버) Mozilla (유명한 웹 브라우저) OpenOffice (일부 사람들이 실제로 사용하는 MS Office 제품군의 무료 버전) 다음은 Lu와 그의 동료들이 연구한 버그 요약본입니다. ...

May 6, 2026 · 14 min · DSeung001

Operating Systems: Three Easy Pieces - Semaphores

동시성 문제를 해결하기 위해 cv, lock을 추가했죠. 이제는 다익스트리아가 도입한 세마포어에 대해 알아봅시다. 세마포어의 핵심은 다음과 같습니다 원자적 정수 변수: 세마포어 값은 중단 없이 한 번에 변경되어야 합니다. 카운팅 기능: 0 또는 1만 갖는 바이너리 세마포어(뮤텍스와 유사)와 0 이상의 정수 값을 가지는 카운팅 세마포어가 있습니다. 동기화: 자원이 없으면 프로세스는 대기(block)하고, 자원이 생기면 깹니다 세마포은 동시성을 관리하는 논리적 제어장치 또는 충돌을 방지하는 메커니즘입니다. Semaphores: A Definition 세마포어는 두 개의 루틴을 조작할 수 있는 정수 값을 가진 객체입니다. 초기 값이 동작을 결정하기 때문에 다른 루틴을 호출하여 상호작용이 생기기 전에 초기화가 필요합니다. ...

May 5, 2026 · 14 min · DSeung001

Operating Systems: Three Easy Pieces - Condition Variables

아쉽게도 lock만으로는 동시 프로그램을 구축하는 데 제약이 있습니다. 특히 스레드가 실행을 계속하기 전에 조건이 참인지 확인을 하고 싶어하는 경우가 많은 데, 이를 해결할 때 부족한점이 보이죠. 예를 들어 부모 스레드는 자식 스레드가 완료되었는 지 여부를 확인하고 싶을 수 있죠.(이를 join으로 부르기도 합니다.) import threading def child(): print("child") # XXX how to indicate we are done? def main(): print("parent: begin") t = threading.Thread(target=child) t.start() # XXX how to wait for child? print("parent: end") if __name__ == "__main__": main() 위 코드는 실행하면 아래처럼 부모가 먼저 끝날 수 있습니다. ...

May 4, 2026 · 14 min · DSeung001

Operating Systems: Three Easy Pieces - Lock-based Concurrent Data Structures

Lock을 다음 주제로 넘어가기 전에 일반 데이터 구조에 Lock을 얹어 쓰는 방법을 다룹니다. 모든 상황에 두루 통하는 방법을 찾기 어렵기 때문에 시나리오별로 나누어 살펴봅니다. 이번 챕터는 자료 구조라서 학습을 위해 파이썬(표준 라이브러리 threading)으로 같은 패턴을 옮겨 적습니다. Concurrent Counters 가장 단순한 데이터 구조 중 하나가 카운터입니다. 특정 값을 카운트하는 자료 구조로, 간단하게는 아래처럼 표현할 수 있습니다. class Counter: def __init__(self): self.value = 0 def increment(self): self.value += 1 def decrement(self): self.value -= 1 def get(self): return self.value 위 코드에 lock과 동시성을 추가해서 멀티스레드로 돌려봅시다. ...

May 2, 2026 · 10 min · DSeung001

Operating Systems: Three Easy Pieces - Locks

동시성 프로그래밍에서 일련의 명령을 원자적으로 실행하고 싶지만, 단일 또는 멀티 프로세스에서 멀티 스레드 환경을 도입시 프로세서에서의 인터럽트가 발생하기 때문에 그렇게 할 수 없죠, 그래서 이장에서 Lock을 도입하여 문제를 해결합니다. 해당 글에서도 c가 아닌 python으로 코드를 적습니다.(컨샙이나 이해부분을 위해 OSTEP를 보는 것이죠) 하지만 포인터 개념이 필요한 경우 c 코드를 참고합니다. Locks: The Basic Idea Lock의 기본 아이디어를 간단한 예제로 살펴보겠습니다. 잔고를 업데이트하는 코드입니다. 다음 명령어를 여러 스레드가 동시에 수행하면 스레드 컨텍스트 스위칭 타이밍에 따라 레이스 컨디션이 발생할 수 있습니다. (한 줄로 보여도 내부적으로는 값 읽기, 계산, 할당이 이뤄지는 복합적인 명령이기 때문입니다.) ...

April 30, 2026 · 16 min · DSeung001

Operating Systems: Three Easy Pieces - Thread API

교재에서는 c의 POSIX을 기반으로 진행되고 있고 Python을 공부 중이므로 Python의 threading로 해당 글을 진행합니다. threading 모듈은 OS의 저수준 스레딩 기능 위에 구축된 객체 지향 API로 Unix 계얼에서는 POSIX Thread(pthreads) 라이브러리를 기반으로 동작합니다. Thread Creation 파이썬에서는 threading.Thread 객체를 만들어 스레드를 생성합니다. 핵심은 “어떤 함수를 어떤 인자로 실행할지"를 스레드 객체에 넘기고, start()로 실행을 시작하는 흐름입니다. import threading def worker(name, count): for i in range(count): print(f"[{threading.current_thread().name}] {name}: {i}") # target: 새 스레드에서 실행할 함수 # args: target 함수에 전달할 인자 튜플 t1 = threading.Thread(target=worker, args=("A", 3), name="Thread-A") t2 = threading.Thread(target=worker, args=("B", 3), name="Thread-B") t1.start() t2.start() threading.Thread(...) 호출은 내부적으로 Thread.__init__(...) 인자와 매핑이 되죠죠 ...

April 29, 2026 · 13 min · DSeung001