유저레벨 쓰레드에서의 메모리 배리어에 대해 질문을 드리고 싶습니다.
글쓴이: Kuroneko0109 / 작성시간: 금, 2016/05/13 - 10:44오전
안녕하세요. 1년 좀 넘어가는 씨닙개발자입니다.
구글링을 해도해도 답이 안나와서(정말 없는것인지 제 검색력이 부족한지는 모르겠지만) 질문을 드리고 싶습니다.
유저레벨에서 사용할 수 있는 smp_mb()같은 배리어 api는 존재하지 않는걸까요?
Forums:
정확하게는
현재, pci인터럽트 콜백이 제 쓰레드가 사용하는 자원을 동시접근하는 문제가 발생해서 해결책을 찾는 중입니다.
그건 비밀입니다.
문제의 발생원인을 좀더 명확하게 기술한번 해보세요
현재 문제 발생 원인이 유저단에서 지원하는 배리어 api만 있으면 해결가능 하다라는 결론을
내셨는데.. 정확히 어떤 문제? 인지 상세히 기술해 주시면 많은 분들이 공부도 되고, 좀더 조언을 드릴 수 있지 않을까요?
질문 내용으로만 봐서는 단정지을수 없지만
뮤텍스 정도로 해결 가능하지 않나요?
뮤텍스로 해결할 수 없으니 질문을 올리신거 같은데
왜 뮤텍스로 해결이 안되는지에 대한 이유도 같이 기술하면 좋을 것 같아요~ ㅎㅎ
사실
조금 더 상세하게 말씀드리자면 프로세스 내 자원이 아닌, 하드웨어 큐 인터페이스에 직접 어셈블리 명령으로 접근해야합니다.
근데, 커널쓰레드에서도 해당 자원을 접근하기 위한 시도를 하게되고,
그 와중에 충돌이 생기는것으로 판단이 되서요...ㅠ
이 이상 상세하게 서술하게된다면 보안누설이라 말씀드리기가...ㅠㅠ
죽겠네요 징징...
이런 경우엔 프로세서적 배리어가 필요하다 생각되는데, 만들어 쓰자니 자신이 없어서 사실...
그건 비밀입니다.
제가아는 기술과 상식으로는...
가능하지 않은 방법을 사용하고 계신데...
(인터럽트핸들러에서 콜백으로 유저스페이스 쓰레드 자원(변수?)를 접근한다? 어떻게 알고!?)
아마 문제 해결 및 구현 방법은 보안이 아닐거라 생각 됩니다.
천천히 한번 말씀해 보세요
혹시 아나요?
리눅스에 불가능한 혹은 쉽게 할 수 있는 방법이 있는데 어렵게 구현하려고 끙끙하고 계시는거
쉽게 할 수 있는 방법 조언해 줄련지...
아뇨 콜백이 유저스페이스 자원을 접근하는것이 아니라
하드웨어 내부 큐의 인터페이스에 접근하는거에요.
그러니까 유저스페이스에서 하드웨어의 result를 read하고
콜백도 거의 비슷한 시점에 동일한 작업을 수행한다는거죠.
간단한 증명으로는, 확률적으로 유저스페이스에서 결과를 받을 수 있습니다.
따로 보호모드가 없는 프로세서라 가능한 일인 것이라 생각됩니다.
아뇨 콜백이 유저스페이스 자원을 접근하는것이 아니라
하드웨어 내부 큐의 인터페이스에 접근하는거에요.
그러니까 유저스페이스에서 하드웨어의 result를 read하고
콜백도 거의 비슷한 시점에 동일한 작업을 수행한다는거죠.
간단한 증명으로는, 확률적으로 유저스페이스에서 결과를 받을 수 있습니다.
따로 보호모드가 없는 프로세서라 가능한 일인 것이라 생각됩니다.
핸드폰으로 쓰니 익명으로 두개씩 달리네요
캡챠 실패했다고 뜨면서...
그건 비밀입니다.
음...
보통의 linux kernel 및 device driver 혹은 그 user program 은 다음과 같은 방식을 사용합니다.
1. HW device driver가 있음
HW 를 제어할 수 있는 함수 제공 및 인터럽트 핸들러를 등록함.
2. 1번에서 만들어진 함수를 호출하고, User space fs 대응 driver 가 있음.
HW를 제어함, User space에서 open,read,write,ioctl 에 대응함.
3. User program 이 있음. 2번을 open 해서 write,read,ioctl 함.
굳이 이렇게 하지 않아도 되지만 보통(99% 이상이)은 이렇습니다.
위에서 기술한 방식대로 안되어 있다면 위와 같이 하는걸 추천 드리며,
위에서 말한 방식과 동일 하다면
2.번의 드라이버에서는 오직 인터럽트 발생시 HW에서 값을 읽어서 내부에 저장을 해 놓고
User 에서 요청이 있을시 값 만 전달 해 주면 됩니다.
바꿔 말하면 HW device driver 와 User space 사이의 완충 알고리즘? 매커니즘이 필요합니다.
User space에서 read 를 호출 했다고 해서 HW에서 바로 read 하지 말고 완충버퍼에서 읽어가도록 하세요.
사실
read/write 드라이버는 이미 구현이 되어있는 상태였던지라
해당 방식으로 구현을 한번 해봤었지만
퍼포먼스의 문제가 굉장히 크더군요... ㅠㅠ
오버헤드가 너무 컸었는지 오히려 소프트웨어적으로 처리를 했을때보다 느렸어요.
그건 비밀입니다.
...
말씀하시는 퍼포먼스가 뭔지요?
뭐가 어떻게 그렇게 성능이 안나오길래
다른 방법을 찾아야 겠다고 생각하신건지도 궁금하군요
패킷 포워딩 퍼포먼스입니다.
먼저 질문해놓고 답변자분께 많은 정보를 못드리는건 죄송합니다 ㅠㅠ
이 이상 일에 대해선 발설해선 안될꺼같아서...
그건 비밀입니다.
댓글 달기