Làm thế nào để mèo 'biết' kích thước khối tối ưu để sử dụng?


7

Từ việc đọc này , dường như khi sao chép dữ liệu vào một ổ cứng khác, cat sẽ tự động sử dụng kích thước khối tối ưu (hoặc rất gần nó).

Tôi tự hỏi làm thế nào nó xác định kích thước khối tối ưu, và liệu phương pháp mà mèo sử dụng có thể được áp dụng cho dd bằng cách nào đó.

Câu trả lời:


10

Vòng lặp chính của GNU GNU, trong trường hợp đơn giản nhất là (hàm simple_cattừ cat.c):

while (true)
    {
        /* Read a block of input. */
        n_read = safe_read (input_desc, buf, bufsize);

        /* ... */
    }

Sau đó, câu hỏi trở thành "làm thế nào được bufsizethiết lập?" Câu trả lời là nó sử dụng io_blksize( insize = io_blksize (stat_buf)), được định nghĩa như sau:

io_blksize (struct stat sb)
{
  return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}

trong đó ST_BLKSIZE cho ý tưởng của hệ điều hành về kích thước khối I / O ưa thích của hệ thống tệp (như được truy cập bằng cách sử dụng stat) và IO_BUFSIZE được định nghĩa là 128 * 1024 (128KB). Đây là một đoạn trích của stattài liệu tòa nhà Linux :

blksize_t st_blksize; /* blocksize for file system I/O */ (...)

The st_blksize field gives the "preferred" blocksize for efficient
file system I/O.   (Writing to a file in smaller  chunks may cause
an inefficient read-modify-rewrite.)

Vì vậy, có vẻ như con mèo GNU sẽ đọc trong các khối 128KB hoặc kích thước khối I / O được đề xuất của hệ thống tệp, tùy theo kích thước nào lớn hơn.


Để hiểu sâu hơn, có lẽ bạn nên đề cập đến việc ST_BLKSIZE đến từ đâu - để giúp OP hiểu rằng đây không phải là "ma thuật" mà là một thuộc tính tệp có thể được truy vấn stat(2).
Andreas Wiese

Điểm tốt, Andreas. Tôi đã cập nhật câu trả lời của mình để nói thêm một chút về st_blksize.
dhag

Vì vậy, tôi sẽ sử dụng stat -f -c %s fileđể tìm kích thước khối của hệ thống tập tin trong đó tập tin đầu vào là? Không phải kích thước khối của hệ thống tệp nơi tệp đầu ra đang có vấn đề? Và những gì về sao chép, ví dụ / dev / zero vào một thiết bị khối thô?
EmmaV

Có, stat -f -c %s filecho phép bạn truy cập giá trị đó từ dòng lệnh. Kích thước khối hệ thống tệp đầu ra được tính đến, tôi đã bỏ qua phần đó nhưng sẽ mở rộng câu trả lời của tôi (lớn nhất trong kích thước đầu ra, kích thước đầu vào và giá trị mã hóa cứng được sử dụng). Tôi không thấy các tệp giả như /dev/zerođược xử lý theo một cách đặc biệt: GNU GNU cũng sẽ chỉ sử dụng stattrên các tệp đó.
dhag
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.