Linux 커 널 큐 - kfifo

kfifo 개요
리 눅 스 커 널 에는 아름 다운 데이터 구조 가 많 고 대기 열 kfifo 가 그 중의 하나 입 니 다.kfifo 는 커 널 안의 First In First Out 데이터 구조 로 링 순환 대기 열의 데이터 구 조 를 사용 하여 이 루어 집 니 다.이것 은 경계 가 없 는 바이트 흐름 서 비 스 를 제공 합 니 다. 가장 중요 한 것 은 병렬 무 잠 금 프로 그래 밍 기술 을 사용 합 니 다. 즉, 하나의 입 대 스 레 드 와 하나의 출 대 스 레 드 의 상황 에 사용 할 때 두 스 레 드 는 동시에 조작 할 수 있 고 잠 금 행 위 를 하지 않 아 도 kfifo 의 스 레 드 안전 을 보장 할 수 있 습 니 다.
구조 체 kfifo 의 정의
Linux 2.6 버 전 및 이전 커 널 버 전에 서 kfifo 의 정 의 는 다음 과 같 습 니 다.
struct kfifo {   
    unsigned char *buffer;    /* the buffer holding the data */   
    unsigned int size;    /* the size of the allocated buffer */   
    unsigned int in;    /* data is added at offset (in % size) */   
    unsigned int out;    /* data is extracted from off. (out % size) */   
    spinlock_t *lock;    /* protects concurrent modifications */   
}; 

그러나 현재 새로운 커 널 버 전에 서 이 정 의 를 찾 을 수 없습니다. 또한 kfifo 의 정 의 는 숨겨 져 있 습 니 다. 다음은 linux - 3.19.2 리 kfifo. h 파일 에서 kfifo 의 정의 입 니 다.
#define __STRUCT_KFIFO_COMMON(datatype, recsize, ptrtype) \
	union { \
		struct __kfifo	kfifo; \
		datatype	*type; \
		const datatype	*const_type; \
		char		(*rectype)[recsize]; \
		ptrtype		*ptr; \
		ptrtype const	*ptr_const; \
	}

#define __STRUCT_KFIFO_PTR(type, recsize, ptrtype) \
{ \
	__STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \
	type		buf[0]; \
}

/*
 * define compatibility "struct kfifo" for dynamic allocated fifos
 */
struct kfifo __STRUCT_KFIFO_PTR(unsigned char, 0, void);

몇 개의 매크로 정의 변환 을 거 친 후에 kfifo 의 정 의 는 다음 과 같 습 니 다.
struct kfifo {
	union{
		struct __kfifo kfifo;
		unsigned char *type;
		const unsigned char	*const_type;
		char (*rectype)[0];
		void *ptr;
		void const *ptr_const;
	}
	unsigned char buf[0];
};

그 중 구조 체kfifo 의 정 의 는 다음 과 같 습 니 다.
struct __kfifo {
	unsigned int	in;
	unsigned int	out;
	unsigned int	mask;
	unsigned int	esize;
	void		*data;
};

kfifo 관련 조작
원본 주소 1:https://blog.csdn.net/linyt/article/details/53355355 원문 주소 2:http://blog.csdn.net/zmrlinux/article/details/48601877

좋은 웹페이지 즐겨찾기