select등을 이용하여 버퍼구현시 파일생성하지 않으려면??
Buffer를 구현하려고 합니다.
Ring Buffer에 메시지를 Queuing시키면 읽어가는 쪽에서 블럭되어 있다가
블럭이 풀려서 메시지를 읽어가도록 하려 합니다.
이미 Win32용으로는 IOCompletionPort라는 커널 API를 이용하여 구현을 하였습니다.
IOCompletionPort은 Select와 같은 것을 커널레벨에서 지원하는 API로 보이는데..
인자를 File descriptor를 받기도 하지만, 실제 파일을 생성하지 않고서
동작이 가능하였습니다.
유닉스 쪽에서 구현된것은 어떠한가 찾아보니 소스포지에서 VRB(Virtual Ring Buffer)라는
소스가 있어 찾아 보니.. 제가 정확히 보았는지는 모르지만 파일을 생성하고 poll을 이용하여
동작이 되도록 구현되어 있었습니다.
위의 vrb처럼 구현하기 위해 select나 poll을 사용하면 될듯 하긴 한데..
실제 파일을 생성해서 파일에 쓰는 것처럼 해야만 하는 것인지 궁금합니다.
(필요없는 하드디스크 엑세스가 일어나지는 않을지 고민입니다. flush를 하면 하드디스크에
쓰는 것인가? 파일시스템매니저 같은 녀석이 나중에 모아서 쓰는 것일까?
메모리에 썼다가 읽어가면서 지우면 되는데... 매번 하드디스크에 쓴다면 대략 낭패..)
그렇다고 표준 입출력을 사용하기에는 콘솔화면에 메시지가 쭈욱 뿌려질것 같아
피하고 싶고...
select나 poll을 사용하지 말고 pipe를 사용해야 할까요
링버퍼 아주 간단히 생각했는데.. 여러가지 고민할께 많네요..
여담인데.. 오늘따라 KLDP서버 무지하게 느리네요..
아파치 데몬이 범인일까 SQL데몬이 범인일까요? 아님 둘이 공범?
DB접속 에러가 뜨는 걸 봐선.. DB의 단독범행으로 보이는뎅. ㅋ
관리자 님께서 데몬들을 리스타트 시키셨는지 다시 빨라졌습니다.
그 링퍼버가 프로세스간 공유가 되어야 하는건가요?그렇다면 공유메모리를
그 링퍼버가 프로세스간 공유가 되어야 하는건가요?
그렇다면 공유메모리를 이용해서 링버퍼를 구현하면 되겠네요.
싱크문제는 세마포어 사용해서 해결하고요.
굳이 프로세스간에 공유할 필요는 없습니다.쓰레드 간에 메시지를 전달
굳이 프로세스간에 공유할 필요는 없습니다.
쓰레드 간에 메시지를 전달 하면 되는것이니 시스템의 메시지 큐나 공유 메모리와 같은 것은 사용하지 않을 것입니다.
메시지를 수신하는 쪽에서 메시지를 받아다가 버퍼링 시키면
메시지를 처리하는 쪽에서 하나씩 꺼내다가 처리하는 방식이니까요...
select나 poll을 이용한다면 기본적으로 쓰레드/프로세스 동기화 부분은 필요가 없을 것으로 보이구요(물론 버퍼링한 갯수와 같이 서로 동시에 접근하는 경우에는 뮤텍스 등을 이용할 예정입니다.)
그리고 뮤텍스(단지 2개의 쓰레드 간에 데이터 전송이 이뤄지기에 뮤텍스면 충분할 것같습니다.)로 구현을 해보긴 했는데... writer한 포인터와 read한 포인터를 뮤텍스로 보호하면서 시그널을 이용하여 block모드로 동작하도록 짜다보니...
대충 동작은 될 듯하지만,,,, 영 미덥지가 않아서요...
돌아가다가 크래쉬 되지 않을지 걱정이라서 신뢰하다고 생각되는 select나 poll을 이용해 볼 생각입니다.
그래서 질문 드린 거구요....
boss/worker 쓰래드 모델인 것 같은데꼭 링버퍼를 사용하셔야
boss/worker 쓰래드 모델인 것 같은데
꼭 링버퍼를 사용하셔야 하는게 아니라면
버퍼는 stl 의 벡터나 큐를 사용하고, pthread 의 condition과 mutex를 이용해서 구현하면 좋을 듯 합니다.
계속적인 답장 주셔서 감사합니다.... thread 와 condit
계속적인 답장 주셔서 감사합니다....
thread 와 condition에 관해 좀더 찾아 보았더니...
Join C에 이용해 볼수 있는 예제가 있는 것 같군요...
STL... 지금까지 c로 짜오다가 갑자기 c++로 짜려니.. 쪼금 꺼려지는 군요... ^^
STL은 꼭 이용해 보고 싶은 것이긴 한데.. 아직은... ㅡㅡ;;
그리고 제가 좀 헤메고 있는 부분이 자료구조가 아니라.. blocking과 signal처리에 관한 부분이라서... ^^
pthread_cond_timedwait()과 뮤텍스 등을 잘 이용하면 원하던 결과를 얻을수 있어보이네요..
잘 안돼면... 그때가서..
댓글 달기