목록2025/05 (5)
빙응의 공부 블로그

📝서론 이제까지 쓰레드를 중심으로 병행 프로그램을 설명하였다. 인터넷 서버에서는 다른 스타일로 병행 프로그래밍을 하기도 한다. 이런 스타일을 이벤트 기반의 병행성이라고 부른다.예를 들어보면 node.js나 스프링의 WebFlux 같은 것들이다. 물론 시작점은 C와 유닉스 시스템이다. 핵심 질문 : 어떻게 스레드 없이 병행 서버를 개발할까? 📝기본 개념 : 이벤트 루프우리가 다룰 이벤트 기반 병행성은 특정 사건(이벤트)의 발생을 대기한다. 즉 사건이 발생하면, 사건의 종류를 파악한 후 I/O를 요청하고 추후 처리를 위해 다른 이벤트를 발생시킨다. 이게 전부다. 이제 이벤트 루프에 대해 알아보자while (1) { events = getEvents(); for (e in events) { proce..

📝서론 우리는 그동안 교착 상태에 초점을 맞춰서 오류를 해결했다.핵심 질문 : 일반적인 병행성 관련 오류들은 어떻게 처리하는가? 📝비 교착 상태 오류 원자성 위반 오류 "다수의 메모리 참조 연산들 간에 있어 예상했던 직렬성이 보장되지 않았다." 즉 코드의 일부에 원자성이 요구되었으나, 실행 시에 그 원자성이 위반되었다는 오류이다. 해결방법은 간단하게도, 락을 추가하여 원자성이 보장되어야 하는 부분에 락 변수를 획득하도록 하면 된다. 순서 위반 오류 "두 개의(그룹의) 메모리 참조 간의 순서가 바뀌었다."즉, A가 항상 B보다 먼저 실행되어야 하지만 실행 중에 그 순서가 지켜지지 않았다.해결방법은 또한 간단하다. 순서를 강제하면 된다. 컨디션 변수를 사용하면 된다. 📝교착 상태 오류 앞서 다룬 병..

📝서론 다양한 범주의 병행성 문제 해결을 위해서는 락과 조건 변수가 모두 필요하다.이번 장에서는 세마포어라는 동기화 기법을 알아보자 핵심 질문: 세마포어를 어떻게 사용하는가 락과 컨디션 변수 대신에 세마포어를 사용하는 방법은 무엇인가?세마포어의 정의는 무엇인가?이진 세마포어는 무엇인가?락과 컨디션 변수를 사용하여 세마포어를 만드는 것이 가능한가?그 반대로 세마포어를 사용하여 락과 조건 변수를 만드는 것이 가능한가? 📝세마포어 : 정의세마포어는 정수 값을 갖는 객체로서 두 개의 루틴으로 조작할 수 있다. POSIX 표준에서 이 두개의 루틴은 sem_wait()과 sem_post()이다. 세마포어는 초기값에 의해 동작이 결정되기에 사용전에 제일 먼저 값을 초기화해야한다. #include sem_ts..

📝서론 지금까지 락의 개념을 학습하면서 하드웨어와 운영체제의 적절한 지원을 통해 제대로된 락을 만드는 법을 알아보았다. 쓰레드가 계속 진행하기 전에 어떤 조건이 참인지 검사해야 하는 경우가 많다.예를 들어 부모 쓰레드가 작업을 시작하기 전에 자식 쓰레드가 작업을 끝냈는지 검사하기를 원할 수 있다.이런 경우 부모 쓰레드가 특정 조건이 참이 될때까지 잠자면서 기다리는 방법을 선택한다. 그렇다면 조건을 기다리는 법은 무엇일까?조건이 참이 될 때까지 회전을 하며 기다리는 것이 간단하지만 CPU 사이클 낭비가 심하다. 📝정의와 루틴들조건이 참이 될 때까지 기다리기 위해 컨디션 변수를 활용할 수 있다.컨디션 변수는 일종의 큐 자료 구조로서, 어떤 실행의 상태가 원하는 것과 다를 때 조건이 참이 되기를 기다리는 ..

📝서론 병행성에 대한 소개 이후 병행 프로그램의 근본적인 문제 몇 개를 살펴보았다. 여러 개의 명령어들을 원자적으로 실행해보고 싶지만 단일 프로세스의 인터럽트로 인해서 그렇게할 수 없다. 이 장에서는 임계 구역에서 상호 배제를 할 수 있는 것 중 하나인락(Lock)에 대해 알아보자 📝락 : 기본 개념예제를 위해 다음과 같은 임계 영역이 있다고 하자. 전형적인 예제인 공유 변수 갱신이다.banlance = balance + 1; 락은 하나의 변수로 사용한다. 이 락 변수는 락의 상태를 나타내며 사용 가능 상태 & 사용 중 상태가 있다.lock_t mutex; // 글로벌 변수로 선언된 락lock(&mutex);balance = balance + 1;unlock(&mutex); 📌 Pthread 락쓰레..