본문 바로가기

한국으로/임베디드 리눅스25

9.3 커널 동기화 9.2 커널 동기화9.2.1 동시성 문제공유자원에 접근하는 코드영역을 '임계영역'이라고 한다.이 임계영역이 동시에 실행되면 경쟁상태가 되어 동시성 문제가 발생할 수 있다. 동시성 문제의 원인1) 인터럽트: 커널 코드가 공유 자원을 사용하는 중에 인터럽트가 발생하여 인터럽트 핸들러가 공유 자원을 사용함.2) 지연함수: 커널 타이머나 tasklet이 특정 함수를 호출함.3) 선점형 커널: 프로세스가 커널에서 실행 중일 때 다른 프로세스를 스케줄링할 수 있음.4) SMP 시스템: 2개 이상의 CPU가 동시에 공유 자원에 접근. 9.2.2 세마포어태스크가 임계영역에 도달하면 세마포어를 1 감수시킨 후 진입한다.세마포어가 0인 경우 태스크는 잠이 든다. (임계영역에 다른 태스크가 있는 경우임)태스크가 임계영역을 .. 2018. 7. 6.
9.2 지연 작업 9.2 지연 작업9.2.1 커널 타이머커널 타이머를 이용하면 일정 시간 후에 정해진 작업을 할 수 있다. 또는 정해진 작업 사이에 시간 간격을 줄 수 있다.이 때 호출되는 함수가 타이머 핸들러인데, 타이머 핸들러는 비동기적으로 실행되는 인터럽트 문맥이다.따라서 인터럽트 핸들러와 같이 제약이 있다. 이를테면 sleep과 스케줄링이 불가능하다는 것.하지만 인터럽트 핸들러와 다르게 하드웨어 인터럽트는 활성화되어있는 상태임! 9.2.2 커널 타이머 APIstruct timer_list;unsigned long expires;jiffies가 expires에 도달하면 타이머 핸들러 호출. void (*function)(unsigned long);타이머 핸들러를 가리킨다. unsigned long data;타이머 핸.. 2018. 7. 6.
9.1 시간처리 9.1 시간처리9.1.1 jiffies 카운터리눅스에서 사용하는 전역 system timer. 시스템에 내장된 타이머에서 주기적 인터럽트가 발생하는 것.jiffies 는 부팅 시에 0으로 초기화되고, 1초에 HZ만큼 증가한다.예를 들어, HZ가 100이라면 jiffies는 1초에 100씩 증가한다. 9.1.2 Long Delayjiffies로 표현하는 지연. Busy Waitingt1 = jiffies + HZ;while(time_before(jiffies, t1)) cpu_relax(); cpu_relax() 는 cpu가 쉬는 것.지연시간이 정확하지만, 성능 저하가 발생한다는 단점이 있다. 양보하기t1 = jiffies + HZ;while(time_before(jiffies, t1)) schedule(.. 2018. 7. 6.
8.1 인터럽트 8.1 인터럽트8.1.1 인터럽트 핸들러CPU가 커널 코드를 실행 중일 때는 프로세스 문맥이나 인터럽트 문맥으로 구분된다. 프로세스 문맥프로세스와 관련된 커널 동작임. 프로세스 문맥인 경우는, 1) 유저 영역에서 실행 중인 프로세스 또는 스레드가 시스템콜에 의해 커널에 진입한 경우.2) 커널 스레드를 실행 중인 경우. 인터럽트 문맥인터럽트 발생 시 실행되는 커널 동작임.인터럽트 문맥의 특징은, 1) sleep 불가. 따라서 wait(), kmalloc(), 세마포어, 뮤텍스 등 sleep이 가능한 함수를 사용할 수 없다.2) 스케줄링 불가. 따라서 schedule() 등 함수를 사용할 수 없다. (타이머 인터럽트 비활성화 상태이기 떄문)3) 인터럽트 핸들러와 공유되는 자원은 원자 변수나 스핀락으로 보호되.. 2018. 7. 6.