다중스레드화를 위한 스레드 대수와 폴리스레딩

** 본 논문은 기본 스레드 대수(BTA)에 스레드 조각(fragment)들을 순차적으로 연결하는 최소 메커니즘인 폴리스레딩(poly‑threading)을 도입한다. 자동·비자동 선택 방식을 모두 지원하며, 이를 ACP(Algebra of Communicating Processes)와 연계해 프로세스 관점에서 해석한다. 또한 조각화된 프로그램의 실행 구조를 설명하는 분석 실행 아키텍처와, 비분산·분산 다중스레딩 상황에서의 인터리빙 모델을 제…

저자: J. A. Bergstra, C. A. Middelburg

** 이 논문은 순차 프로그램이 실행될 때 나타나는 행동을 ‘스레드(thread)’라는 형식적 객체로 모델링하는 기본 스레드 대수(Basic Thread Algebra, BTA)를 출발점으로 한다. BTA는 기본 행동 집합 A와 내부 행동 τ를 전제로 하며, 스레드는 `D`(deadlock), `S`(termination), 그리고 조건부 연산 `E_a`(a∈A∪{τ}) 로 구성된다. `E_a(p,q)`는 행동 a를 수행하고, 서비스가 반환하는 Boolean 응답에 따라 p 또는 q 로 전이한다. `τ`는 언제나 긍정 응답을 주는 내부 행동으로, `x E_τ y = τ ◦ x` 라는 단일 공리만을 가진다. BTA는 기본적으로 유한 스레드만을 표현하지만, guarded recursion을 도입해 무한 스레드도 기술한다. Guarded 재귀식 `X = t_X`(t_X은 D, S, 혹은 `t E_a t'` 형태) 에 대해 고유 해를 `⟨X|E⟩` 로 나타내고, 두 공리 RDP와 RSP를 통해 재귀 해를 전개한다. 다음으로, 스레드와 외부 서비스 간의 상호작용을 다루는 ‘use’ 연산자 `/f` 를 소개한다. 서비스는 메서드 집합 M과 포커스 F 로 정의된 함수 `H: M⁺ → {T,F,B}` 로 모델링되며, `f.m` 형태의 기본 행동은 서비스 f 에 메서드 m 을 요청한다. 서비스가 응답을 반환하면, 해당 행동은 내부 행동 τ 로 변환되고, `E_f.m` 연산은 응답에 따라 두 스레드 중 하나로 전이한다. 이 메커니즘을 통해 스레드가 환경과 통신하는 과정을 형식적으로 기술한다. 본 논문의 핵심 기여는 프로그램이 조각(fragment)들로 나뉘어 실행되는 상황을 모델링하기 위해 BTA에 ‘폴리스레딩(poly‑threading)’이라는 최소 메커니즘을 추가한 것이다. 이를 위해 새로운 정렬 TV(스레드 벡터)를 도입하고, 다음과 같은 연산들을 정의한다. * `S_i` (i∈ℕ) – 내부 제어에 의해 선택되는 스위치‑오버 라벨. * `E` – 외부 제어에 의해 선택되는 스위치‑오버 라벨. * `⊳⊲ : T × TV → T` – 폴리스레딩 연산. 첫 번째 인자는 현재 실행 중인 스레드 p, 두 번째는 스레드 벡터 ⟨p₁,…,pₙ⟩. * `⊕_k : T × … × T → T` – k‑ary 외부 선택 연산. 스레드 벡터는 `hi`(빈 벡터), `⟨p⟩`(단일 벡터), `v ⊕ w`(연결) 로 구성된다. 폴리스레딩 연산의 동작은 다음과 같다. 현재 스레드 p 가 종료될 때, 1. `p` 가 `S` 로 종료하면 전체 연산도 종료한다. 2. `p` 가 `S_i` 로 종료하면, i가 1…n 범위에 있으면 `⊳⊲(p_i, ⟨p₁,…,pₙ⟩)` 로 전이하고, 범위를 벗어나면 deadlock(`D`). 3. `p` 가 `E` 로 종료하면, 외부 선택 연산 `⊕_k` 로 정의된 k개의 후보 중 하나를 외부 환경이 선택한다. 이 메커니즘은 프로그램 조각들이 순차적으로 혹은 외부 조건에 따라 전환되는 가장 단순한 형태의 시퀀싱을 제공한다. 또한, 각 스레드가 시작될 때마다 서비스 `tls` 를 초기화하고 메서드 `init` 을 호출하도록 가정함으로써, 조각 간 상태 초기화 비용을 명시적으로 모델링한다. 다음 단계에서는 폴리스레딩이 확장된 BTA를 ACP with conditions(ACPc)와 연결한다. ACPc는 조건부 전이와 동기화 연산을 포함하는 프로세스 대수이며, BTA의 `E_a` 연산은 ACPc의 조건부 선택으로 변환될 수 있다. `use` 연산은 서비스와의 통신을 ACPc의 `τ`‑숨김과 동기화 연산으로 재해석한다. 이를 통해 스레드와 서비스가 모두 ACPc의 프로세스로 표현 가능함을 증명하고, 기존 프로세스 대수와의 호환성을 확보한다. 분석 실행 아키텍처(analytic execution architecture)는 조각화된 프로그램이 실제 실행 환경에서 어떻게 동작하는지를 설명한다. 기존의 단일 스레드 아키텍처를 확장해, 각 조각이 시작될 때마다 `tls` 서비스가 초기화되고 `init` 메서드가 호출된다. 이렇게 하면 조각 간에 공유 상태가 명시적으로 관리되며, 서비스 초기화 비용을 정량화할 수 있다. 마지막으로, 다중스레딩 상황을 두 가지로 구분한다. * **비분산 다중스레딩** – 하나의 물리적 CPU 위에서 여러 스레드가 전략적 인터리빙(strategic interleaving) 방식으로 교차 실행된다. 라운드‑로빈, 우선순위 기반 등 다양한 스케줄링 전략을 수식적으로 정의하고, 각 스레드의 전이는 `⊳⊲` 연산과 결합해 표현한다. * **분산 다중스레딩** – 스레드들이 서로 다른 노드에서 실행될 수 있음을 가정하고, 네트워크 지연·메시지 전달을 `τ`‑숨김과 통신 연산으로 모델링한다. 폴리스레딩 연산은 이러한 분산 인터리빙 모델에 그대로 삽입될 수 있어, 조각화된 프로그램이 분산 환경에서도 일관된 동작을 보장한다. 결론적으로, 논문은 프로그램 조각화라는 실용적 문제를 형식론적으로 다루면서, 기본 스레드 대수에 최소한의 확장을 가해 자동·비자동 선택을 모두 지원하는 폴리스레딩 메커니즘을 제시한다. 또한, 이를 ACPc와 연결해 프로세스 대수와의 호환성을 확보하고, 분석 실행 아키텍처와 다중·분산 인터리빙 모델을 통해 실제 시스템 설계·검증에 적용 가능한 포괄적 이론을 제공한다. **

원본 논문

고화질 논문을 불러오는 중입니다...

댓글 및 학술 토론

Loading comments...

의견 남기기