본문 바로가기
한국으로/임베디드 리눅스

9.3 커널 동기화

by 영킴. 2018. 7. 6.

9.2 커널 동기화

9.2.1 동시성 문제

공유자원에 접근하는 코드영역을 '임계영역'이라고 한다.
이 임계영역이 동시에 실행되면 경쟁상태가 되어 동시성 문제가 발생할 수 있다.

동시성 문제의 원인

1) 인터럽트: 커널 코드가 공유 자원을 사용하는 중에 인터럽트가 발생하여 인터럽트 핸들러가 공유 자원을 사용함.
2) 지연함수: 커널 타이머나 tasklet이 특정 함수를 호출함.
3) 선점형 커널: 프로세스가 커널에서 실행 중일 때 다른 프로세스를 스케줄링할 수 있음.
4) SMP 시스템: 2개 이상의 CPU가 동시에 공유 자원에 접근.




9.2.2 세마포어

태스크가 임계영역에 도달하면 세마포어를 1 감수시킨 후 진입한다.
세마포어가 0인 경우 태스크는 잠이 든다. (임계영역에 다른 태스크가 있는 경우임)
태스크가 임계영역을 빠져나가면 휴면 중인 태스크가 깨어나고 임계영역에 접근할 수 있다.

세마포어 획득

세마포어를 1 감소시킨 후 임계 영역에 진입한다.

세마포어 반납

임계 영역을 빠져나갈 때 세마포어를 1 증가시킨다.




9.2.3 스핀락

세마포어는 임계영역에 도달한 태스크를 잠들게 하고, 스핀락은 spinning시킨다. (기다리게 만드는 것)
임계영역에 태스크가 오래 머문다면 기다리는 spinning 작업이 비효율적일 수 있다.
따라서 스핀락은 임계영역 코드가 짧은 경우 세마포어보다 효율적일 수 있다.

스핀락 획득 후 반납 전까지 선점이 비활성화되므로 스핀락 내의 코드는 원자적으로 실행되어야 함.
원자적이라는 것은 다른 태스크를 스케줄링할 수 없고, 해당 태스크가 끝날 때까지 그 태스크만 실행된다는 것.
sleep이 불가능하기 때문에 원자적인 실행은 인터럽트 문맥에서도 사용할 수 있다. 참고로 세마포어는 sleep 가능.
단, CPU를 계속 점유하는 상태이기 때문에 작업을 빠르게 처리해야한다.




'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

9.2 지연 작업  (0) 2018.07.06
9.1 시간처리  (0) 2018.07.06
8.1 인터럽트  (0) 2018.07.06
7.3 문자 드라이버  (0) 2018.07.01
7.2 모듈  (0) 2018.07.01
7.1 디바이스 드라이버  (0) 2018.07.01
5.4 파일시스템  (0) 2018.07.01
5.3 메모리 관리  (0) 2018.06.29