본문 바로가기

Job Notes/Embedded System & RTOS

list_head를 사용하는 이유

리눅스 커널 Q&A 게시판 펌
(
http://linux.flyduck.com/cgi-bin/webboard/wwwboard.cgi?db=lkqna&mode=read&num=1587&page=9&ftype=6&fval=&backdepth=1)

>옛날 커널에서는 prev , next를 사용했었는데
>요즘에는 list_head 를 사용하는것같습니다.
>list_head를 사용하는 이유는 무엇인지 궁금합니다.
>prev,next를 쓰는것이 더 직관적이지 않을까요?

2.4 커널에서부터 linked list 구현이 아주 일반화되어서 쉽게 linked list를 만들 수 있는데, list_head는 이 linked list head를 정의하는 자료구조라고 이해하면 될 것 같습니다. list_head만 있으면 linked list를 간단하게 만들 수 있다... 이게 이유라고... :-)

>하나더 물어볼게 있는데요....
>list_for_each_safe 라는 게 list.h에 있던데 주석문을 보니 삭제에 대해서 >보호한다고 되어있습니다.
>그런데 이해가 안되는것이 ... 현재 루프를 돌고있는 item에 대해서만
>삭제에 대해서 안전한것 아닌가요?
>예를들어서, A-B-C-D-E  이런식으로 연결되어있을때
>list_for_each를 쓴다면  C를 순회하는도중에 C가
삭제되면 C->next를 얻을수없게되는데......
>list_for_each_safe를 쓰면 C를 순회하는 도중에 C가 삭제되더라도 C->next에대한 복사본을 유지하고 있으니까 이상이 없다고 이해했는데...맞게 이해한것인가요?
>
>하지만, C를 순회하는 도중에  C와 D가 모두 삭제되었다면 속수무책 아닌지요.
>차라리 깔금하게 스핀록 같은걸로 보호하고 list_for_each를 사용하는게 낫지 않을까요?

list_for_each_safe() 함수가 동작하는 방식은 잘 이해하셨습니다. 그렇다면 이를 사용하는 이유는... 코드에서 "linked list를 검색해서 원하는 것을 발견하면 지운다" 같은 일을 하게 되면 list item을 차례로 보면서 해당하는 것이 있으면 현재 item을 지우게 될 것입니다. 이 경우 다음 item을 찾는데 문제가 없게 만드는 것입니다. list_for_each_safe()는 synchronization을 위한 것이 아닙니다.
list를 traverse할 때 현재 item을 지워도 문제가 없게 하기 위한 것입니다.