커널 스위칭 시간 측정 실험을 해봤습니다.

gurugio의 이미지

http://asmlove.co.kr/zVfaE6/wiki.php/gurugio/clock_gettime

시스템 콜이 호출되면서 커널 레벨로 진입하는 시간이 얼마나 될지 궁금해서

실험을 한번 해봤습니다.

대략 10us라고 결과를 얻었는데

실험을 제대로 했는지 모르겠습니다.

시간을 정확하게 측정하는 방법이 참 애매하네요..

임베디드 장비에서 30us 내에 데이터를 만들고 네트워크로 전송해야 하는데

그냥 로우 소켓을 사용할지 드라이버에서 이더넷 칩으로 바로 데이터를 써야할지 고민되네요..

어쨌든 그냥 시험삼아 해봤습니다. 더 좋은 방법이 있으면 말씀해주세요. 고쳐서 해보겠습니다.

지금 CE linux 행사장으로 출발~~~

사랑천사의 이미지

흐흠. 어느 정도 생각은 해 보았는데... 그럼 User->Kernel 스위칭을 안 하도록 프로그램을 짜는게 무조건 좋을지...(속도를 위해서는 그래야 겠지만...) malloc만 해도 그럼 엄청 써먹겠군요.
----
Lee Yeosong(이여송)
E-Mail: yeosong@gmail.com
HomePage: http://lys.lecl.net/
Wiki(Read-Only): http://lys.lecl.net/wiki/
Blog: http://lys.lecl.net/blog
MSN: ysnglee2000@hotmail.com
----
절이 싫으면 중이 떠나는 것이 아니라, 절이 싫으면 중이 절을 부숴야 한다.

사람천사

Necromancer의 이미지

malloc()은 C라이브러리에 들어있는 함수고 실제 시스템에서 직접 메모리 할당받으려면 brk()나 mmap()으로 받아야 합니다. 그리고 여기에는 제약사항도 있고요(페이지 단위로 할당받아야 한다든지 등등). malloc()은 사용자의 필요에 따라 가변 블록을 할당받을수 있도록 이들을 적절히 wrap한 함수인데 알고리즘을 어떻게 구현하느냐에 따라 크게 달라지게 됩니다.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

blkstorm의 이미지

5,6년전에 들은 오래된 이야기입니다만,

vxworks의 경우에는 user/kernel mode switching이 없다고 합니다. 항상 kernel mode로 돌아가고 있다는 말이죠.

이러한 동작 방식이 실제로 임베디드 시스템에서는 성능 향상을 가져오고, vxworks의 마케팅에서도 강조가 되었던 것으로 기억합니다.

하지만, (잘 아시겠지만) 보안 측면에서는 별로 바람직하지 않다고 봐야지요. 만약 포인터 연산을 잘못해서

user process가 kernel memory 영역을 침범하더라도 privilege exception이 뜨지를 않기때문에 그다지 안전한 구조라고 보기는 힘들것같습니다.

kiwist의 이미지

ltt 나 strace 같은걸 쓰면 더 편리하게 스위칭 시간을 측정할 수 있을 것 같은데요?

gurugio의 이미지


앗!! 그런가요?
감사합니다. 조사해서 해보도록 하겠습니다.

그런 툴들이 임베디드 보드에서도 돌아가면 좋겠는데... 돌아가겠지요?

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.

vamf12의 이미지

쩝... 시스템콜은 최대한 자제 해야 하는 것이군요...