2016-12-10 1 views
-1

struct iov_iter의 목적은 무엇입니까? 이 구조체는 struct iovec 대신 Linux 커널에서 사용됩니다. iter 인터페이스에 대한 좋은 문서는 없습니다. LWN에서 한 문서를 찾았지만 이해할 수는 없습니다. Linux 커널에서 사용되는 iter 인터페이스를 이해하는 데 도움을 주실 수 있습니까?Linux에서 구조체 iov_iter의 목적은 무엇입니까?

답변

0

의 목적 중 하나는 LWN article이 앞에 있으며, 여러 청크로 데이터를 처리하는 것입니다.

여러 개의 개별 버퍼가 있고 포인터로 연결되어 있고 한 번에 읽기/쓰기를 원한다면 이것을 여러 개의 읽기/쓰기 연산으로 대체 할 수 있지만 어떤 경우에는 의미/쓰기 경계 - 그래서 작전은 단순히 의미를 변경하지 않고 나눌 수 없습니다. 또 다른 방법은 연속적인 버퍼 안팎으로 모든 데이터를 복사하는 것입니다. 이는 낭비적이고 모든 비용을 들이지 않고 피하고 싶습니다.

POSIX readv/writev 또는이 경우에는 iov_iter API를 사용하면 시스템 호출 수가 줄어들어 오버 헤드가 줄어 듭니다. 커널에서는 컨텍스트 스위치와 같은 값 비싼 연산으로 변환되지 않지만 여전히 사소한 문제입니다. 드라이버는 가까운 장래에 더 많은 정보가 있을지 알 수 없을 때 많은 작은 덩어리보다 더 많은 데이터 덩어리를보다 효율적으로 처리 할 수 ​​있습니다. 특히 iov_iter을 알지 못하더라도 네트워크 드라이버가 그렇습니다. 거기에 사용되고있다.

같은 상황의 또 다른 예는 I/O가 원시 디스크 디바이스인데, I/O는 블록 경계의 시작과 끝만 허용합니다. 사용자는 가끔 임의의 액세스를 수행하거나 블록의 시작 부분에서 버퍼의 작은 부분을 덮어 쓰거나 나머지 부분을 0으로 원할 수도 있습니다. 그와 같은 시나리오는 정확히 iovec을 목표로합니다. iovec을 만들 수 있습니다.이 블록 버퍼는 여러 개의 개별 버퍼에 분산 된 전체 블록 작업을 수행 할 수있게 해줍니다.이 버퍼에는 읽은 블록의 일부를 덤프하고 처리에 신경 쓰지 않는 "스크래치"버퍼, writev의 끝에서 체인의 연쇄를위한 제로화 된 버퍼는 나머지 블록을 제로화합니다. 다시 말하지만, 나는 당신을 지적해야한다 은 연관된 복사 및/또는 제로화와 함께 인접한 버퍼를 사용하지만, iov_iter API는 오버 헤드가 적고 코드를 읽을 때 더 쉽게 추론 할 수있는 대체 추상화를 제공합니다.

벡터 처리 또는 병렬 컴퓨팅에서 이러한 연산에 대한 용어는 "분산/수집 처리"입니다.