2004. 5. 27. 00:01
     

안녕하십니까 까마굽니다 (__)오늘 번쩍 떠오른게 있어서 그걸 처리하기위해 노트북을 폈는데,어떤 부분이냐 하면 Serial을 통해 파일을 수신하는 부분이었습니다.잘되는 부분이긴한데, 간혹 보면 파일이 다 수신되지 않는 상황이 있어서 코드를 보게 됬는데요, 머 일단 속도를 좀 높이기 위해 약간의 삽질(??)을 하고실행을 딱 시키는 순간.. 앗찔하더군요.. ㅡ_ㅡ;;;아.. 글쎄.. 한 Task가 Serial Read를 줄기차게 요청하는데, 문제는 이놈이CPU를 독점하고 있던 것이었습니다.쿠.. 쿨럭;;;;사실 독점할만할 이유가 없었기때문에 상당히 당황스러웠는데 코드를 보는순간그럴수도 있겠다는 생각이 들더군요.코드는 대략 이렇습니다.while( 1 ){ dwRead = read( dwSerialFd , vbBuffer , sizeof( vbBuffer );}int read( ... ){  InNotSwitchingSection();  readFromSerial(...);  OutNotSwitchingSection();}코드를 보시면 InNotSwitchingSection() 이 스위칭을 불가하는 부분이구요,OutNotSwitchingSection()이 다시 가능하게 하는 부분입니다.요게 계속 루프를 돌니까, Timer Interrupt가 발생해서 스위칭을 하려고 보니InNotSwithchingSection()이 되어 스위칭 불가한 상황이 많아서 거의 스위칭을 하지 못하고 있더군요.사실 소비하는 시간으로 보면 스위칭 가능보다 불가로 있는 시간이 더긴....그래서 운이 좋으면 스위칭 될때고 있고.. ㅡ_ㅡ;;;;; 그런 상황이었습니다..그래서 이를 해결하고자.. kOutNotSwitchingSection()에서 만약 태스크가 자기에게 할당받은 Time Slice를 다 사용했을 경우, 강제로 다른 태스크로 스위칭 해주어 골고루 CPU를 사용할 수 있게 수정했습니다. 지금까지는 별 이상이 없어보이는데, 역시 두고봐야하겠죠..흠... 하다보니.. 이런 경우도 생기는 군요..그럼 좋은하루 되세요 (__)

Android App

Posted by 호기심 많은 kkamagui(까마귀, 한승훈)

댓글을 달아 주세요

  1. Favicon of http://blog.naver.com/sanjuro1 BlogIcon sanjuro1 2004.05.27 02:14  댓글주소  수정/삭제  댓글쓰기

    전 허접이지만...그냥 생각해 봤거든요... 태스크 하나가 그냥 독점하기 보다는...
    리눅스 커널 쪽 보면, Waiting 이나 Sleep 이 있잖아요. 링크드 리스트도 여러 개 있고,
    1. 현재 실행중인 태스크들의 리스트
    2. Waiting 하는 태스크들의 리스트
    이런거요...
    시리얼을 읽어 들이면서도 시리얼에서 인터럽트 걸리면, Waiting 하는 링크드 리스트에서 걔네들을 다 깨워놓고(깨우면, 실행 중인 리스트에 들어가겠죠), 깬 애들이 각자 그 상황인지(시리얼을 기다리는 애는 시리얼에 뭔가가 들어왔는지를 확인하겠죠) 확인하고, 아니면, 다시 Waiting 리스트에 들어가는...
    그리고 실행중인 태스크들의 리스트만 타이머로 태스크 스윗칭 해주면 되지 않을까요?시리얼 읽는 동안 한 애가 꽉 잡고 있으면, 다른 애들이 불쌍하잖아요. (^ ^);
    리눅스 디바이스 드라이버 책에 이러한 내용이 나오거든요.
    그냥 참고가 되시지 않을까하고 얘기해 본겁니다.(^ ^);

  2. Favicon of http://blog.naver.com/sanjuro1 BlogIcon sanjuro1 2004.05.27 04:32  댓글주소  수정/삭제  댓글쓰기

    음...리눅스에서도 Waiting 함수는 커널함수이고...사용하려면, 역시 디바이스 드라이버나 시스템콜 같은 걸로 태스크가 커널모드로 들어갔다 나와야 하는지...

  3. Favicon of http://comeng.ce.knu.ac.kr BlogIcon 한승훈 2004.05.27 10:08  댓글주소  수정/삭제  댓글쓰기

    안녕하십니까 까마굽니다 (__)

    리눅스 디바이스 드라이버라.. 전 2장까지 밖에 못봤는데.. ㅋㅋㅋ

    네.. 말씀 감사드리구요~ Keyboard랑 Mouse같은 경우는 말씀하신데로 Event를

    커널에 등록시키고 자는 쪽으로 되어있습니다.

    시리얼쪽은 이벤트를 등록하지 않고 그냥 계속해서 Queue를 모니터링하는

    머 말하자면 polling 방식으로 구현되어있는데요, 이렇게 한 이유는

    시리얼로 파일 송수신을 하면, 데이터가 줄기차게 계속 들어오게되죵.. >_<

    이런상황에서 Event List에 넣고 자고 하는것 자체가 약간의 오버헤드라고 보는데..

    키보드나 마우스 같은 경우는 사실 데이터가 들어오는시간보다 대기하는 시간이

    더 긴데요, 시리얼 같은 경우는 파일 송수신을 하다보니 대기시간이라는게

    거의 없군요.. 데이터가 오면 오는 족족 퍼줘야 하니, 굳이 Event에 넣고 Sleep을

    하지 않았습니다.

    머 독점 문제도 이제 Out...Section()을 수정해줌으로해서 본의 아닌(??) 독점을

    해결했으니.. 머 괜찮다고 보는데.. >_<

    산주로 님의 생각은 어떠신지요??