auto lock class 가 왜 까였냐고?
병렬처리의 기본 중의 기본이 임계영역 최소화임.
임계영역엔 말 그대로 배타적으로 실행되어야 할 최소한의 코드만 들어가도록 해야 동시에 접근하는 다른 프로세스의 대기시간을 줄이지.
임계영역을 최소화하지 못하는 병렬처리 코드는 그냥 단일 프로세스로 직렬화된 코드만도 못한 성능이 나오거든.
게다가 임계영역이 크면 클수록 임계영역 내에서 context switching 이 발생할 확률이 높아진다는 치명적 문제도 있지.
lock-free 라는걸 고민해서 생각해내는 이유도 결국은 임계영역 최소화가 목적임.
lock-free 는 실제로 lock 이 없는 것이 아니라 임계영역 내에서 context switching 이 발생하는 것을 막으려는 목적이니까.
그러니 CAS 기반 lock-free 의 평균적 퍼포먼스가 critical-section 보다 떨어짐에도 불구하고 c~sect의 대안으로 제시된 것이었지.
근데 auto lock class 처럼 그 잘난 RAII 랍시고 생성자에서 락 걸고 소멸자에서 락 풀면... 물론 코딩이야 편해지고 위험성이야 줄어들겠지...
그럼 그 임계영역에 뭐가 들어갈 것 같냐? 모든 개체의 생성자 소멸자부터 전체 코드, 한마디로 함수 하나가 통째로 임계영역에 들어가버리는거임.
그럴 생각이면 뭐하러 거지같은 c++ 써? 차라리 안전하고 생산성 높은 JAVA 쓰지. 지금은 21세기잖아?
auto lock class 가 까인 것은 RAII 를 까는 것이 아냐.
임계영역 최소화라는 기본 중의 기본을 무시하는 구현이라서 까는거지.
p.s:
아 글구 난 악플러라서 말투가 존내 시니컬하니까 너무 기분나빠하지 말고 저놈 악플러구나 하구 적당히 요자만 알아들어주셈 ㅋ
나라면 임계영역 최소화로 줄일거는 줄이고 auto lock class로 코딩 편해지고 위험성 줄이는 코드 짜겟는데? 먼말인지 이해되나?
락프리 쓰긴 쓰냐? 그게 절대적으로 필요한 상황을 안겪어봐서.
이렇게 쓰면 되지 { auto_lock lock(&_lock); 잠그고 싶은 코드; }
밑에 글에서 한 이야기 말인데, lock# 신호 쓰는건 critical section도 마찬가지잖아? contention이 있으면 시스템 콜까지 하고. 그거까지 고려해도 lock-free가 배보다 배꼽이 더 커?
근데 글케 안쓰니 문제지... 난 그 원인을 명시성의 부재라고 생각하걸랑....
글구 lock-free 써. CAS 로 구현한건 안쓰고, 다른 방식으로 구현해 쓰지. 접근 빈도 조또 높은 경우엔 c-sect 쓰는거랑 퍼포먼스에서 큰 차이가 나더라고.
디- // 응. 조또 귀찮겠지만 살짝만 시간 내서 실제로 퍼포먼스 측정해보셈^_^; lock# 신호 쓰는건 csect 도 마찬가지지만, csect 는 enter~leave 두번에 lock만 걸면 그만인데... CAS 기반의 lock-free 는 ABA 문제를 막기 위해 다른 부가적 코드가 조또 많이 수행되거든. InterlockedPushEntrySList 나 InterlockedPopEntrySList 한번 디버그로 들어가보셈. 단순히 cmp xchg 가 전부가 아니니까.
이런 경우를 생각해봐. 실제 내가 코딩하고 상용에서 도는거야. 수백 수천명의 클라이언트가 붙어 클라이언트당 패킷 수천개가 넘나드는 서버에서 패킷 메모리풀을 하나만 쓰는 경우와 클라이언트당 풀을 따로 만들어 각각 풀을 쓰는 경우중 어디가 임계영역이 적을까? 이런게 임계영역의 최소화의 의미라고, 연관성이 있다고 하겟지만 단지 락프리 안쓴다는 거랑 임계영역 최소화랑은 다른 문제야. 논점을 잘못잡았어.
ABA 문제 해결하는데 뭐 그리 많은 코드가 붙는다고... 카운터 하나 붙어있는거 뿐이잖아. 루프 돌기는 하는데 contention 없으면 한번에 성공이고 conetntion이 있더라고 시스템 콜보다는 빠를테니.
클라이언트당 풀을 따로 만들어 쓰는 것과 단일 풀에서 잡는 것... 그것도 임계영역의 문제겠지. 하지만 그건 임계영역 유무의 문제지 임계영역 크기의 문제는 아니잖아?
\'임계영역\'이라는거 널리 쓰이는 표현인가? 뭔가 매우 어색한데;
글구 키보드로 측정하면 critical section 도 문제될 것 전혀 없음. 키보드로 따진다면 동시에 접근할 가능성이 극히 적잖아?
임계영역이라는 용어는 공유 리소스 뿐만 아니라 배타적 실행 코드도 포함하는거임. 근데 임계영역이라고 안하면 뭐라고 부름? 난 critical-section 이라고 하기엔... 윈도의 CriticalSection 하고 혼동될까봐 일부러 임계영역이라고 하는데...
ABA문제도 있겟지만 함수 저 안쪽 깊은데서 뜸끔없이 어떤넘이든 받아라 하고 예외를 던져 버리는 경우도 있어. 이 경우 Enter,Leave로만 해결 안되고 복잡해 진다는건 알지? 물론 이런 대책도 세우고 간다면야 문제 없겟지만... 이런거 저런거 다 고민해가면서 굳이 임계영역 코드 크기를 줄이는 코딩을 하느니 코드는 좀 커지더라도 차라리 임계상황자체를 줄이는게 현명하다는거 아닐까 하거든.
저거 갖고선 raii가 까일 게 못되는데.. raii가 아니더라도 엔터/리브를 어디서 하냐에 따라 그 사이에 뭐가 들어가는지 안들어가는지 달라지는 게 똑같은데 =_=