'Linux Kernel'에 해당되는 글 2건

 Top Half? Bottom Half? 이게 뭐하는 녀석이지?

 용어만 보면 정확히 어떤 개념인지 와닿지가 않습니다.

 HW 인터럽트가 발생하였다고 가정하고,
 인터럽트가 발생하면 보통 아래와 같이 처리를 하게 됩니다.

    step 1. 인터럽트 disable
    step 2. 해당 인터럽트에 관련된 기능 동작
    step 3. 인터럽트 enable

 인터럽트가 발생하게 되면 우선 인터럽트 기능 자체를 disable 하게 됩니다. 
 지금 발생한 인터럽트에 관련된 기능을 모두 처리하기 전까지는 다른 인터럽트들은 무시하기 위해서입니다.
 인터럽트에 대한 처리가 모두 완료되면 인터럽트 기능을 enable 하고 기능을 종료하게 됩니다.

 여기서 간단히 생각해 볼 수 있는 것이 무엇이냐면

 "인터럽트 처리를 하는 시간이 길면 길수록 시스템이 멈춘것 같이 보일 수 있다"

 입니다. 

 예를 들어서 네트웍 패킷이 들어왔는데 패킷 처리 시간이 1초라면 패킷을 처리하는 동안은 키보드 입력도 안되고, 마우스 입력도 안되는 상황이 벌어지게 됩니다. 

 이런 상황을 개선하고자 Top half 와 Bottom half 라는 개념을 생각해 내게 되었습니다. 

 어떤 개념이냐면,

 "인터럽트가 발생했을때 데이터를 가져오는 등의 기능은 반드시 바로 처리해야 하고 속도도 빠르니까 데이터 가져오는 것까지만 잽싸게 처리하고, 그 데이터를 가져온 이후 동작은 꼭 지금 해야 하는 것은 아니니 나중에 처리하자"

 라는 것이지요.

 여기서 말하는

 데이터 가져오는 동작 : Top half
 가져온 데이터를 처리하는 동작 : Bottom half


 라고 부르기로 한 것이 Top half 와 Bottom half 의 개념입니다. (다시 설명하면 빠른 동작 하는 녀석은 Top half 라 부르기고 하고 느린 동작 하는 녀석은 Bottom half 라고 부르자 입니다. )

 window NT 계열에서는  "Deferred Procedure Call", "Asynchronous Procedure Call" 등과 같은 개념으로 부르고 있습니다. 

 인터럽트가 발생하는 Top half 동작부터 잽싸게 해치웁니다. 이렇게 하면 속도 저하를 느끼기가 어렵겠지요?
 그럼 Top half 동작을 통해서 가져온 데이터를 처리하는 느린 동작은 언제 시작하게 될까요?

 그것을 위해서 필요한 여러가지 기능이 있는데 가장 대표적인 것이 work_queue 입니다.

 work_queue 는 커널이 제공하는 기본 기능입니다.

 이름 대로 work(=function) 들을 queue 에 넣어서 관리하는 기능인데 work(=function) 들을 work_queue 에 넣어 주면 Top half 동작이 완료된후 차례대로 work(=function) 들을 호출해서 Bottom half 기능을 수행해 주게 됩니다.

 work_queue 에 대한 자세한 내용은 따로 다루도록 하겠습니다.



 
 

 

'development' 카테고리의 다른 글

[etc] 네트웍 용어 정리  (0) 2012.03.06
[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] 스핀락  (1) 2012.01.04
[program] Makefile  (0) 2012.01.04
[kernel] 커널 쓰레드  (0) 2012.01.04
블로그 이미지

김유석0

,
completion(완료)는 kernel 동기화 기법중 하나입니다. 

API 는 아래와 같습니다.

#include <linux/completion.h>

DECLEAR_COMPLETION(struct completion comp);
init_completion(struct completion *comp);
void wailt_for_completion(struct completion *comp);
void complete(struct completion *comp);
void complete_all(struct completion *comp);

1. wait 을 걸때

#include <linux/module.h> 
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/time.h>

struct completion comp;

static int wait(void)
{
  init_completion(&comp);
  wait_for_completion(&comp);


1. wait 을 풀때

#include <linux/module.h> 
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/time.h>

struct completion comp;

static int un_wait(void)
{
  complete(&comp);



풀 동작하는 샘플 코드는 아래와 같이 첨부 파일을 참조 바랍니다.

completion.c

Makefile

 
블로그 이미지

김유석0

,