2012-02-03 8 views
7

Khi tôi làm một fopen và sau đó một fread, khi là tập tin thực sự/một phần được nạp trong bộ nhớ trong fopen hoặc fread?Khi nào tệp được tải vào bộ nhớ - cho các cuộc gọi fread, fopen và fwrite?

Hoặc nó được tải một phần ở fopen dựa trên kích thước tệp và sau đó được tải đầy đủ tại thời điểm của fread?

Tương tự như điều gì xảy ra bên trong ở cấp hệ điều hành khi hàm fwrite được gọi? Tệp có được tải vào bộ nhớ tại thời điểm đó hay hoán đổi trang xảy ra chỉ là phần của tệp trong bộ nhớ?

Điều gì sẽ xảy ra ở cấp hệ điều hành ở mỗi cuộc gọi trong số này liên quan đến việc tải tệp trong bộ nhớ?

+4

Đối với hệ thống tệp nào? Đối với hệ điều hành nào? –

+4

Hệ điều hành nào? Điều này hoàn toàn phụ thuộc vào hệ điều hành. (Tôi hy vọng rằng thông thường, không có dữ liệu nào sẽ được đọc từ tệp khi bạn chỉ mở nó.) –

+0

tôi cần dữ liệu cho các cửa sổ, nhưng sẽ tò mò muốn biết sự khác biệt cho cùng một trong linux cũng – seahorse

Trả lời

6
  • fopen() chỉ tạo điều khiển cho tệp.
  • fread() thực sự đọc các tập tin vào một bộ nhớ đệm (hệ điều hành cấp đệm có thể xảy ra một cách minh bạch cho khách hàng.)
  • fwrite() ghi dữ liệu vào tập tin, mặc dù nó cam kết lưu trữ có thể bị trì hoãn (ví dụ với hệ thống tập tin journalled.)
4

Thông thường, tệp không được tải vào bộ nhớ khi mở tệp. Thay vào đó, các phần được nạp vào cho mỗi lần đọc; do tất cả các loại đệm, khối lớn hơn có thể được tải sau đó bạn yêu cầu trong mỗi fread.

Khi bạn fwrite một số dữ liệu, nó cuối cùng được sao chép vào hạt nhân sau đó sẽ ghi nó vào đĩa (hoặc bất cứ nơi nào) sau khi đệm. Nói chung, không cần phải tải một phần của tập tin để viết.

2

Nói chung nó phụ thuộc vào hệ thống tệp và hệ điều hành. trong cửa sổ có một cơ chế bộ nhớ đệm mà đề với một tập tin trong khối 256KB và tải từng đoạn khi yêu cầu đọc rơi vào đoạn đó. Cuộc gọi đến fopen không được gây ra việc đọc nội dung tệp từ phương tiện. Và fread sẽ khiến đọc một phần (hoặc đọc hoàn toàn cho các tệp nhỏ) từ phương tiện. Đọc một phần thường bằng kích thước dòng bộ đệm trong trình quản lý bộ nhớ cache (256KB).

fwrite cũng có thể/có thể không gây ra ghi thực tế cho phương tiện. Nó thường làm cho dữ liệu khách hàng được chuyển đến vùng tập tin được lưu trong bộ đệm trong RAM, nhưng không có bảo đảm rằng dữ liệu thực sự được ghi vào phương tiện. trong Windows, trình quản lý bộ nhớ cache quyết định khi nào tuôn ra vùng lưu trữ của một tệp vào phương tiện. Nếu bạn muốn đảm bảo tất cả dữ liệu bẩn được chuyển sang phương tiện sau fwrite, bạn cần phải gọi fflush sau đó.

1

Trong khi điều này phụ thuộc vào hệ điều hành, trong hệ điều hành hiện đại, tất cả hoạt động đĩa được lưu trong bộ nhớ cache, để khi bạn mở tệp trong thực tế, nó được ánh xạ tới một phần không gian bộ nhớ ảo.

Điều này có nghĩa là không có hoạt động đĩa nào xảy ra trước khi đọc/ghi thực tế.

Điều này đúng ngay cả khi bạn mở tệp mà không cần ánh xạ bộ nhớ (ví dụ: fopen), trong khi bạn mở nó bằng ánh xạ bộ nhớ (ví dụ: mmap) bạn chỉ mất "độ trong suốt".