struct iov_iter의 목적은 무엇입니까? 이 구조체는 struct iovec 대신 Linux 커널에서 사용됩니다. iter 인터페이스에 대한 좋은 문서는 없습니다. LWN에서 한 문서를 찾았지만 이해할 수는 없습니다. Linux 커널에서 사용되는 iter 인터페이스를 이해하는 데 도움을 주실 수 있습니까?Linux에서 구조체 iov_iter의 목적은 무엇입니까?
답변
의 목적 중 하나는 LWN article이 앞에 있으며, 여러 청크로 데이터를 처리하는 것입니다.
여러 개의 개별 버퍼가 있고 포인터로 연결되어 있고 한 번에 읽기/쓰기를 원한다면 이것을 여러 개의 읽기/쓰기 연산으로 대체 할 수 있지만 어떤 경우에는 의미/쓰기 경계 - 그래서 작전은 단순히 의미를 변경하지 않고 나눌 수 없습니다. 또 다른 방법은 연속적인 버퍼 안팎으로 모든 데이터를 복사하는 것입니다. 이는 낭비적이고 모든 비용을 들이지 않고 피하고 싶습니다.
POSIX readv
/writev
또는이 경우에는 iov_iter
API를 사용하면 시스템 호출 수가 줄어들어 오버 헤드가 줄어 듭니다. 커널에서는 컨텍스트 스위치와 같은 값 비싼 연산으로 변환되지 않지만 여전히 사소한 문제입니다. 드라이버는 가까운 장래에 더 많은 정보가 있을지 알 수 없을 때 많은 작은 덩어리보다 더 많은 데이터 덩어리를보다 효율적으로 처리 할 수 있습니다. 특히 iov_iter
을 알지 못하더라도 네트워크 드라이버가 그렇습니다. 거기에 사용되고있다.
같은 상황의 또 다른 예는 I/O가 원시 디스크 디바이스인데, I/O는 블록 경계의 시작과 끝만 허용합니다. 사용자는 가끔 임의의 액세스를 수행하거나 블록의 시작 부분에서 버퍼의 작은 부분을 덮어 쓰거나 나머지 부분을 0으로 원할 수도 있습니다. 그와 같은 시나리오는 정확히 iovec
을 목표로합니다. iovec
을 만들 수 있습니다.이 블록 버퍼는 여러 개의 개별 버퍼에 분산 된 전체 블록 작업을 수행 할 수있게 해줍니다.이 버퍼에는 읽은 블록의 일부를 덤프하고 처리에 신경 쓰지 않는 "스크래치"버퍼, writev
의 끝에서 체인의 연쇄를위한 제로화 된 버퍼는 나머지 블록을 제로화합니다. 다시 말하지만, 나는 당신을 지적해야한다 은 연관된 복사 및/또는 제로화와 함께 인접한 버퍼를 사용하지만, iov_iter
API는 오버 헤드가 적고 코드를 읽을 때 더 쉽게 추론 할 수있는 대체 추상화를 제공합니다.
벡터 처리 또는 병렬 컴퓨팅에서 이러한 연산에 대한 용어는 "분산/수집 처리"입니다.