커널과 사용자 영역에서 메모리를 공유해서 read, write 시에 동기화는 어떻게 해야 하나요?
글쓴이: i20749 / 작성시간: 수, 2014/08/13 - 8:01오후
안녕하세요. 이전에 커널과 사용자 영역에서 메모리를 공유할 방법에 대해 질문을 올렸었는데요.
해당 문제는 더미 캐릭터 디바이스와 mmap을 이용해 해결하였습니다. 힌트 주신분이 계셨는데 감사드리구요.
이번엔 해당 메모리를 커널 영역과 사용자 영역에서 read, write 할때 동기화를 어떻게 할지에 대해서
질문 드리려고 합니다. 물론 개인적으로도 고민하고 있구요.
위와 같이 메모리를 공유하는것이 디바이스 드라이버에서는 일반적인 방법 같은데요, 디바이스 드라이버를
개발하시는 분들은 어떤 방법으로 동기화를 하시는지요?
Forums:
아 구조는 커널:사용자 영역 n:1 입니다
1:1로 동기화해야 하는게 아니라서
쉽게 멀티쓰레드들 사이에서 동기화하는
것으로 생각하시면 됩니다
많이 배우고 싶습니다
두가지 방법
안녕하세요.
이렇게 나누어 보겠습니다.
#1 Busy waiting: (Sync) mmap을 영역에서 header를 만들고 플래그를 넣으세요. 하지만 N이 증가하면 system call에 부하가 걸려서 첫번 째와 크게 다르지 않습니다.
#2 Sleeping: 드라이버에 Semaphore 넣어서 Blocking read/write 만드세요.
수고하세요.
댓글 감사드립니다
Time critical 하지 않으면 (Async) Netlink 를 사용하세요 N:1 해결 가능합니다.
-> netlink의 경우 해당 기능을 개발후에 유닉스에도 포팅을 해야해서 제외하였는데요. netlink가 리눅스에만 있는 방식이 맞겠지요? ^^;
검색 결과 유닉스에는 없는거 같았는데요.
또 한가지가 netlink의 예제들을 보면 user 영역에서 -> kernel 영역으로 데이터를 보내면 kernel 영역에서는 데이터 recv 후에 콜백으로
user 영역으로 데이터를 보내게 되어 있는데요. kernel 영역에서도 먼저 user 영역으로 데이터를 보낼 수 있는건가요?
기능상 커널에서 먼저 데이터를 보내면 이에 대한 응답을 사용자영역의 데몬에서 해야하거든요.
Time critical 요구하면, 다시 다음 두가지 방법이 있습니다.
-> 두번째 내용은 제가 이해를 잘 못하겠습니다 ㅠ.ㅜ
많이 배우고 싶습니다
댓글 달기