2011-06-27 32 views
11

Tôi là một nhà phát triển làm việc trên một ứng dụng 32bit rất lớn, bộ nhớ chuyên sâu. Chạy ra khỏi không gian địa chỉ ảo (bộ nhớ) là một vấn đề đối với chúng tôi. Trong quá trình điều tra của tôi về một số vấn đề gần đây, tôi nhận thấy một phần lớn bộ nhớ được dành riêng bởi IOKit (512MB). Bộ nhớ này không được cấp phát nhưng chỉ được đặt trước. Điều tra sâu hơn cho thấy hầu hết các ứng dụng (Safari, iTunes, vv) đều dự trữ phần bộ nhớ này. Dường như nó vẫn chưa được phân bổ. Tôi đang sử dụng vmmap để kiểm tra. Ví dụ: đây là ứng dụng Cocoa được tạo bằng XCode, sử dụng mẫu mặc định:Làm cách nào để giảm dung lượng bộ nhớ IOKit khi khởi động quá trình?

REGION TYPE      VIRTUAL 
===========      ======= 
CG backing stores     1008K 
CG image        4K 
CG raster data      64K 
CG shared images     2252K 
Carbon        7264K 
CoreGraphics       16K 
IOKit (reserved)     512.0M  reserved VM address space (unallocated) 
MALLOC        59.0M  see MALLOC ZONE table below 
MALLOC guard page     48K 
MALLOC metadata      348K 
Memory tag=242      12K 
STACK GUARD      56.0M 
Stack        8712K 
VM_ALLOCATE      16.2M 
__DATA        8296K 
__IMAGE       1240K 
__LINKEDIT       31.5M 
__TEXT        76.7M 
__UNICODE       536K 
mapped file      27.4M 
shared memory      1320K 
===========      ======= 
TOTAL        809.2M 
TOTAL, minus reserved VM space 297.2M 

Tôi có thể làm gì để giảm hoặc loại bỏ bộ nhớ đó? Ứng dụng của chúng tôi thực sự có thể sử dụng 512MB đó !!!

EDIT: Tôi đã nghiên cứu thêm một chút và có vẻ như đoạn dữ liệu này là bộ đệm khung hình video được ánh xạ vào không gian người dùng. Vì vậy, tôi đoán một câu hỏi chính xác hơn là nếu có anyway để hạn chế framebuffer chiếm hơn một phần lớn của không gian địa chỉ chế độ người dùng ảo?

EDIT: Đã thực hiện thêm một số thử nghiệm và tìm thấy khóa cần thay đổi là IOFBMemorySize. Như được hiển thị nếu bạn thực hiện lệnh này:

ioreg -l | grep IOFBMemorySize 

Hoặc bạn có thể thấy nó trong IORegistryExplorer. Tôi đã không thành công trong việc thay đổi giá trị đó mặc dù. Tôi đã thử thêm nó vào Info.plist cho ATIFramebuffer.kext, không tốt. Tôi đã thử viết một chương trình gọi IOConnectSetCFProperty, nhưng nó trả về kIOReturnUnsupported.

EDIT: Sau khi nghiên cứu thêm, có vẻ như khóa IOFBMemorySize này có khả năng chỉ đọc, chỉ cần báo cáo số lượng bộ nhớ có sẵn trên thẻ video. Có vẻ như có một số giá trị thú vị trong Configuration.plist cho CoreGraphics, nhưng không cái nào trong số chúng dường như ảnh hưởng đến cấp phát bộ nhớ (ngay cả sau khi khởi động lại).

Trả lời

2

Tôi nghĩ rằng bạn đang xem xét điều này một cách sai lầm.

A) IOKit không chiếm 512MB bộ nhớ cho bộ đệm Khung.

B) nó nêu trong bảng mà bạn đã đăng reserved VM address space (unallocated) để có lẽ bộ nhớ ổ đĩa được ánh xạ dưới dạng không gian bộ nhớ ảo.

C) nếu bạn đang hết bộ nhớ trong ứng dụng đang chạy, bạn cần phải cấu trúc nó khác nhau, kiểm tra allocs và rò rỉ, và nếu cần thiết thực hiện bộ nhớ đệm và tìm nạp lười.

+0

A) nó là lấy 512MB không gian địa chỉ ảo, dựa trên kích thước của bộ đệm khung. B) có không gian địa chỉ ảo. Trong đó một ứng dụng 32bit có 4GB. C) Không thực sự trả lời câu hỏi. – pj4533

