2015년 3월 1일 일요일

트랜잭셔널 메모리(Transactional Memory)

트랜잭셔널 메모리(Transactional Memory)

데이터 레이스가 생길 수 있는 프로그래밍 블록이 있을 때 그것을 atomic 하게 실행해줄 수 있는 방법이다. 기존에 싱글 쓰레드 프로그래밍 처럼 작성하고 atomic {} 으로 감싸주기만 하면 된다.

소프트웨어로 구현하려면
a =3 은 안됨
a.transtore(3)  같이 해줘야 함
종류는 많다.
잘 돌아는 가는데 사용하고 있지는 않다.
아직은 성능향상이 없다 core가 64개 이상 정도는 되야 오버헤드를 극복하고 성능향상이 있을 거다.
unreal3 에서 시도를 해봄 -> 아직은 무리

하드웨어로 구현하면
SUN의 락 프로세서는 망했음 왜냐하면 오라클에서는 하드웨어에 관심이 없었기 때문
캐시의 태그를 보고 transaction bit가 on 되어 있으면 메인 메모리에 쓰지 않는다.
L1 캐시에서만 메모리 연산이 이루어 진다.
CPU가 여러개라도 잘 돌아간다.

L1 캐시 용량이 32KB 이기 때문에 그 이상의 데이터면 작동안함
근데 9KB 일 때도 안될 때도 있음
캐시의 종류가 3가지가 있는데
direct mapping : int a 가 있을 때 32kb 캐시가 있을 때 메모리에 할당 될 수 있는 위치가 정해져 있어서 중복 되면 invalidate 됨(변수 2개 썼는데 겹칠 때) - 싸다
full associate cache : 자유롭게 위치 선정해서 할당 될 수 있음 - 비싸다
set associate : 2개의 중간인데 int a가 위치 될 수 있는 공간이 8개. 8개 중의 하나에만 위치 재수 없으면 8 칸이 꽉차서 못들어갈 수 있음 9byte가 같은 자료형 일 때 1byte가 들어갈 수 없어서 트랜잭셔널이 동작하지 않을 수 있다.