토큰 직렬화 중
Serializing tokens![]() |
컴퓨터 과학에서 토큰을 직렬화하는 것은 DragonFly BSD의 지속적인 개발에서 발생하는 동시성 제어의 개념이다.Matthew Dillon에 따르면, SPL은 단일 CPU 도메인 내에서만 작동하는 반면 토큰은 여러 CPU에 걸쳐 작동한다는 점을 제외하면 SPL과 가장 유사하다.
토큰을 직렬화하면 프로그래머는 자신이나 동일한 토큰을 보유할 수 있는 모든 단일 엔터티를 인식할 필요가 있는 하위 하위 시스템 없이 멀티프로세서 안전 코드를 작성할 수 있다.
상호배제(뮤텍스)와의 비교
토큰과 상호 배제(뮤텍스) 메커니즘은 자물쇠다.토큰은 뮤텍스와 달리 차단되거나 절전 상태인 동안 다른 스레드가 리소스에 액세스하는 것을 배제하지 않는다.다른 스레드와 리소스를 공유하는 스레드는 다음과 같은 다양한 이유로 중지 및 시작할 수 있다.
- 타임라이싱: 사용자 공간(미국) 스케줄러는 모든 스레드가 실행될 수 있는 공정한 기회를 얻도록 하기 위해 노력하므로 각 스레드를 짧은 시간(타임라이스) 동안 실행한 후 다른 스레드로 전환한다.
- 동시 실행: 멀티프로세서 시스템에서 스레드는 다른 CPU의 다른 스레드와 정확히 동시에 실행될 수 있다.
- 선점: 스레드는 하드웨어 인터럽트 또는 경량 커널 스레드와 같이 우선순위가 낮은 스레드를 선점할 수 있다.
- 자발적 차단: 어떤 것을 기다려야 하거나, 할 일이 없거나, 차단하는 기능을 호출하는 경우 실이 잠길 수 있다.자물쇠를 따라는 전화도 막을 수 있다.
다음 표에는 토큰 및 뮤텍스의 속성이 요약되어 있다.
토큰 직렬화 중 | 뮤텍스 | |
---|---|---|
타임라이싱 | 작동하다 | 작동하다 |
동시 실행 | 작동하다 | 작동하다 |
선점 | 작동하다 | 작동하다 |
자발적 차단 | 실패하다 | 작동하다 |
교착 상태 방지 | 네 | 아니요. |
우선 순위 역전을 방지 | 네 | 아니요. |
교착상태나 우선순위 역전과 같은 문제는 피하기 매우 어려울 수 있으며, 커널의 여러 수준에서 조정이 필요하다.토큰으로 잠그는 것은 교착상태에 빠지지 않고, 취득한 토큰은 나중에 운영 블록을 할 때 원자일 필요가 없기 때문에 뮤텍스보다 훨씬 간단한 코드를 허용한다.
…FreeBSD-5를 보면 FreeB가 눈에 띈다.SD-5 패스는 교착 상태를 전환하거나 차단하거나 처리하기 위해 매우 심도 있는 절차적 레벨이 일시적으로 뮤텍스를 해제할 수 있도록 서브루틴 스택에서 꽤 자주 뮤텍스를 유지한다.FreeB에는 많은 코드 오염이 있다.이 때문에 SD-5(일부 절차는 제대로 작동하기 위해 관련 없는 다른 절차에 의해 보유되는 뮤텍스에 대한 지식이 제공되어야 한다.)
— Matthew Dillon
예
아래의 유사 코드와 설명은 토큰을 직렬화하는 방법이 어떻게 작용하는지를 보여준다.
스레드 A | 스레드 B | 액션 |
---|---|---|
lwkt_gettoken(T1); iter = list1.머리; | …lwkt_gettoken(T1); // 블록 // 토큰 T1을 기다리는 중 | A는 토큰 T1을 획득하여 목록1에 대한 동기화된 액세스를 얻기 위해 이를 사용한다. 목록1은 두 스레드에서 공유된다. |
lwkt_gettoken(T2); // 블록 | // 토큰 T1을 기다리는 중 | A가 lwkt_gettoken(T2)에 거는 통화는 차단 기능이기 때문에 A는 잠을 자다가 일시적으로 토큰을 잃어버린다.스케줄러가 T1과 T2가 모두 사용 가능한 것을 볼 때 깨울 것이다. |
// T1 및 T2 대기 | list1.head = list1.head.next; lwkt_leyasetoken(T1); | B는 T1을 획득하고 목록1을 수정한다.A의 "iter"는 여전히 목록의 이전 머리글을 가리킨다는 점에 유의하십시오. |
// 헤드의 새 버전을 가져오십시오: iter = list1.head; // 새 목록 만들기: while (iter != null) { list2.tail = iter.next; } lwkt_leasetoken(T1); lwkt_leasetoken(T2); | 스케줄러는 T1과 T2가 모두 사용 가능한 것으로 보고 스레드 A를 깨운다.A가 올바르게 코드화되었으므로, 새로운 목록1의 헤드로 반복기를 새로 고치고, 차단되지 않는 작업을 한다.A가 처음부터 단순히 두 토큰을 모두 요청하는 것이 더 좋았을 것이라는 점에 유의하십시오. |
다윈 커널의 선행기술
맥 OS X의 다윈 커널은 유사한 기술( 깔때기라고 함)을 사용하여 커널의 BSD 부분에 대한 액세스를 직렬화한다.