A : (W:3) 100 X 3/4 = 75티켓
B : (W:1) 100 X 1/4 = 25티켓
스케줄러는 winning ticket을 고른다.
예시
티켓이 100장 존재
프로세스 A는 티켓 75장 가지고 있다. : 0~74
프로세스 B는 티켓 25장을 가지고 있다. : 75~99
해당 작업 2개가 경쟁을 오래 하면 할수록 요구되는 퍼센테이지 값에 유사해질 것이다.
사용자A -> 500(A의 통화)을 A1으로 -> 50(global currency)
-> 500(A의 통화)을 A2으로 -> 50(global currency)
사용자 B -> 10(B의 통화)를 B1으로 -> 100(global currency)
// winner 찾는 알고리즘
typedef struct node{
int pid;
int tickets;
struct node* next;
}node_t;
int counter = 0
int winner = getrandom(0, totaltickets);
node_t *current = head;
while(current){
counter = counter + current->tickets;
if(counter > winner)
break;
current = current -> next
}
U = 10/20 = 0.5
U는 두 작없이 거의 동시에 끝났을 경우에 1에 가까워진다.(ex) 첫작업이 19.5초에 두번째 작업이 20초에 끝났을 경우 U = 19.5/20 = 0.975)
각 프로세스의 보폭(stride)
예시
큰 수 : 10000
프로세스 A는 100개의 티켓을 가지고 있다. -> A의 stride는 10000/100 = 100
프로세스 B는 50개의 티켓을 가지고 있다. -> B의 stride는 10000/50 = 200
프로세스 C는 250개의 티켓을 가지고 있다. -> C의 stride는 10000/250 = 40
만일 프로세스가 수행된다면, pass value(축적된 stride)의 증가량은 그것의 stride값이다.
//해당 수도코드
current = remove_min(queue);
schedule(current);
current -> pass += current -> stride;
insert(queue, current);