spinlock의 이해

홍문화 2011.04.17 20:23 조회 수 : 6949

화창한 봄날 남들은 연인끼리 벚꽃 놀이에 가는데 저는 회사에서 일을 하고 있습니다. ㅠㅠ;

이왕 나온거 머라도 하나 건져가야 되지 않겠냐는 생각에 어제 스터디에서 마지막에 화두가 되었던

유니프로세서에서의 spinlock에 대해 곰곰히 생각을 하다가 놀라운 사실?을 발견하게 되었습니다.


먼저 결론부터 말씀 드리면 유니프로세서에서 스핀락이 preemption disable로 조건부 컴파일 되는것이 아니라

아예 흔적조차 없이 사라진다는 것입니다. 왜냐? spinlock 이라는 매커니즘 자체가 처음부터 SMP에서의 동기화를

위해 만들어 졌기 때문에 유니프로세서에서는 전혀 필요가 없는 것이지요.


이러한 결론에 도달하기 위해서 IQ120의 짱구를 열심히 굴려 댔습니다.ㅋ

자 그럼 과정에대해 말씀 드리겠습니다.

"락을 얻기 이전에 반드시 로컬 인터럽트 (현재 프로세서의 인터럽트 요청)를 비활성화 해야 한다. 이하 생략..." (P.138)

저는 이 문장에서 난관에 봉착합니다. 인터럽트 컨텍스트와 프로세스 컨텍스트간의 임계영역을 동기화 하기 위해서

"인터럽트를 비활성화하고 락을 얻는다."라고 했는데 인터럽트만 비활성화 해도 동기화가 가능해 지는데 왜 락을

얻어야 되는가? 인터럽트 컨텍스트와 프로세스 컨텍스트간에 임계영역이 존재 할 경우 프로세스 컨텍스트에서 임계영역에

진입하기 전에 인터럽트를 비활성화 하고 임계영역을 빠져나올때  인터럽트를 다시 활성화 하는 것만으로도 동기화가

달성되기 때문입니다. 이 의문이 해결되지 않아 고민을 하던 중 저는 책에서 다음과 같은 내용을 발견 하게 됩니다.

"다른 프로세서에서 인터럽트가 발생 할 경우, 그것이 같은 락을 대기한다고 하더라도 락을 가진 코드를 방해하지 않으므로.

이하 생략..." (P.138) 즉! 임계영역을 공유하는 인터럽트가 프로세스 컨텍스트에서 임계영역에 들어가 작업을 수행 중인

프로세서가 아닌 다른 프로세서에서 동시에 처리 될 수 있기 때문에 락을 얻어야 하는 것입니다. 여기까지 이해하자마자

유니프로세서에서 스핀락이 완전히 사라져 버렸습니다.ㅋ


정리하자면 유니프로세서에서 인터럽트 컨텍스트와 프로세스 컨텍스트간의 임계영역을 동기화 하기 위해 스핀락은 전혀

필요 없습니다. 단지 로컬 인터럽트를 비활성화 하고 활성화 하는 것만으로 동기화가 달성 되는것이지요.

스핀락은 처음부터 SMP에서의 동기화를 위해 사용된 것입니다.


그러면 이러한 의문이 기다고 있습니다. 유니프로세서에서도 컨텍스트 스위칭에 대비해 임계영역에 스핀락을 사용해야 하는것이

아니냐? 네 충분히 가능한 질문이고 충분히 사용 가능합니다. 하지만 이를 위해 스핀락을 쓰지 않는다는 것이지요. 왜냐?

스핀락은 애시당초 SMP에서의 동기화를 위해 만들어진 것이기 때문입니다. 그럼 유니프로세서에서는 컨텍스트 스위칭에 대비해

임계영역을 어떻게 보호하냐? 이는 애시당초 스핀락이 아닌 preemption disable이나 세마포어 등등으로 보호되게 설계된

것입니다.


그러므로 유니프로세서 옵션으로 커널 컴파일 시에 스핀락이 완전하게 말끔히 사라지게 되고 사라져도 안전한 것입니다.



끝으로 OT 때 백창우님께서 하신 말씀이 생각 나서 적어봅니다. ^^;

"아이구! 왜 이걸 이제야 알게 되었을까? 이럴 줄 알았으면 진작에 스터디를 할걸!!!"


잘못된 내용과 이해되지 않는 내용이 있으면 댓글 부탁 드립니다.

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2200
1545 버디 알고리즘... 김범환 2007.11.11 7172
1544 책 왔네요. [1] 서정민 2010.11.08 7163
1543 [질문] 선점형 커널이란?? [4] 송형주 2007.09.11 7132
1542 [DKS - 011] Flattened Device Tree 박세율 2012.07.07 7108
1541 elf 의 실행... bin 의 실행... [4] 배병일 2010.04.14 7095
1540 Linux-ARM-Mailing List 게시판 링크 [5] 유경환 2011.08.23 7070
1539 BIG KERNEL 압축 해제 루틴 설명 자료 (2nd edition) file 지현구 2007.05.25 7067
1538 콜백 함수는... [8] 홍문화 2011.05.11 7065
1537 2진수, 16진수, 10진수 변환기 [1] file 맥주 2007.05.21 7039
1536 SMP 지원하는 u-boot source 주소입니다. [2] 박대원 2010.04.05 7023
1535 커널 스택 조사와 질문.. [5] 이종인 2011.04.03 7013
1534 [소개] ARM core 강좌 김동혁 2010.04.16 6998
1533 이번주 1주년 파티?? [2] 노서영 2010.05.24 6996
1532 [ARM중] struct list_head 의 비밀 [2] 홍문화 2012.01.18 6979
» spinlock의 이해 [8] 홍문화 2011.04.17 6949
1530 nested interrupt 관련 참조 문서 유강희 2011.07.11 6910
1529 커널 압축 해제 루틴 설명 자료 [1] file 지현구 2007.05.19 6903
1528 [소개] Cortex-A8 프로세서 아키텍처 과정 런칭 세미나 [1] 김동혁 2010.05.06 6883
1527 ARM AP의 메모리관련 정보 [7] 서정민 2011.03.21 6882
1526 WIKI 페이지 생성했습니다. [1] 권기봉 2010.04.06 6879
XE Login