본문 바로가기

리눅스 스케쥴러의 변천사 O(1), CFS 출처: http://tory45.egloos.com/5167290 CFS 스케줄러는 Con Kolivas의 스케줄러 개선에 기인한다. Ingo Monlar는 커널 2.4의 스케줄러를 대체할 새로운 스케줄러를 작성했었고, 그것이 현재 커널 2.6에 적용된 O(1) 스케줄러였었다. O(1) 스케줄러는 커널 2.4에 가장 많이 백포팅된 알고리즘이었다. 대부분의 커널 2.4 기반 상용 배포판들은 O(1) 스케줄러를 백포팅하였다. 실제로 프로세스의 개수가 많을 때 스케줄러에 의한 성능차이는 현격하게 벌어진다. (책에서는 백포팅하는 법을 소개하고, 성능 비교를 하였다. 불행히도 완전한 백포팅이 아니었기 때문에 책에서 소개한 방법은 완전한 O(1) 스케줄러 백포팅은 아니었다) 커널 2.6에 도입된 O(1) 스케줄러는.. 더보기
O(1) 스케줄러의 문제점과 CFS 스케줄러 출처: http://blog.naver.com/redcultuer?Redirect=Log&logNo=130109802510 ※ O(1) 스케줄러의 문제점 1. nice값 0(timeslice 100ms)을 가지는 두개의 태스크가 실행 된다고 가정하자. 컨텍스트 스위칭은 100ms 간격으로 발생 할 것이다. nice값 20(timeslice 5ms)을 가지는 두개의 태스크가 실행 된다고 가정하자. 컨텍스트 스위칭은 5ms 간격으로 발생 할 것이다. 프로세서가 1000ms 동안 실행 된다고 가정 할 경우 과연 올바른 스케줄링 동작인가? 이와 같은 문제는 nice 값이 절대적인 timeslice를 결정 하는데서 발생한다. 2. nice값 0과 1을 가지는 두개의 태스크가 실행 된다고 가정하자. timeslic.. 더보기
smp_wmb() 함수의 동작과 memory_barrier 개념 출처: http://lksas4-arm11.springnote.com/pages/899174 이백 최근 CPU들은 일련의 명령어들은 실행 순서를 변경하여, 자원을 효율적으로 사용하도록 하는 기능들을 지원한다고 합니다. 실행 순서의 변경은 모순된 결과를 초래하지 않는 범위 내에서 변경되도록 하는 것은 당연합니다. 이 경우 단순히 그 CPU 에서의 연산 결과에 모순이 없을 뿐만 아니라 다른 CPU에서 보았을 경우에도 연산 결과에 모순이 있으면 안됩니다. 실제 메모리 상의 데이터는 다른 CPU로 부터 참조나 갱신을 하기 위해 CPU간r의 동일한 데이터를 참조 할 때 그 데이터의 접근 순서를 제대로 지킬 필요가 있습니다. 이 메모리 접근 순서를 제어하기 위한 구조가 메모리 장벽-Memory Barrier 입니다.. 더보기
리눅스에서 쓰레드 컴파일하고 실행하기 쓰레드를 만드는 소스 #include #include #include #include pthread_t p[3]; void *child1(void *arg) { while(1); } int main(int argc, char** argv) { int err; if ( err = pthread_create(&p[0], NULL, child1, NULL) ) printf("child 1 was not born\n"); if ( err = pthread_create(&p[1], NULL, child1, NULL) ) printf("child 2 was not born\n"); if ( err = pthread_create(&p[2], NULL, child1, NULL) ) printf("child 3 was .. 더보기