+0

Nó không quan trọng có bao nhiêu địa chỉ có sẵn, nó quan trọng bao nhiêu bộ nhớ có sẵn, chỉ vì bạn có thể đếm đến một số không có nghĩa là bạn có nhiều bit. –

+0

Ummmm .... không chắc chắn tôi hiểu những gì bạn đang nói, nhưng nó hoàn toàn quan trọng có bao nhiêu địa chỉ có sẵn (32bit vs 64bit). Thực tế là các tác vụ 32bit có (khoảng) 4GB không gian địa chỉ ảo. Sau khi được sử dụng, phân bổ bộ nhớ không thành công. IOKit đang đặt 512MB không gian địa chỉ ảo cho trình gỡ khung thẻ video và tôi muốn biết cách giảm mức đó xuống một lượng nhỏ hơn. – pj4533

0

thừa nhận đây không phải là một câu trả lời cho câu hỏi của bạn, nhưng một gợi ý về cách để tiếp tục ...

bạn viết rằng bạn đang làm việc trên một ứng dụng 32-bit rất lớn, vì vậy có lẽ bây giờ là thời gian để suy nghĩ lại kiến ​​trúc thực thi của bạn và tách ứng dụng rất lớn thành nhiều quy trình. có lẽ bạn muốn đóng gói mã đặc biệt 32 bit (QT?) vào một ứng dụng (có thể là một quá trình nền hoặc GUI được định hướng ...) và sau đó đặt nhiều bộ nhớ hơn và xử lý các bit định hướng vào một ứng dụng thứ cấp (64bit?). có rất nhiều hương vị của giao tiếp giữa các quá trình để lựa chọn và ứng dụng của bạn có thể có lợi từ một kiến ​​trúc song song hơn.

chỉ là một ý tưởng ... chúc may mắn!

| K <

+0

cảm ơn .... và vâng, 64bit là giải pháp lâu dài cho vấn đề này. Thật không may, chúng tôi cần hỗ trợ chi nhánh 32bit của ứng dụng của chúng tôi trong một thời gian khá lâu do nhu cầu của khách hàng. – pj4533

+0

Ngoài ra, tôi đã tự hỏi nếu có một số cách để làm cho một cấp thấp Out-of-proc bộ nhớ cấp phát. Bằng cách ghi đè malloc với thực hiện của riêng tôi mà sử dụng IPC để có được "bộ nhớ" từ một quá trình (64bit) khác. Luôn luôn có vẻ như một căng mặc dù (chưa kể đến khó khăn để thực hiện trong một codebase di sản lớn). – pj4533

0

a. Bạn đã thử chạy trên thẻ đồ họa yếu hơn chưa? Vì vậy, có lẽ chỉ 128fb sẽ được phân bổ? Cài đặt phần cứng cho card màn hình?

b. Sử dụng tính năng tiêm mã để hủy cấp phát bộ nhớ ...

Giả sử đây là ứng dụng riêng tư của bạn, không sử dụng dấu vân tay, v.v.
Điều này rõ ràng không phải là thay đổi một dòng, nhưng bạn có thể thay đổi mã để phân bổ một bộ đệm nhỏ hơn, hoặc không phân bổ, hoặc cho phép việc phân bổ và sau đó phát hành nó (và ngược này trong thời gian shutdown chương trình), vv, vv

tôi đặt cược này có thể được thực hiện một cách ổn định

+0

Vì mọi ứng dụng OSX đều thể hiện hành vi này, tôi đã thử kiểm tra các quy trình trên các máy khác, chạy các card video khác nhau. Có, dung lượng bộ nhớ được đặt trước khác nhau. (nó được dành riêng, nhưng không được phân bổ rõ ràng). Tôi đã tìm một thiết lập phần cứng, đào REAL sâu vào các thiết lập, nhưng không tìm thấy gì mà người dùng có thể cài đặt được. Sau khi nói chuyện với Apple về vấn đề này, nó dường như được điều khiển bởi trình điều khiển video hoàn toàn. Tôi có thể móc các cuộc gọi tôi giả sử, nhưng Apple khuyên chống lại điều đó (rõ ràng). – pj4533

+0

Ok .. điều này thực sự là cực đoan ... nhưng bạn có âm thanh một nửa có thẩm quyền – YAZR

Các vấn đề liên quan