Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Tổ chức bộ nhớ trong lập trình C như thế nào?

  1. #1
    Ngày gia nhập
    06 2007
    Bài viết
    0

    Mặc định Tổ chức bộ nhớ trong lập trình C như thế nào?

    theo em dc biết thì chương trình trong c khi thực thi sẽ dc load lên ram sau đó mới tải dần vào cpu để xử lý. khi load lên ram sẽ nạp theo cấu trúc: 1 segment chứa code, 1 segment chứa data, 1 segment chứa heap, vùng nhớ trống rồi tới 1 segment chứa stack. đó là kiến thức cơ bản chắc mấy sư huynh cũng đã bik rồi.

    nhìn cái cấu trúc đó em có 1 vài thắc mắc sau mong các sư huynh chỉ giáo:

    - vì mỗi segment tối đa 64k do đó làm cho vùng nhớ data (cấp phát động) bị giới hạn trong 64k. đó cũng chính là lí do vì sao ng ta dùng danh sách liên kết (cấp phát heap) để giải quyết các mảng lớn. Mà code thì cũng chứa trong 1 segment => vậy code cũng bị giới hạn trong 64k à!!! đành rằng trong lập trình chuyên nghiệp ng ta dùng các function hay các class để tái sử dụng code nhưng nếu lỡ chương trình lớn nhiều function hay class khác nhau thì seo? segment có 64k chứa sao đủ !!!

    - sở dĩ heap và stack ko bị giới hạn 64k là vì chúng có thể tịnh tiến sang các segment khác bằng cách xài chung vùng nhớ còn trống (heap đi lên còn stack đi xuống). đó là kiến thức của sách và em tạm chấp nhận là thế. heap thì nằm trong segment sau data nghĩa là địa chỉ heap sẽ fụ thuộc vào địa chỉ đoạn code trên memory và vì nó tịnh tiến lên nên dễ dàng mở rộng sang các segment khác khi cấp phát động. nhưng còn stack thì sao? vì stack tịnh tiến xuống theo mô hình ngăn xếp nên đỉnh của nó sẽ luôn nằm gần heap nhất so với đáy và stack mở rộng ngược chiều với heap. vậy cái vùng nhớ trống giữa stack và heap đó có giới hạn ko? nó có fụ thuộc vào RAM máy tính ko? và cái vùng nhớ trống đó có chia đều cho mỗi nhóm code theo mô hình code1+data1+heap1+vùng nhớ 1(const=???)+stack1 rồi đến code2+heap2+vùng nhớ 2(=const của vùng nhớ 1)+stack2 +code3+6+..... nếu nó thực sự làm theo mô hình như vậy thì có ai biết dc zá trị const trong vùng nhớ trống xác định thế nào ko?

    - nếu cấu trúc em tưởng tượng đó là đúng tất là mỗi chương trình khi dc nạp lên bộ nhớ thì luôn tạo ra 5 thành phần độc lập đó vậy nghĩa là vùng nhớ stack và heap trong mỗi chương trình sẽ có giới hạn rồi vì với cấu trúc đó vùng nhớ trống sẽ bị chia ra mà stack và heap cùng sử dụng vùng nhớ đó theo 2 hướng ăn vào ở 2 đầu thì sớm muộn vùng nhớ đó cũng sẽ hết. Như vậy thật là lãnh phí bộ nhớ wá vì đâu fải chương trình nào cũng có kích thước cũng nhau, nếu làm như vậy thì sẽ có chương trình thiếu bộ nhớ trong khi lại có chương trình thừa bộ nhớ!!!



    Mong các sư huynh trả lời giúp. Xin đa tạ.

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    một nơi xa xăm...
    Bài viết
    127

    Cái ni cũng không rõ lém nhưng tui có đọc wa đâu đó rùi...Hình như trong C không chỉ có một cách tổ chức bộ nhớ đâu bạn ah! Mà nó cho ta lựa chọn một trong 5 cách tổ chức bộ nhớ sao cho phù hợp với chương trình của ta thì phải...Sorry nếu có nói sai j đó nhé vì vấn đề này em cũng ko thạo để về coi lại đã

  3. #3
    Ngày gia nhập
    03 2007
    Bài viết
    15

    Trích dẫn Nguyên bản được gửi bởi rambo2606 Xem bài viết
    theo em dc biết thì chương trình trong c khi thực thi sẽ dc load lên ram sau đó mới tải dần vào cpu để xử lý. khi load lên ram sẽ nạp theo cấu trúc: 1 segment chứa code, 1 segment chứa data, 1 segment chứa heap, vùng nhớ trống rồi tới 1 segment chứa stack. đó là kiến thức cơ bản chắc mấy sư huynh cũng đã bik rồi.

    nhìn cái cấu trúc đó em có 1 vài thắc mắc sau mong các sư huynh chỉ giáo:

    - vì mỗi segment tối đa 64k do đó làm cho vùng nhớ data (cấp phát động) bị giới hạn trong 64k. đó cũng chính là lí do vì sao ng ta dùng danh sách liên kết (cấp phát heap) để giải quyết các mảng lớn. Mà code thì cũng chứa trong 1 segment => vậy code cũng bị giới hạn trong 64k à!!! đành rằng trong lập trình chuyên nghiệp ng ta dùng các function hay các class để tái sử dụng code nhưng nếu lỡ chương trình lớn nhiều function hay class khác nhau thì seo? segment có 64k chứa sao đủ !!!
    Theo mình thì ko chỉ có 1 code segment hoặc data segment đâu..Nếu code lớn hơn 64K thì có thể có nhiều đoạn code segment mà .Có thể bằng các lệnh gọi , hoặc lệnh nhảy ,trình biên dịch sẽ đánh dấu được các địa chỉ trong từng segment đó.
    Đối với 1 CPU 16 bit thì 1 segment = 64K vì thanh ghi CS = 16 bit nên chỉ có thể quản lý 2^16(64K) địa chỉ.
    Còn hiện nay CPU máy tính thường là 32 bit => CS có thể quản lý 2^32 (4G) địa chỉ.=>nên ta không cần phải quan tâm đến code sẽ được chứa như thế nào vì có trình biên dịch lo rồi.
    Không biết như thế có đúng không nữa? Nếu sai thì anh em làm ơn sửa giùm.
    ...Every step that I take is another mistake to you...I'm sorry mom..

  4. #4
    Ngày gia nhập
    06 2007
    Bài viết
    0

    Đây là thông tin trả lời mình hỏi từ bên diễn đàn http://www.vninformatics.com/forum/t...039D520?zone=4

    Mô hình của chương trình dùng trong kiến trúc segment có thể là :

    - code + data + heap + stack chỉ nằm gọn trong một segment. Ví dụ chương trình .com thuộc loại này.

    - một code segment + một segment chứa cả heap+stack.

    - nhiều code segment nhưng chỉ có một segment chứa cả heap+stack.

    - nhiều code segment + nhiều data segment + một segment stack

    - có thể còn một vài mô hình nữa nhưng lâu quá không dùng nên quên rồi.

    Cái lợi của mô hình chỉ có một code segment là khi call function thì cần dùng call near ( chỉ cần offset thôi, không cần đổi giá trị của segment) nên chạy nhanh. Cái hại là chuơng trình không thể lớn.

    Tương tự, các lợi của mô hình chỉ có một segment cho data+stack là không cần thay đổi DS segment (không cần tính toán lại offset trong một số trường hợp như memcpy ... )

    Nói chung, kiến thức về segment không còn hữu dụng nữa, đừng nên đào sâu, chỉ nên biết vừa phải về nó.
    Bài trả lời có vẻ chính xác lắm. mấy sư huynh kiểm chứng bài trả lời dzùm và cho mình hỏi nếu bài trả lời là đúng thì cấu trúc bộ nhớ hiện nay của các chương trình chạy trong win tổ chức thế nào? ko còn là cấu trúc segment đó nữa à? nếu vậy thì sao trong mấy sách lập trình C,C++ họ toàn nói về cấu trúc này nhỉ trong khi C và C++ đã for win từ lâu rồi!!!

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Chậc mình cũng không rành về vấn đề này lắm .
    Những quyển sách C/C++ hiện nay trên thị trường phần lớn là tái bản lại , chủ yếu là của các tác giả như Phạm Văn Ất , Quách Tuấn Ngọc ,điện toán SAMIS , các sách đó đều nói về C for dos , trong khi ấy bây giờ chúng ta phần lớn là viết cho C for win , mặc dù bạn mới viết vẫn ra màn hình dos đen thui nhưng đó vẫn là 1 chương trình C for win do đó kiểu tổ chức bộ nhớ có nhiều thay đổi , ko giống như trong sách nói nữa .

    Ngày trước khi các anh sv học thì cần biết vấn đề này để thao tác các hàm liên quan đến các offset + 1 số hàm thao tác bộ nhớ nhưng bây giờ thì không cần nữa . Không biết kid nghĩ đúng hay sai chứ chắc chắn rằng kiến thức này không còn quan trọng nữa . ( Trừ khi cậu đinh viết virus - mà dù có vậy đi cậu cũng đi tìm hiểu hệ thống hơn là hiểu mấy cái này ) vẫn thắc mắc là cậu hỏi mấy cái này để làm gì nhỉ ?

  6. #6
    Ngày gia nhập
    06 2007
    Bài viết
    0

    Mặc định Tổ chức bộ nhớ trong lập trình C như thế nào?

    Trích dẫn Nguyên bản được gửi bởi kidkid Xem bài viết
    Chậc mình cũng không rành về vấn đề này lắm .
    Những quyển sách C/C++ hiện nay trên thị trường phần lớn là tái bản lại , chủ yếu là của các tác giả như Phạm Văn Ất , Quách Tuấn Ngọc ,điện toán SAMIS , các sách đó đều nói về C for dos , trong khi ấy bây giờ chúng ta phần lớn là viết cho C for win , mặc dù bạn mới viết vẫn ra màn hình dos đen thui nhưng đó vẫn là 1 chương trình C for win do đó kiểu tổ chức bộ nhớ có nhiều thay đổi , ko giống như trong sách nói nữa .

    Ngày trước khi các anh sv học thì cần biết vấn đề này để thao tác các hàm liên quan đến các offset + 1 số hàm thao tác bộ nhớ nhưng bây giờ thì không cần nữa . Không biết kid nghĩ đúng hay sai chứ chắc chắn rằng kiến thức này không còn quan trọng nữa . ( Trừ khi cậu đinh viết virus - mà dù có vậy đi cậu cũng đi tìm hiểu hệ thống hơn là hiểu mấy cái này ) vẫn thắc mắc là cậu hỏi mấy cái này để làm gì nhỉ ?

    mình cũng thắc mắc như bạn đấy: ko bik sao mình lại hỏi cái này làm zì nhỉ? ^-^.
    Đùa thui chứ dân IT mà, luôn muốn làm chủ máy tính và luôn muốn trả lời những câu hỏi "vì sao". Lúc thầy dạy cho mình danh sách liên kết trong C. Khi dạy tới phần cấp phát bộ nhớ động. Thầy có bảo vùng nhớ stack là có giới hạn còn heap là ko giới hạn nên các em có thể ấy bao nhiêu dữ liệu lên đó cũng dc. Mình mới hỏi là heap có fụ thuộc vào RAM ko vì ai cũng bik CPU truy xuất chương trình từ RAM (nạp dần vào để CPU xử lý). Thầy bảo ko bik và cũng ko bik giới hạn của heap là bao nhiêu, có vẻ như heap tự mở rộng ra và ko bao giờ có giới hạn.

    lập trình tức là viết chương trình điều khiển máy tính. đã gọi là điều khiển máy tính mà lại ko hỉu dc cách "phản ứng" của nó với chương trình của mình thì làm sao điều khiển nó dc. Cho nên mình quyết tìm cho ra dc cái đáp án của câu hỏi đó. thế thôi ^-^

    nói thêm: mặc dù học lập trình với ngôn ngữ cấp cao nhưng mình vẫn thấy thua xa những ng học bên điện tử. vì họ mới thực sự viết ra cái chương trình điều khiển 1 cái cục sắt làm việc mà ko cần fụ thuộc vào cái zì hết. cục sắt của họ thì rất đa dạng từ đầu vcd cho đến PC. còn mình thì seo? lập trình thì fải fụ thuộc vào HĐH. ko có API HĐH thì với những câu lệnh đã từng học trong C hay C++: cout,malloc,... cũng fải pó tay vì ko cách chi điều khiển dc PC cả (do trình độ mình còn thấp quá) . Vd cụ thể nhất là đoạn chương trình trong ROM và file exe viết trong Win hay DOS.

    với 1 đìu nữa là với những thứ gọi là ngôn ngữ cấp cao mình học dc hiện nay như Java, C++, ASP.net, VB.Net thì chỉ chạy dc trên mỗi cái PC trong khi bên điện tử thì ứng dụng dc wá trời.

    Dù vậy mình vẫn thích lập trình và có ý định sẽ nghiên cứu thêm ASM cũng như cách viết chương trình bên điện tử.

  7. #7
    Ngày gia nhập
    03 2008
    Bài viết
    9

    các bạn tìm cuốn sách của Phạm Văn Ất (cuốn 1, nói về C), và xem phần phụ lục, có mấy trang nói về vấn đề này. Cuốn sách này giờ là hàng hiếm rồi, bạn nào có địa chỉ để mua thì cho anh/em biết với. Mình đã xem qua nhưng lâu quá ko xài tới cũng quên luôn rồi.
    Nói chung là có mấy mô hình thiết lập bộ nhớ gì đó và ứng với mỗi mô hình thì có quy định rõ ràng về dung lượng cũng như phạm vi segment của chúng.

  8. #8
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Trên hệ điều hành DOS thì chương trình được chạy ở nhiều mô hình bộ nhớ, sau đây là các Model bộ nhớ chương trình trên DOS:

    Text Code:
    1. SMALL     code và data nằm trên một segment
    2. MEDIUM    code nhiều hơn một ssegment, data nằm trong một đoạn segment
    3. COMPACT   Data nhiều hơn một segment, code nằm trong một segment
    4. LARGE     code và data nhiều hơn một segment, array không quá 64kb
    5. HUGE      code và data nhiều hơn một segment, array lớn hơn 64kb

    Ở hệ điều hành DOS thì một segment(a block memory) có độ dài không quá 64kb. Bạn nhìn vào bảng thống kê ở trên, cũng có thể nói nên những điều thắc mắc của bạn. Và các chương trình loại .com sẽ chỉ có dùng một model đó là .small.

    Do DOS là hệ điều hành đơn nhiệm, khi chạy một chương trình trên nó, DOS đưa tất cả bộ nhớ cho chương trình đó mà không có do dự hay nghi ngờ gì cả. Để hoạt động một cách tốt đẹp thì chương trình sẽ phải tính toán bộ nhớ mà nó cần phải sử dụng rồi trả lại phần bộ nhớ mà nó thấy là không cần cho DOS. Với chương trình C thì bộ nhớ cần thiết đó sẽ bao gồm luôn cả phần cho heap mà nó sử dụng.

    Heap là một loại bộ nhớ được quản lý bởi OS, nó gồm nhiều block memory, mỗi block là 64kb bộ nhớ, liên kết với nhau theo kiểu link-list. Và nếu heap chỉ gồm có một block memory thì gọi là near heap hay còn gọi là default heap. Trong thực tế kích thước của near heap có khi nhỏ hơn nhiều, vì nó thường nằm chung segment với "default data" và stack . Đây chính là cái mà bạn gì đó ở trên đã thắc mắc đó, nhưng những cái củ nợ loằng ngoằng này thường được trình bày ở các giáo trình về Assembly.

    Ngoài cái default heap thì nó còn một loại nữa là far heap, một chương trình chạy ở model LARGE hoặc HUGE thì ngoài việc nó có near heap, nó còn có far heap. Khi chương trình hoạt động, near heap không có đủ bộ nhớ cần thiết nó sẽ xin DOS cấp thêm bộ nhớ cho nó để tạo far heap. Một far heap gồm nhiều block memory, chương trình có thể xin cấp pháp nhiều block memory, nếu nó thấy cần thiết. Như vậy là câu hỏi thứ 2 của bạn cũng tỏ tỏ rồi ha?

    Với một chương trình C, khi nó hoạt động trên DOS, nó lấy tất bộ nhớ của DOS, tạo một vùng nhớ heap vừa phải với dữ liệu ban đầu. Còn thừa bao nhiêu nó trả lại cho DOS. Một chương trình C, nó không dùng tất cả bộ nhớ của DOS, ở mỗi run-time, nếu user cần thì nó sẽ xin thêm bộ nhớ từ DOS.

    Cái này, lâu rồi Dr cũng không có nhớ rõ lắm, nếu có sai sót các bạn bổ sung và chỉnh sửa nhé. Còn ở trên Win32 thì khác đấy, hình như Dr đã trình bày nó ở trên diễn đàn này rồi.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  9. #9
    Ngày gia nhập
    01 2008
    Bài viết
    240

    Trích dẫn Nguyên bản được gửi bởi rambo2606 Xem bài viết
    theo em dc biết thì chương trình trong c khi thực thi sẽ dc load lên ram sau đó mới tải dần vào cpu để xử lý. khi load lên ram sẽ nạp theo cấu trúc: 1 segment chứa code, 1 segment chứa data, 1 segment chứa heap, vùng nhớ trống rồi tới 1 segment chứa stack. đó là kiến thức cơ bản chắc mấy sư huynh cũng đã bik rồi.

    nhìn cái cấu trúc đó em có 1 vài thắc mắc sau mong các sư huynh chỉ giáo:

    - vì mỗi segment tối đa 64k do đó làm cho vùng nhớ data (cấp phát động) bị giới hạn trong 64k. đó cũng chính là lí do vì sao ng ta dùng danh sách liên kết (cấp phát heap) để giải quyết các mảng lớn. Mà code thì cũng chứa trong 1 segment => vậy code cũng bị giới hạn trong 64k à!!! đành rằng trong lập trình chuyên nghiệp ng ta dùng các function hay các class để tái sử dụng code nhưng nếu lỡ chương trình lớn nhiều function hay class khác nhau thì seo? segment có 64k chứa sao đủ !!!

    - sở dĩ heap và stack ko bị giới hạn 64k là vì chúng có thể tịnh tiến sang các segment khác bằng cách xài chung vùng nhớ còn trống (heap đi lên còn stack đi xuống). đó là kiến thức của sách và em tạm chấp nhận là thế. heap thì nằm trong segment sau data nghĩa là địa chỉ heap sẽ fụ thuộc vào địa chỉ đoạn code trên memory và vì nó tịnh tiến lên nên dễ dàng mở rộng sang các segment khác khi cấp phát động. nhưng còn stack thì sao? vì stack tịnh tiến xuống theo mô hình ngăn xếp nên đỉnh của nó sẽ luôn nằm gần heap nhất so với đáy và stack mở rộng ngược chiều với heap. vậy cái vùng nhớ trống giữa stack và heap đó có giới hạn ko? nó có fụ thuộc vào RAM máy tính ko? và cái vùng nhớ trống đó có chia đều cho mỗi nhóm code theo mô hình code1+data1+heap1+vùng nhớ 1(const=???)+stack1 rồi đến code2+heap2+vùng nhớ 2(=const của vùng nhớ 1)+stack2 +code3+6+..... nếu nó thực sự làm theo mô hình như vậy thì có ai biết dc zá trị const trong vùng nhớ trống xác định thế nào ko?

    - nếu cấu trúc em tưởng tượng đó là đúng tất là mỗi chương trình khi dc nạp lên bộ nhớ thì luôn tạo ra 5 thành phần độc lập đó vậy nghĩa là vùng nhớ stack và heap trong mỗi chương trình sẽ có giới hạn rồi vì với cấu trúc đó vùng nhớ trống sẽ bị chia ra mà stack và heap cùng sử dụng vùng nhớ đó theo 2 hướng ăn vào ở 2 đầu thì sớm muộn vùng nhớ đó cũng sẽ hết. Như vậy thật là lãnh phí bộ nhớ wá vì đâu fải chương trình nào cũng có kích thước cũng nhau, nếu làm như vậy thì sẽ có chương trình thiếu bộ nhớ trong khi lại có chương trình thừa bộ nhớ!!!

    Mong các sư huynh trả lời giúp. Xin đa tạ.
    Mình cũng hiểu nó như bạn chắc là 2 chúng mình đúng đó
    Time

Các đề tài tương tự

  1. Làm Chữ chạy trên form C# như thẻ <marquee> trong HTML thế nào?
    Gửi bởi magnet241 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 05-04-2012, 11:55 AM
  2. In thẻ,hóa đơn từ các textbox,combobox,datetimepicker trong form C# như thế nào?
    Gửi bởi snoit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 04-04-2012, 03:13 PM
  3. Game Tạo Form trong suốt trong C# tựa game Thần Võ như thế nào?
    Gửi bởi tocvang_pro trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 21-09-2011, 04:21 PM
  4. Sử lí như thế nào khi nhập rất chậm trong trình xoạn thảo trong devC
    Gửi bởi toansvcn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 23-05-2011, 10:04 PM
  5. Code tìm kiếm trong cây nhị phân trong C++. Lỗi chỉ tìm được từ đầu tiên trong file thôi sửa thế nào?
    Gửi bởi elvish trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 11-04-2010, 09:43 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn