멀코 7장. STACK, SKIP-LIST
問題一覧
1
큐는 오래전에 넣은 데이터를 꺼내는 것이고 스택은 제일 최근에 넣은 데이터를 꺼내는 것이기 때문이다.
2
X
3
모든 push, pop이 충돌한다. 즉, 자료구조 자체가 병렬성이 없다. 이건 스택 자료구조의 근본적인 문제이다.
4
스택은 탑에서 계속 push, pop하기 때문에 확률이 더 높다.
5
스택의 top에 대한 성공한 cas 호출의 순서로 하나씩 진행되므로 순차병목현상이 나타날 수 있다.
6
무제한 무잠금 스택에서 top에 대한 경쟁이 심한 것을 좀 줄이기 위해 나왔다.
7
다 똑같은 시간을 기다리면 충돌이 나기 때문이다. 따라서 각 스레드마다 랜덤한 시간을 기다리도록 해야 한다.
8
순서 정해주는 것 역시 atomic 변수로 해줘야해서 오버헤드가 크기 때문이다.
9
sleep_for는 운영체제 호출이다. 단지 옆 스레드가 CAS 작업하는 동안만 기다리면 되는데 운영체제 들어갔다 오는 시간이 너무 길다.
10
코어가 많은 프로그램에서 사용할 때 (블럭킹 알고리즘에서는 많은 성능향상을 볼 수 있다.)
11
클럭이 빠르면 빠르게 흘러가고, 느리면 느리게 흘러간다. 어셈블리어이기 때문에 64비트에서는 안돌아간다.
12
push와 pop이 거의 동시에 일어난다면 두 연산은 스택에 접근하지 않고 취소되어 없어지게 한다.
13
충돌이 심할 때는 크기를 늘리고, 적을 때는 줄이기 위해서이다.
14
lock-free
15
X
16
O
17
단지 교환대상이 바뀐 것 뿐이고 값도 그대로이기 때문에 아무 문제가 없다.
18
너무 짧은 교환 시간은 항상 실패를 하게 되기 때문이다.
19
처음부터 교환이 없었거나, 같은 종류의 연산과 값이 교환되었을 경우이다.
20
O
21
검색시간 O(n)이기 때문이다.
22
재균형(Rebalancing)
23
평군 검색시간이 O(logn)이다. 재균형작업이 필요없다. 랜덤 자료구조이다. worst case O(n)이다.
24
지름길
25
2의 i승 - 1
26
X
27
skip list
28
모든 링크가 다 연결되었을 때 marking이 false일 때
29
std::recursive_mutex 하나의 노드를 여러 번 잠글 수 있도록 하기 위해서이다. 이걸 사용하는 것이 프로그래밍이 좀 더 깔끔해진다.
30
위쪽 링크가 다 연결되지 않았을 경우가 있을 수 있기 때문이다. 리턴 값과 최고 레벨을 비교하여 pred, curr가 모든 레벨의 링크를 담고 있는가를 확인한다.
31
노드가 추가되는 동안 앞 노드가 변경되는 것을 방지하기 위해서이다.
32
while (!nodeFound.fullyLinked) {} 곧 add를 할 애니까 처음부터 하는게 아니라 기다렸다가 add가 끝나면 return false를 하기 위한 것이다.
33
Add(), Remove()는 여태까지 한 것이 아까워서 기다렸지만 Contains는 locking한 것도 없기 때문이다.
34
Remove()에서 논리적으로 제거 후, 물리적 제거는 Find()에서 한다.
35
게으른: 모든 리스트가 연결되면 LF: 0층이 연결되면
36
CAS를 한 방에 사용하기에 무리가 있기 때문이다.
37
O
38
최상층부터 지워나가야 한다. 절대로 최하층부터 지우면 안된다.
39
O
40
lock-free skiplist의 Find()는 marking되어 있는 것을 찾으면 지운다.
41
Find()는 wait-free가 아닌 lock-free로 구현되어 있기 때문이다.
42
메모리 릭 때문이다. shared_ptr, EBR, 헤저드 포인터 등을 사용해서 재사용을 해줘야 한다.
멀코 2장 멀티스레드 프로그래밍
멀코 2장 멀티스레드 프로그래밍
ユーザ名非公開 · 9問 · 2年前멀코 2장 멀티스레드 프로그래밍
멀코 2장 멀티스레드 프로그래밍
9問 • 2年前멀코 3장 메모리 일관성
멀코 3장 메모리 일관성
ユーザ名非公開 · 41問 · 2年前멀코 3장 메모리 일관성
멀코 3장 메모리 일관성
41問 • 2年前고법 2장 헌법
고법 2장 헌법
ユーザ名非公開 · 41問 · 2年前고법 2장 헌법
고법 2장 헌법
41問 • 2年前고법 3장 근로계약
고법 3장 근로계약
ユーザ名非公開 · 42問 · 2年前고법 3장 근로계약
고법 3장 근로계약
42問 • 2年前고법 4장 노동법의 역사
고법 4장 노동법의 역사
ユーザ名非公開 · 23問 · 2年前고법 4장 노동법의 역사
고법 4장 노동법의 역사
23問 • 2年前고법 6장 직장내 성희롱
고법 6장 직장내 성희롱
ユーザ名非公開 · 31問 · 2年前고법 6장 직장내 성희롱
고법 6장 직장내 성희롱
31問 • 2年前멀코 4장 동기화 연산과 cas
멀코 4장 동기화 연산과 cas
ユーザ名非公開 · 20問 · 2年前멀코 4장 동기화 연산과 cas
멀코 4장 동기화 연산과 cas
20問 • 2年前멀코 5장 non-blocking 알고리즘 - list
멀코 5장 non-blocking 알고리즘 - list
ユーザ名非公開 · 84問 · 2年前멀코 5장 non-blocking 알고리즘 - list
멀코 5장 non-blocking 알고리즘 - list
84問 • 2年前멀코 5-2장 배경이론
멀코 5-2장 배경이론
ユーザ名非公開 · 61問 · 2年前멀코 5-2장 배경이론
멀코 5-2장 배경이론
61問 • 2年前1. 컴퓨터 그래픽스 개요 (컴그)
1. 컴퓨터 그래픽스 개요 (컴그)
ユーザ名非公開 · 34問 · 2年前1. 컴퓨터 그래픽스 개요 (컴그)
1. 컴퓨터 그래픽스 개요 (컴그)
34問 • 2年前2. 2차원 그래픽스의 기본 요소 (컴그)
2. 2차원 그래픽스의 기본 요소 (컴그)
ユーザ名非公開 · 30問 · 2年前2. 2차원 그래픽스의 기본 요소 (컴그)
2. 2차원 그래픽스의 기본 요소 (컴그)
30問 • 2年前3. 2차원 그래픽스 변환 (컴그)
3. 2차원 그래픽스 변환 (컴그)
ユーザ名非公開 · 15問 · 2年前3. 2차원 그래픽스 변환 (컴그)
3. 2차원 그래픽스 변환 (컴그)
15問 • 2年前4. 2차원 그래픽스의 윈도우와 뷰포트 (컴그)
4. 2차원 그래픽스의 윈도우와 뷰포트 (컴그)
ユーザ名非公開 · 16問 · 2年前4. 2차원 그래픽스의 윈도우와 뷰포트 (컴그)
4. 2차원 그래픽스의 윈도우와 뷰포트 (컴그)
16問 • 2年前멀코 6장. 병렬 알고리즘 - QUEUE
멀코 6장. 병렬 알고리즘 - QUEUE
ユーザ名非公開 · 26問 · 2年前멀코 6장. 병렬 알고리즘 - QUEUE
멀코 6장. 병렬 알고리즘 - QUEUE
26問 • 2年前멀코 8장. 병렬 라이브러리
멀코 8장. 병렬 라이브러리
ユーザ名非公開 · 77問 · 2年前멀코 8장. 병렬 라이브러리
멀코 8장. 병렬 라이브러리
77問 • 2年前고법 7장. 임금의 이해
고법 7장. 임금의 이해
ユーザ名非公開 · 46問 · 2年前고법 7장. 임금의 이해
고법 7장. 임금의 이해
46問 • 2年前고법 9장. 인사명령과 징계
고법 9장. 인사명령과 징계
ユーザ名非公開 · 21問 · 2年前고법 9장. 인사명령과 징계
고법 9장. 인사명령과 징계
21問 • 2年前고법 11장. 노동조합법
고법 11장. 노동조합법
ユーザ名非公開 · 45問 · 2年前고법 11장. 노동조합법
고법 11장. 노동조합법
45問 • 2年前컴그 7장. 3차원 객체의 모델링
컴그 7장. 3차원 객체의 모델링
ユーザ名非公開 · 13問 · 2年前컴그 7장. 3차원 객체의 모델링
컴그 7장. 3차원 객체의 모델링
13問 • 2年前컴그 8장. 은면의 제거
컴그 8장. 은면의 제거
ユーザ名非公開 · 9問 · 2年前컴그 8장. 은면의 제거
컴그 8장. 은면의 제거
9問 • 2年前問題一覧
1
큐는 오래전에 넣은 데이터를 꺼내는 것이고 스택은 제일 최근에 넣은 데이터를 꺼내는 것이기 때문이다.
2
X
3
모든 push, pop이 충돌한다. 즉, 자료구조 자체가 병렬성이 없다. 이건 스택 자료구조의 근본적인 문제이다.
4
스택은 탑에서 계속 push, pop하기 때문에 확률이 더 높다.
5
스택의 top에 대한 성공한 cas 호출의 순서로 하나씩 진행되므로 순차병목현상이 나타날 수 있다.
6
무제한 무잠금 스택에서 top에 대한 경쟁이 심한 것을 좀 줄이기 위해 나왔다.
7
다 똑같은 시간을 기다리면 충돌이 나기 때문이다. 따라서 각 스레드마다 랜덤한 시간을 기다리도록 해야 한다.
8
순서 정해주는 것 역시 atomic 변수로 해줘야해서 오버헤드가 크기 때문이다.
9
sleep_for는 운영체제 호출이다. 단지 옆 스레드가 CAS 작업하는 동안만 기다리면 되는데 운영체제 들어갔다 오는 시간이 너무 길다.
10
코어가 많은 프로그램에서 사용할 때 (블럭킹 알고리즘에서는 많은 성능향상을 볼 수 있다.)
11
클럭이 빠르면 빠르게 흘러가고, 느리면 느리게 흘러간다. 어셈블리어이기 때문에 64비트에서는 안돌아간다.
12
push와 pop이 거의 동시에 일어난다면 두 연산은 스택에 접근하지 않고 취소되어 없어지게 한다.
13
충돌이 심할 때는 크기를 늘리고, 적을 때는 줄이기 위해서이다.
14
lock-free
15
X
16
O
17
단지 교환대상이 바뀐 것 뿐이고 값도 그대로이기 때문에 아무 문제가 없다.
18
너무 짧은 교환 시간은 항상 실패를 하게 되기 때문이다.
19
처음부터 교환이 없었거나, 같은 종류의 연산과 값이 교환되었을 경우이다.
20
O
21
검색시간 O(n)이기 때문이다.
22
재균형(Rebalancing)
23
평군 검색시간이 O(logn)이다. 재균형작업이 필요없다. 랜덤 자료구조이다. worst case O(n)이다.
24
지름길
25
2의 i승 - 1
26
X
27
skip list
28
모든 링크가 다 연결되었을 때 marking이 false일 때
29
std::recursive_mutex 하나의 노드를 여러 번 잠글 수 있도록 하기 위해서이다. 이걸 사용하는 것이 프로그래밍이 좀 더 깔끔해진다.
30
위쪽 링크가 다 연결되지 않았을 경우가 있을 수 있기 때문이다. 리턴 값과 최고 레벨을 비교하여 pred, curr가 모든 레벨의 링크를 담고 있는가를 확인한다.
31
노드가 추가되는 동안 앞 노드가 변경되는 것을 방지하기 위해서이다.
32
while (!nodeFound.fullyLinked) {} 곧 add를 할 애니까 처음부터 하는게 아니라 기다렸다가 add가 끝나면 return false를 하기 위한 것이다.
33
Add(), Remove()는 여태까지 한 것이 아까워서 기다렸지만 Contains는 locking한 것도 없기 때문이다.
34
Remove()에서 논리적으로 제거 후, 물리적 제거는 Find()에서 한다.
35
게으른: 모든 리스트가 연결되면 LF: 0층이 연결되면
36
CAS를 한 방에 사용하기에 무리가 있기 때문이다.
37
O
38
최상층부터 지워나가야 한다. 절대로 최하층부터 지우면 안된다.
39
O
40
lock-free skiplist의 Find()는 marking되어 있는 것을 찾으면 지운다.
41
Find()는 wait-free가 아닌 lock-free로 구현되어 있기 때문이다.
42
메모리 릭 때문이다. shared_ptr, EBR, 헤저드 포인터 등을 사용해서 재사용을 해줘야 한다.