| [ CnUnix ] in KIDS 글 쓴 이(By): swhan (foo bar) 날 짜 (Date): 2002년 10월 13일 일요일 오전 07시 54분 08초 제 목(Title): Re: [q] IPC performance (socket)? shared memory가 빠르다는데 이의를 달 사람은 없겠지만, semaphore가 Unix System V IPC의 그 semaphore라면 그리 빠른 방법은 아닙니다. portable하고는 거리가 약간 있지만 한 2~15줄만 블랙박스로 하나 만들어두면 atomic lock이 제일 빠릅니다. CPU별로 test-and-set이나 비슷한 역할을 할 수 있는 instruction set이 있으니까 포팅시에 약간씩만 손봐주면 됩니다. (4 byte or 8 byte : 실제로는 1bit이용) 이보다 조금 느리지만 포터블한 pthread_mutex_XXXX도 있습니다. 메모리는 atomic lock보다 좀 많이 먹지만 속도는 빠르(다고하)ㅂ니다. :) (약 60 byte) 여러개 만들기 어렵고 좀 귀찮은 방법이지만 file lock도 상당히 빠른 방법중의 하나라고 합니다. semaphore는 이 뒤에 놔야 할겁니다. :) 만약에.. shared memory를 쓰면서 그 공간을 application이 직접 읽고 부분 update하고 다시 넘기고 등등을 할게 아니라(공유공간이 아니라) data를 copy해가고 끝날꺼라면, posix message queue가 더 좋을겁니다. 속도는 posix shared memory + pthread_mutex를 조합한 속도중 최고의 속도를 내면서 다양한 기능을 제공해줍니다. 단점이라면, shared memory를 쓰고 최고의 속도를 내기 위해 미리 정한 크기의 message array를 유지하기 때문에 memory에 비효율적이고 미리 정한 크기 이상의 message를 넘기려면 user가 fragmentation and reassemble을 수작업으로 해야 한다는 점. frag & reassemble이 귀찮으면 stream socket이나 pipe를 써야겠죠. connection 관리를 해줘야겠지만 :) @저는 대용량 트랜젝션에 일정 시간 이내의 turn around time을 가져야 하는 경우가 있었는데, (server time 400ms이내, 평균 100~200ms이내, process수 5개 이상, 2-phase commit포함) shared memory에 buffer pool을 만들어두고 썼었습니다. memory copy가 상당한 overhead가 되는 상황이어서... atomic lock과 message별 flag set, posix signal 조합. 호주애들은 보니까 buffer pool유지하고, atomic lock를 쓰면서 transaction을 다른 process로 넘기는데는 posix signal을 쓰더군요. 초당 트랜젝션에는 아주 약간의 손해가 있지만 반응속도는 단연 최고입니다. 물론 선점형 커널이라는 전제가 필요합니다. :) @참 shared memory도 posix shared memory를 쓰면 수백메가 이상의 공간 할당하는게 좀 쉬워집니다. sysV shared memory는 공간 학보가 너무 어려워서리 -.-a |