저번 토요일에 논쟁거리 였던 스핀락에 대한 제 생각을 정리해보겠습니다.(틀리다면 지적해주세요)

 

먼저 스핀락을 말하기 전에 커널에서 동기화가 필요한 부분에 대해서 설명 할께요

인터럽트 동기화를 위한 스핀락도 사용 커널에서의 동기화랑 비슷하다고 생각합니다.

따라서 커널 동기화 부분만 예를 들겠습니다.

 

1. UP에서 커널 동기화 문제

 

실제로 유저단에서 프로그램이 돌고 있다가 시스템 콜로 커널로 진입합니다.

 

(질문1 :커널에 진입하기전에 유저단에서 C라는 자원을 가지고 작업하고 있다가 커널로 진입하여 똑같은 C라는 자원을 접근할 경우가 있나요??(인터럽트 또는 시스템콜 으로)  제 생각으로는 message massing 방법에서 이런 경우가 있을 수도 있다고 (억지스러운)생각은 하지만  이럴 겨우는 없다고 생각이 듭니다.)

 

1> 가능성 1

이때, 커널에서 동기화 문제는 커널에서의 A라는 자원을 가지고 작업을 하고 있는데 B라는 인터럽트가 들어와서

현재 커널code를 선점하는 경우 입니다. 이때 B 인터럽트 핸들러(top half)에서 A라는 자원을 접근 하면 동기화 문제가 발생합니다.

 

따라서 커널에서 A라는 자원을 가지고 작업을 하기 전에 인터럽트 를 disable해야 합니다.

 

2> 가능성 2

그리고 만약 커널이 선점형이라면 커널에서 D라는 자원을 작업하다가 선점 된 경우

다른 프로세스가 똑같은 방식으로 시스템 콜로 커널로 진입하여 D라는 자원에 접근하는 경우 동기화 문제가 발생합니다.

(만약 커널선점형이 아니라면 생각할 필요도 없겠죠)

 

따라서 커널에서 D라는 자원을 가지고 작업을 하기 전에 커널을 preempt disable 해야합니다.

 

UP에서는 결론적으로 커널에서 공유 자원을 사용하기 전에는 인터럽트를 disable 하고 preempt disable 해야합니다.

(리눅스에서 thread_info 구조체에서 (스핀락 같은)락을 할때마다 preemptCount??? 변수가 1씩 증가한다고 합니다. 그래서 그 변수가 0 이 아니면 선점이 불가능하다고 하더군요)

 

커널은 처음엔 UP만을 고려하여 작성 되었기 때문에 만약 SMP환경으로 넘어 간다면 문제점이 발생합니다.

 

2. SMP에서 커널 동기화 문제

A와 B라는 CPU가 있다고 가정한다면,

 

먼제 A라는 CPU에서 유저단에서 프로그램이 돌고 있다가 시스템 콜로 커널로 진입합니다.

그리고 커널에서 공유 자원 E를 접근 하기 전에 위에서 언급한 모든 가능성을 없애기 위해서

preempt disable 하고 인터럽트도 disable 합니다.

 

하지만 여기서 문제가 발생하는데요, 바로 다른 B라는 CPU에서 공유 자원 E를 접근 할 수 있다는 겁니다.


따라서 커널 개발자들이 생각해 낸 것이 바로 스핀락의 개념입니다.

 

스핀락을 걸고 커널에서 작업을 한다면  B라는 CPU에서 공유 자원 E를 접근 할 수 없습니다. (A에서 스핀락을 풀 때 까지)

A라는 cpu 커널에서는 락이 걸린 상태에서 preempt 될 수 없으므로 스핀락은 언젠가 반드시 풀고 선점되게 됩니다.

 

B 라는 cpu에서는 계속적으로 A에서 스핀락 풀때까지 pulling 하고 있다가 풀리면 E라는 공유 자원에 접근하게 됩니다.

 

따라서 정리하면 스핀락이라는 개념은 결국 CPU끼리 빠른 동기화 처리를 하기 위해 생겨난 UP에서 없었던 개념입니다.

(아 SMP에서 두 cpu간 동기화가 꼭 스핀락만 있는 것은 아닌 것 같습니다, 다만 빠른 처리를 위해서 스핀락이 생긴  것 같아요

SMP 환경의 이점을 활용하기 위한 동기화 방법이 스핀락인 것 같습니다. :D)

 

(질문 2 : 스핀락은 유저 단에서 사용될 이유도 없을 것 같은데요?)

(질문 3 : 세마포어 커널에서 사용 가능 하겠죠? )

 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2197
1585 Linux Device Model [2] file 김민호 2011.05.22 8459
1584 system_call 의 swapgs 인스트럭션에 대하여 [2] 지현구 2007.09.16 8438
1583 fork()와 vfork()의 차이점과 COW(Copy On Write) [1] 아폴로 2013.05.02 8340
» 스핀락에 대한 나름대로의 정리와 3가지 질문.. [19] 이종인 2011.04.25 8335
1581 이번주 논의 사항 [2] 남현우 2008.05.10 8202
1580 죄송합니다. [1] 송형주 2008.05.13 8106
1579 스터디 장소 예약 했습니다. [13] 장병남 2010.04.05 8067
1578 [투표]이번주 모임 장소 투표해주세요. [15] 나영찬 2010.04.05 8014
1577 init_task의 thread info의 cpu값 설정. [8] 유경환 2011.10.21 8010
1576 ARM TCM Tightly Couple Memory a 2010.04.10 7954
1575 어제 sched_init()을 끝냈습니다. [1] 윤석훈 2010.08.22 7921
1574 [의미] Memory Barrier [10] 맥주 2007.12.17 7890
1573 ARMv8 아키텍쳐 관련 읽을거리 [3] K 2013.05.06 7829
1572 namespace file 유강희 2011.06.10 7824
1571 어제는 모두 잘 들어가셨나요'ㅅ' ㅎㅎㅎ [3] file 조은지 2010.04.11 7710
1570 2012.4.14 스터디 [6] 이한울 2012.04.14 7695
1569 smdk2440보드 회로도. [3] 김희근 2008.12.17 7690
1568 4/3 ARM C Study group 회의 내용 [10] file 강효민 2010.04.03 7670
1567 이제 start_kernel()에 함수가 38개밖에 안남았네요.. [4] 윤석훈 2010.11.30 7634
1566 리눅스 커널 심층분석 (4장 ~9장) 요약부분 [1] file 박재성 2011.06.03 7631
XE Login