티스토리 뷰

Programming tips/architecture

CAS, RCU

bramach 2018. 3. 31. 22:45

1. CAS
일반적으로 쓰는 락은 소프트웨어 락으로, 인스트럭션이 굉장히 많이 소모 된다.
하드웨어 lock은 CAS를 어셈으로 구현하고, 
compare and set을 수행될 때까지 루프를 도는 spin lock을 말한다. 
lock에 소모되는 인스트럭션 수가 적어 훨씬 빠르다.
하지만 spin lock이니 lock acquire까지 너무 많은 시간이 소요될 경우 비효율 적이다. 
어셈으로 구현되다 보니, 아키텍쳐마다 구현이 다르다.
DPDK에서 지원하는 락이 CAS로 구현되어 있다. 

2. RCU
read-copy-update. publish and subscribe 모델의 일종.
read가 읽고 있을때 update가 발생하면 복사본을 만든다.
 read가 다 읽으면 reader가 바라보고 있는 포인터를 새로운 복사본으로 옮긴다.
reader 가 더 이상 없으면, 원본을 지운다.
새로운 복사본이 생기고, 원본이 없어지기까지를 grace period라고 부른다.
 구현이 어떻게 되어있는진 모르겠는데,
커널 버전의 경우, updater가 synchronize 요청하면
reader가 rcu_read_unlock이 다 끝날 때 까지 preemtion을 하지 않는다.
(유저스페이스 버전이면 스핀락이 되거나 카피 본이 최대 스레드 수 만큼 생기나?)
복사의 크기를 줄이기 위해서
리스트나 해시테이블의 경우에 한 엘리먼트로 카피본을 한정하고,
rcu 버전의 traversing이 따로 있다. read가 모두 끝나야  synchronize 함수가 리턴되고, 이 때 원본의 메모리를 회수한다.
 updater << reader 이고, lock acquire까지 걸리는 시간이 많을 경우 효과적이다.  

--
read:
    critical section:  dst_tuple을 조회하고 조회 성공 시  커넥션 테이블에 추가한다.
    critical section 길이 : 짧음 
    빈도: 매우 많음 
write:
    critical section: hash table에 인덱스를 삭제/추가 후 dst_tuple * perms을 복사
    critical section 길이 : 계산 과정은 포함 안되고, 복사만 함. perms 길이에 비례.. 
    빈도: 많이 없음

'Programming tips > architecture' 카테고리의 다른 글

공유 자원 관리 전략  (0) 2018.03.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함