kernel과 user process의 통신
글쓴이: tyhan / 작성시간: 월, 2015/08/24 - 5:57오후
아래와 같은 일을 하고 싶습니다.
1. kernel 에서 이벤트 발생
2. kernel 에서 이벤트 발생을 user process 알림
3. user process 에서 임의의 일 처리(매우 간단한 일)
4. user process 에서 kernel에 알림
몇 가지 요구 사항으로는
- 이벤트가 매우 많이 발생한다. (초당 만회 이상)
- 1-4 까지 처리 시간이 짧아야 함
여기서 2번 단계에서 가장 효율적인 방법을 찾고 있습니다.
두가지 방법을 생각해 보았습니다.
a. shared memory (mmap)을 이용하여 값을 쓰면 user process에서 모니터링
- user process에서 모니터링(flag 체크)가 오버헤드가 됨
b. kernel 에서 user process에 시그널을 발생하여 처리
- user process 에서 이전 일이 완료 전에 같은 시그널 발생시 처리 하지 못함
적은 것과 같이 두가지 모두 문제점이 있어 혹시 다른 방법이 있을까 하여 질문 드립니다.
읽어주셔서 감사합니다.
Forums:
저라면 다음과 같이 구성할 듯합니다.
- User Program A 개발
/dev/sevent 를 open 하여 read 함. while 문으로
- Kernel Driver A 개발
/dev/sevent 의 driver 로써
Event 발생시키는 A Device의 액션을 Queue 하여 저장하고
/dev/sevent 가 open 되고 read 하려고 할때 Queue 에 있는 것을 하나 꺼내줌.
Read해가지 않으면 가장오랜된 Queue 는 버림.
REad 할때 값이 없으면 잠들면서 Queue 가 찰때까지 잠듬(대기)
open 하거나 ioctl 를 통해 Device Driver A start.
close 되거나 ioctl 을 통해 Device Driver A Stop
- Kernel Device Driver A 개발
Driver A를 이용하여 등록되고, 실제 HW event 발생하면 Driver A를 이용하여
값을 저장함.
보통의 거의 모든 linux driver 및 device 가 이렇게 동작 됩니다.
(Kernel Driver A 와 Device Driver A는 값은 레이어나 한 파일에 해도 상관 없음...)
NIC와 커널간에 패킷 전달하는 것과 같은 동작
NIC와 커널간에 패킷 전달하는 것과 같은 동작 원리네요.
걱정 되는건 응답 속도 인데, Queue가 쌓여 있을때는 문제없이 동작 할것 같은데,
최초 이벤트에 대해서는 User Program A에서의 while 문에 따라 응답 속도가 달라지겠군요.
응답 속도와 cpu 사용량(open & read) 간에 trade off 가 생기겠네요.
감사합니다. 참고하겠습니다.
흠.
좀 지난 쓰레드이지만.......
윗분이 말씀 하신 방법이 가장 전형적인 방법이고 큰 무리없이 여타 프로그램들이 그와 같은 방식을 사용하고 있습니다.
저의 경우는 디바이스 만들어 이것을 통해 통신하면서 응답을 하고 있습니다. 어짜피 멀티 플렉싱해서 READ 이벤트 발생할때만
도니깐 놓치거나 응답이 느리거나할 일은 없을겁니다. CPU 사용량은 만드시는 방법이 때라 다르겠지만 이러한 IO 때문에
오버헤드가 생길일은 없을겁니다.
통신 패킷을 처리 하실거면 NETFILTER 큐를 이용해 전송해도 될것같구요. 단지 이벤트만 전송하신다면 초당 만회정도는 별 무리없이
돌아갈것으로보입니다. 예전에 제가 테스트 했던(정말 예전이라 좀 구식입니다) 방식으로는 커널에서 모든 네트웍 페킷을 큐에 넣어 유져 공간으로
복사해서 여기서 처리한후에 다시 커널로 넘겨서 통과시키는것이었는데 쓰루풋 테스트 할때 100M 패킷이 95M 정도 나왔구요.
기가에서는 700M 정도 나왔던걸로 기억납니다. CPU는 좀 구린거였어도 사용에 문제 없었고 로드도 그리 크지는 않았던거 같습니다.
물론 쓰루풋 테스트니 무지막지하게 부하 걸때는 그 자체만으로 CPU가 올라가는거라서 이건 뭐 어쩔수 없었고요. 프로그램 처리하는데
오버헤드는 그리 크지 않았던거 같습니다.
너무 오랫만에 KLDP오니깐 어색하세요. ^^
댓글 달기