Máy tính đánh số địa chỉ ô nhớ như thế nào

Hi there,
Mỗi một ô nhớ dù nó nằm trong stack hay heap thì ô nhớ đó phải có địa chỉ ô nhớ, cụ thể địa chỉ ô nhớ đó là một con số. Theo em được biết thì nó là số theo hệ đếm thập lục phân (hexadecimal). Em có 2 thắc mắc:

  • Máy tính tạo ra địa chỉ ô nhớ như thế nào, random hay tăng dần theo thứ tự (địa chỉ ô nhớ thứ 2 có lấy địa chỉ ô nhớ thứ nhất cộng thêm 1 đơn vị như index mảng hay id trong database không?). Địa chỉ ô nhớ có định dạng lenght bao nhiêu ký tự? bắt đầu từ số bao nhiêu? Có tiền tố chữ cái gì nữa không?
  • Địa chỉ ô nhớ bên stack với địa chỉ ô nhớ bên heap có khi nào bị trùng nhau không? nếu trùng thì sao? Nếu không được trùng thì có cơ nào để để nó không trùng?

Em chỉ biết javascript; C#, java thì có cách nào xem được tới địa chỉ ô nhớ trong RAM hay không? javascript bậc hơi cao chắc không được còn java, C# “level” có quá cao để in ra được console địa chỉ ô nhớ của biến được không?
Em cảm ơn!

Nếu chạy chương trình trên 1 hệ điều hành (OS) thì nó sẽ cấp phát cho mỗi chương trình 1 virtual space. Các địa chỉ trong virtual space này gọi là virtual address hay còn gọi là địa chỉ ảo :V Mỗi process đều có virtual address giống nhau thì phải :V OS sẽ làm nhiệm vụ map virtual address này vào physical address là địa chỉ thật trên RAM hoặc trên ổ cứng :V Nó giống như địa chỉ trong đời thật ấy. Mỗi nước là 1 process có virtual space riêng, địa chỉ 1234 Nguyễn Văn A, phường 1 quận 1 TP XYZ là địa chỉ ảo trong virtual space này. Địa chỉ ảo này map vào địa chỉ thật trên trái đất :V ví dụ ở địa điểm GPS 123.456 lon 789.012 lat nào đó. Bằng cách này thì OS vừa bảo vệ được process này truy cập bộ nhớ của process kia, vừa dễ hơn cho process thích xài địa chỉ (ảo) là số (32-bit hoặc 64-bit) nào cũng được ko sợ đụng địa chỉ của process khác. Ngoài ra còn tiết kiệm bộ nhớ thật: nếu 1 chương trình bật thành nhiều process hoặc nhiều process xài chung (DLL) thì địa chỉ thật chỉ có 1 cho chương trình đó thôi, còn địa chỉ ảo của chương trình đó muốn bao nhiêu cũng được :V

Nếu chạy chương trình ko có OS thì địa chỉ của process là địa chỉ thật :V

Tùy vào chương trình 32-bit hay 64-bit mà địa chỉ ảo có kích cỡ 32-bit hay 48-bit :V Tuy là chương trình 64-bit nhưng hiện tại đa số chỉ có 48-bit virtual address space thôi, trên Linux có support nhiều hơn thì phải mà đào đâu ra nhiều bộ nhớ hơn 48-bit ~ 256TB :V Trên Windows thì lại bị limit thêm nữa, chương trình 32-bit chỉ xài được 2GB hoặc 3GB, chương trình 64-bit chỉ xài được 128TB ~ 47-bit :V

Bắt đầu từ số bao nhiêu hay có tiền tố gì thì có lẽ là ko, nhưng có cấu trúc nhất định, vd ở Linux có thể tham khảo


https://www.kernel.org/doc/html/latest/x86/x86_64/mm.html

Địa chỉ (ảo) của stack và heap đa số ko bao giờ trùng nhau :V Trừ phi chạy chương trình ko có OS :V hoặc OS cũ implement ko cẩn thận. Nếu stack vượt quá giới hạn của compiler đặt ra, ví dụ 2MB thì chương trình khi chạy sẽ báo lỗi stackoverflow. Nếu heap vượt quá giới hạn của heap thì malloc sẽ fail và có thể chương trình sẽ crash/tự động dừng :V

Cơ chế để nó ko trùng có thể là chia phần ra :V Stack space ở địa chỉ (ảo) từ X tới X-2MB, còn lại là heap space (còn space 1 số vùng khác nữa nhưng cũng khoanh vùng phân định rõ ràng)
image

7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?