- Phát triển data.frame theo cách hiệu quả về bộ nhớ
- phát hiện rò rỉ bộ nhớ ruby/ruby on rails
- Không thể giải quyết việc nhập android.support.v7.app
- Ổ cắm miền UNIX và bộ nhớ chia sẻ (tệp được ánh xạ)
trung tâm
Chức năng này cũng sử dụngsbrk
Vàmmap
chức năng. Hiện nay sbrk
Chức năng này tăng hoặc giảm một phân đoạn dữ liệu. Vì vậy, nó tăng trưởng theo đường thẳng. Bây giờ câu hỏi của tôi là, tính tuyến tính này có luôn đúng không, hay chẳng hạn,mmap
Cuộc gọi có thể phân bổ bộ nhớ chồng lấn lên phân đoạn dữ liệu không?
Tôi đang nói về các chương trình đa luồng chạy trên hệ thống đa lõi. Blog nàyĐã thảo luậnsbrk
Được sử dụng cho một số lỗi nghiêm trọng trong các chương trình đa luồng và chỉ ra rằng việc sử dụngsbrk
Bộ nhớ được phân bổ có thể khác với bộ nhớ được sử dụngmmap< bộ nhớ được phân bổ được trộn lẫn với nhau
(sbrk
Đống có thể trở nên không liền kề vì mmaped
Các vùng hoặc đối tượng được chia sẻ đang chặn sự phát triển của heap).
1 Câu trả lời
Bài đăng trên blog đó chỉ nói đến cây chứ không nói đến toàn bộ sự việc; trung tâm
Các triển khai được phép gọi với các đối số khác không sbrk
. Chính xác hơn, nếu mã ứng dụng gọi sbrk
, hầu hết Unix trung tâm
Việc triển khai sẽ không còn hoạt động bình thường (ý tôi là "chương trình của bạn sẽ bị sập"). Nếu bạn muốn thực hiện phân bổ lớn trực tiếp từ hệ điều hành, bạnphảisử dụng mmap
để hoàn thành.
(Thật vậy, trong một chương trình đa luồng,trung tâm
Phải ở trong nó sbrk
Lệnh gọi __register__ sẽ gói mutex bên trong, nhưng đây là chi tiết triển khai. POSIX nói trung tâm
Có tính an toàn cho luồng, điều này rất quan trọng đối với các lập trình viên ứng dụng. )
mmap
Sẽ không phân bổchồng chéobrk
khu vực, trừ khi bạn sử dụngMAP_ĐÃ_SỬA_ĐỔI
. Nếu bạn sử dụng MAP_ĐÃ_SỬA_ĐỔI
và chương trình của bạn bị sập, bạn vẫn giữ được tất cả các phần.
Hạt nhân cố gắng tránh thực hiện điều này, nhưng trong hoạt động bình thường mmap
Có thể phân bổ gần brk
Bộ nhớ ở đầu vùng. Nếu điều này xảy ra, mmap
Hậu quả của xung đột khu vực sbrk
Gọi sẽthất bại. NóSẽ khôngPhân bổ bộ nhớ không liền kề. trung tâm
Một triển khai tốt sẽ phát hiện ra tình huống này và bắt đầu sử dụng mmap
. Tôi thực sự chưa thử cách này, nhưng việc viết một chương trình thử nghiệm cũng khá dễ dàng.
Về việc liệu bộ nhớ được phân bổ bởi mmap có thể ghi đè lên phân đoạn dữ liệu hay không, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/9366493/
Tôi đang cố gắng hiểu cách mmap hoạt động. Cuộc gọi cấp độ người dùng tới mmap được hiển thị bên dưới. void *mmap(void *addr, size_t len, int prot, int cờ, int
Tôi đang tạo trình điều khiển Bottle và tôi sử dụng từ khóa yield và đối tượng mmap.mmap để gửi nhiều tệp được ánh xạ trong một luồng đầu ra như được hiển thị trong mã sau: để ánh xạ trong các ánh xạ: yield
Tôi đến từ thế giới C++/RAII. Vì vậy, tôi bối rối không biết khi nào và làm thế nào để gọi mmap.close() [không phải file.close()]. Hoặc là đừng gọi nó nữa? Có rò rỉ không khí không? Đối với ví dụ từ tài liệu
Tôi đang học lớp Hệ điều hành tại trường đại học và một trong những bài tập của chúng tôi là triển khai lệnh malloc đơn giản bằng mmap. Bây giờ tôi đã làm cho nó hoạt động, tôi thử sử dụng valgrind để phát hiện bất kỳ lỗi nào còn sót lại. Bất kể bộ nhớ có được giải phóng hay không, valgri
Có ai biết sự khác biệt giữa mmap(2) và mmap(3) là gì không? Phần 3 của hướng dẫn được mô tả là "Chương này mô tả tất cả các hàm thư viện ngoại trừ các hàm thực hiện lệnh gọi hệ thống được mô tả trong Chương 2." mmap(3) không thực hiện lệnh gọi hệ thống sao? Đọc hai cái này
Tôi không biết mình đã bỏ lỡ kiến thức gì khi hiểu mmap. Tôi thực sự không thể hiểu nổi. Nhưng hãy để tôi hỏi câu hỏi theo cách này: Tôi có nhiều khối tệp (giả sử là 3) có kích thước là s1, s2, s3. s1, s2 và s3 đều nhỏ hơn Mmap (
Trong Linux: #free -m tổng số bộ đệm chia sẻ miễn phí đã sử dụng cachedMem:
Tôi đang cố gắng kết nối thư viện C (trình điều khiển PRU beaglebone prussdrv.c) với Python. Hàm cụ thể mà tôi muốn truy cập trả về một con trỏ mmap như thế này: int __prussdrv_me
Khi tôi gọi mmap: ptr = mmap(NULL, ...); và yêu cầu hệ thống cung cấp bộ đệm và ánh xạ tệp vào đó, sau đó gọi mmap một lần nữa với ptr2 = mmap(ptr, ...); hãy thử
Việc ánh xạ bộ nhớ một tệp lớn trong Java hoạt động rất tốt trên Android. Nhưng khi tổng số ánh xạ vượt quá ~1,5 GB, ngay cả với nhiều lệnh gọi ánh xạ, nó vẫn không thành công: mmap không thành công: ENOMEM (Ngoài bản ghi nhớ
Tôi chạy một daemon cơ sở dữ liệu chuyên dụng trên debian-64 với 64G bộ nhớ và nhiều dung lượng đĩa. Nó sử dụng bảng băm trên đĩa (mmaped) và ghi dữ liệu thực tế vào tệp thông qua các lệnh gọi write() thông thường. Khi thực hiện một số lượng lớn các bản cập nhật, m
Mã C++: #include #include #include #include #include sử dụng không gian tên std; #define FILE_MODE (S_I
Tôi muốn xử lý một tệp gồm các khối 4Kb. Khi có việc gì đó xảy ra, tôi sẽ viết thêm dữ liệu và lập bản đồ các phần mới, đồng thời hủy lập bản đồ các phần không còn cần thiết nữa. Khi tổng lượng dữ liệu tệp cần ánh xạ là khoảng 4Gb, thì map() chỉ 4Kb có quá nhỏ không?
Xin chào mọi người, tôi đang cố gắng chuyển đổi mã sau sang python (để truy cập bộ đếm thời gian 1Mhz của Raspberry Pi) và tôi không biết khi nào thì ánh xạ đối tượng mà chúng ta cần + TIMER_OFFSET (timer = (long long int
Những gì tôi đã làm là một trình thu gom rác sử dụng mmap(2) để phân bổ không gian cho không gian người dùng, yêu cầu phân bổ ban đầu có thể bắt đầu ở bất kỳ đâu, nhưng các địa chỉ phân bổ tiếp theo phải liền kề với phân bổ trước đó, như được hiển thị bên dưới: page_size = getpagesize
Như chúng ta đã biết, chức năng quan trọng nhất của mmap() là chia sẻ ánh xạ tệp giữa nhiều quy trình. Nhưng như chúng ta đều biết, mỗi tiến trình đều có không gian địa chỉ riêng. Câu hỏi đặt ra là tệp ánh xạ bộ nhớ (cụ thể hơn là dữ liệu của nó) thực sự được lưu giữ ở đâu và một tiến trình có thể truy cập bộ nhớ này như thế nào? của tôi
Điều gì giới hạn kích thước của tệp ánh xạ bộ nhớ? Tôi biết nó không thể lớn hơn khối không gian địa chỉ chưa phân bổ liền kề lớn nhất và phải có đủ dung lượng đĩa trống. Nhưng còn có hạn chế nào khác không? Câu trả lời hay nhất Bạn quá bảo thủ: tệp ánh xạ bộ nhớ có thể lớn hơn không gian địa chỉ. Xem các tập tin được ánh xạ bộ nhớ
Nếu tôi sử dụng mmap để ghi uint32_t, tôi có gặp phải vấn đề với quy ước big endian/little endian không? Đặc biệt, nếu tôi viết một số dữ liệu mmap trên một máy big-endian, khi tôi cố gắng đọc nó trên một máy little-endian
Vì vậy, đối với dự án năm cuối của mình, tôi đang sử dụng Video4Linux2 để trích xuất hình ảnh YUV420 từ máy ảnh, phân tích chúng thành x264 (sử dụng chuẩn này) và sau đó gửi luồng được mã hóa qua kênh RTP/RTCP thông qua Live555.
Các lệnh gọi mmap có mang tính nguyên tử không? Nghĩa là, những thay đổi về ánh xạ do mmap thực hiện có xuất hiện một cách nguyên tử đối với các luồng khác đang truy cập vào vùng bị ảnh hưởng hay không? Để so sánh, hãy xem xét tình huống bạn thực hiện mmap. Trong một tập tin đầy số không (từ luồng
Tôi là một lập trình viên xuất sắc, rất giỏi!