Memory alignment

Hôm trước mình có viết 1 bài về chủ đề Optimize struct memory trong swift mà có nói tới về vấn đề memory alignment này. Thì bài này mình sẽ giải thích kĩ hơn tại sao nó được sinh ra và tại sao nó quan trọng.

1. Khái niệm

Memory alignment là nói về sự sắp xếp dữ liệu trong bộ nhớ. Ở đây cụ thể hơn là vùng nhớ của các biến trong Struct được đặt vào những địa chỉ như thế nào.

Kiểu dữ liệu có 8 byte như int64, double thì phải đặt ở địa chỉ chia hết cho 8, hay kiểu dữ liệu có độ dài 4 byte như Int32 phải đặt ở địa chỉ chia hết cho 4. Tương tự đối với các kiểu dữ liệu có độ dài N, phải đặt tại địa chỉ AA mod N == 0

Vùng trắng là vùng padding

Để có thể thực hiện alignment, compiler để trống các phần bộ nhớ không sử dụng tới(được gọi là padding). Vậy tại sao lại cần phải padding, sao không gộp luôn vào cho tiếp kiệm bộ nhớ? Câu trả lời ở ngay phần dưới.

2. Tại sao lại cần tuân theo alignment

Do Data bus của CPU chỉ có 64bit nên CPU trong 1 read cycle sẽ chỉ lấy được 8 byte dữ liệu. Giả sử một vùng nhớ không tuân theo alignment(được gọi là misaligment) như sau.

Vùng nhớ int64 có màu xanh.

Để lấy được vùng nhớ kiểu int64 kia. Thì CPU sẽ phải thực hiện 2 read cycle, 1 lần đọc 4 byte đầu, và lần 2 sẽ đọc tiếp 4 byte sau và ghép lại để được kết quả là dữ liệu biến int64. Như vậy việc đọc dữ liệu của CPU lên RAM sẽ không hiệu quả do phải đọc thêm 1 read cycle nữa. Từ đó hiệu năng của ứng dụng sẽ giảm.

Vùng màu xanh là biến short(2byte). Màu vàng là biến bool(1byte)

Thêm 1 ví dụ nữa, đáng nhẽ nếu biến short(vùng màu xanh) này được alignment thì chỉ cần CPU đọc dữ liệu lên thanh ghi rồi lấy 1 phần trong thanh ghi là có thể dễ dàng lấy được giá trị chỗ đó. Nhưng trong trường hợp này thì CPU phải thực hiện thêm thao tác dịch bit nữa có thể lấy được dữ liệu.

Tóm lại alignment sinh ra để:

  • CPU Fetch dữ liệu từ RAM được hiệu quả hơn.
  • Tốc độ lấy dữ liệu sẽ cải thiện so với không alignment

Tham khảo thêm:
https://en.wikipedia.org/wiki/Data_structure_alignment
https://yadiyasheng.medium.com/understanding-memory-alignment-1a9ad5d5fd6f
https://www.geeksforgeeks.org/data-structure-alignment/

Leave a Reply