Skip to main content

Command Palette

Search for a command to run...

멀티태스크와 액터 모델

Updated
2 min read

멀티태스크

협조적/비협조적 멀티태스크

선점: 프로세스와의 협조 없이 수행하는 컨택스트 스위칭이라고는 하나, 결국 뺏어오는 게 가능하냐의 문제다.

협조적 멀티태스크(비선점형, cooperative): 각각의 프로세스가 자발적으로 컨택스트 스위칭을 수행하는 멀티태스크 방식.

장점: 멀티태스크 매커니즘을 구현하기 쉽다.

단점: 프로세스가 자발적으로 컨텍스트 스위칭을 해야하는데, 만약 버그가 발생하여 프로세스가 무한 루프에 빠지거나 정지하게 되면 그 프로세스는 계산 리소스를 점유하게 된다.

비협조적 멀티태스크(선점형, preemptive): 프로세스와 협조 없이 외부적인 작동에 따라 컨택스트 스위칭을 수행하는 멀티태스크 방식

장점: 비선점형에서 나타날 수 있었던 무한 루프나 블로킹 함수와 관련된 문제가 일어나지 않는다.

단점: 처리 시스템 구현이 어려울 수 있고, 공평성을 확보하기 위해 빈번하게 컨택스트 스위칭을 수행하게 되면 비선점형에 비해 다소 오버헤드가 있을 수 있겠다.

여기서 공평성이란 무엇인가? 공평성은 두 가지 정의가 있는데

약한 공평성: 어떤 실행 환경이 약한 공평성을 만족한다 <=> 어떤 프로세스가 특정 시각 이후 실행 가능한 대기 상태가 되었을 때 그 프로세스가 실행된다.

강한 공평성: 어떤 실행 환경이 강한 공평성을 만족한다. <=> 어떤 프로세스가 특정 시각 이후 실행 가능한 대기 상대와 실행 불가능한 대기 상태의 전이를 무한히 반복할 때 최종적으로 그 프로세스는 실행된다.

풀어서 설명하면 약한 공평성어떤 프로세스가 계속해서 실행 가능한 상태에 있다면 언젠가는 실행된다, 강한 공평성은 보다 강한 조건으로 단순히 언젠가 실행되는 것이 아니라 지속적으로 공정한 실행 기회를 보장받는다고 해석할 수 있다.

그린 스레드

그린 스레드란 유저랜드의 소프트웨어가 독자적으로 제공한 스레드 매커니즘을 뜻한다. 그러니까 OS가 아닌 런타임 라이브러리나 VM에 의해 스케줄링되는 스레드라고 할 수 있다. 반대되는 개념으로 네이티브 스레드가 있다.

액터 모델

액터 모델이란 동시성 프로그래밍을 위한 수학적 모델인데, 액터라는 독립적인 계산 단위라는 개념이 존재하고, 액터는 각자의 상태와 행동을 가진다.

액터 모델은 비동기, 동시성 처리를 가능하게 하는 모델인데, 객체 지향에서 모든 것은 객체다 라고 생각하는 것처럼 액터 모델에선 모든 것을 액터로 취급한다.

각 액터는 메시지 큐를 가지고 있고 이를 경유하여 데이터를 송수신한다.

좀 더 자세히 알아보자면

액터는 다음 세 가지 요소로 구성된다.

  • Behavior

  • State

  • Mailbox

액터 간에는 메시지를 주고 받을 수 있고, 독립적인 메모리 공간을 갖는다. 액터는 다른 액터에게 메시지를 보내는 방법으로만 영향을 미칠 수 있기 때문에, 스레드에서 공통으로 접근하는 값이 변경되어 다른 스레드에 영향을 미칠 수 있는 것과 대비된다.

메시지 처리의 과정을 살펴보면,

  1. Main문에서 액터를 지정해 메시지를 보내면

  2. 해당 액터의 수신함에 메시지가 들어가고

  3. 수신한 액터는 이벤트가 발생해

  4. 받은 순서대로 메시지를 확인한다.

  5. 그리고 액터는 수신한 메시지에 따라 행동을 결정하여 실행한다.

여기서 상태(State)는 액터 자신만 변경 가능하다. 그리고 메시지를 수신받은 액터가 취할 수 있는 행동은

  • 자신의 상태 변경

  • 자식 액터 생성 및 제거

  • 다른 액터에 메시지 전송 등이 있다.

액터 간의 상호작용을 나타낸 그림인데, 결과적으로 말하고자 하는 것은

  1. 메모리를 공유하지 않고

  2. 메시지로만 상호작용하기 때문에 동시성 처리에서 비교적 덜 머리아프게(?) 문제를 해결할 수 있다는 것이다.

참고자료

아주 잘 정리된 블로그

관련 논문

More from this blog

락프리 데이터 구조와 알고리즘

여기서는 락프리 데이터 구조를 설명한다. 락프리(lock-free) 란 배타락을 이용하지 않고 처리를 수행하는 데이터 구조 및 그에 대한 조작 알고리즘을 총칭한다. 왜 락프리인가? 전통적인 동시성 제어 방법인 뮤텍스나 세마포어는 여러 문제점을 가지고 있다: 성능 저하: 락 경합(lock contention)으로 인한 대기 시간 데드락: 여러 스레드가 서로의 락을 기다리는 상황 우선순위 역전: 낮은 우선순위 스레드가 높은 우선순위 스레드를 ...

Jul 27, 20257 min read121

소프트웨어 트랜잭셔널 메모리

소프트웨어 트랜잭셔널 메모리 동시성 프로그래밍에서 공유 자원에 대한 안전한 접근은 항상 중요한 과제다. 전통적으로 뮤텍스 락과 같은 비관적 락(Negative Lock) 방식을 사용해왔다. 이 방식은 크리티컬 섹션에 진입하기 전에 반드시 락을 획득해야 하며, 락을 얻지 못하면 코드 실행 자체가 블록된다. 하지만 이와는 다른 접근 방식이 있다. 바로 낙관적 락(Optimistic Lock) 방식인데, 이는 "일단 실행하고 나중에 검증하자"는 철학...

Jul 20, 202517 min read262

공평한 배타 제어

공평한 배타 제어 여기서는 공평한 배타 제어에 대해 설명한다. 먼저 컨텐션(contention) 이라는 개념을 이해할 필요가 있다. 컨텐션이란 여러 스레드가 동시에 같은 락을 획득하려고 경쟁하는 상황을 말한다. 컨텐션이 높을수록 스레드들이 락을 기다리는 시간이 길어지고 성능이 저하된다. 이러한 컨텐션 상황은 시스템 아키텍처에 따라 더욱 복잡해질 수 있다. 특히 비균일 메모리 접근(Non-Uniform Memory Access, NUMA) 와 같...

Jul 13, 20259 min read21

KernelSnitch[논문 리뷰]

Paper 1. Intro 이 글은 NDSS 2025에서 발표된 KernelSnitch 논문을 소개이다. 이 연구는 커널의 평범한 데이터 구조체들이 가진 본질적인 특성이 어떻게 심각한 보안 취약점이 되는지를 보여준다. 핵심은 이러하다: "데이터 구조체의 크기에 따른 접근 시간 차이를 이용해 커널의 비밀 정보를 유출할 수 있다" 여기서는 커널 힙 포인터 유출에 집중해서 설명한다. 이 공격이 성공하면 KASLR을 우회하고 더 심각한 커널 익스플로...

Jul 11, 20257 min read128
M

MaxLog

35 posts