Hẳn nhiều người còn nhớ, trước thềm năm 2000, cả thế giới từng lo lắng vì “sự cố thiên niên kỷ (Y2K)”. Mối lo khi ấy là các chương trình chỉ ghi năm bằng hai chữ số có thể nhầm năm 2000 thành năm 1900. Thế nhưng trong thế giới máy tính, vẫn còn một vấn đề ngày tháng khác tương tự như vậy. Đó chính là “Sự cố năm 2038 (Year 2038 Problem)”.
Nói đơn giản, sự cố năm 2038 là hiện tượng máy tính đếm thời gian bằng số giây không còn biểu diễn đúng các thời điểm sau ngày 19 tháng 1 năm 2038. Nó xảy ra vì ô chứa con số có kích thước cố định, và trong tiếng Anh còn được gọi là Y2K38 hoặc biệt danh “Epochalypse”, ghép từ epoch (kỷ nguyên) và apocalypse (tận thế).
Trong bài viết này, chúng ta sẽ lần lượt tìm hiểu cách máy tính đếm thời gian, nguyên lý gây ra sự cố năm 2038, những trường hợp đã xuất hiện cùng các thiết bị có rủi ro, và các giải pháp đã được chuẩn bị cho đến nay.
Ngày đồng hồ chạy ngược: Sự cố năm 2038
Máy tính đếm thời gian như thế nào?

Chúng ta ghi ngày tháng bằng năm, tháng, ngày, nhưng nhiều máy tính lại ghi nhớ thời gian dưới dạng một con số lớn duy nhất.
(1) Thời gian Unix
Các hệ điều hành họ Unix và vô số hệ thống chịu ảnh hưởng của chúng lấy 0 giờ 0 phút 0 giây ngày 1 tháng 1 năm 1970 (theo Giờ Phối hợp Quốc tế) làm điểm xuất phát, rồi biểu diễn thời gian bằng cách đếm số giây đã trôi qua kể từ đó. Cách này được gọi là “thời gian Unix (Unix Time)”, còn điểm xuất phát được gọi là “mốc kỷ nguyên Unix (Unix Epoch)”.
(2) Lợi ích của việc dùng một con số
Khi thời gian được quy về một con số, khoảng cách giữa hai thời điểm có thể tính bằng một phép trừ, việc lưu trữ và so sánh cũng dễ dàng. Vì vậy, cách này được dùng ở mọi nơi cần đến thời gian, như thời điểm tạo tệp, bản ghi nhật ký hay các tác vụ đặt lịch.
(3) Ô có kích thước cố định
Vấn đề nằm ở ô chứa con số này. Trong thời gian dài, nhiều hệ thống lưu thời gian Unix trong một “số nguyên 32 bit có dấu”, và con số lớn nhất mà ô này chứa được là 2,147,483,647.
Nguyên lý gây ra sự cố năm 2038

Nếu cứ liên tục cộng thêm vào một ô có kích thước cố định, sớm muộn gì cũng đến lúc ô bị tràn.
(1) Giây cuối cùng
Thời điểm 2,147,483,647 giây trôi qua kể từ năm 1970 là 3 giờ 14 phút 7 giây ngày 19 tháng 1 năm 2038 theo Giờ Phối hợp Quốc tế, tức 12 giờ 14 phút 7 giây trưa cùng ngày theo giờ Hàn Quốc. Đó chính là khoảnh khắc cuối cùng mà ô 32 bit có thể biểu diễn.
(2) Tràn số và lật dấu
Khi cộng thêm 1 giây nữa, con số tràn khỏi ô và bit dấu ở vị trí đầu tiên bị thay đổi. Hiện tượng này được gọi là “tràn số nguyên (Integer Overflow)”, và giá trị vốn là số dương lớn nhất lập tức trở thành số âm nhỏ nhất.
(3) Đồng hồ quay về năm 1901
Thời gian đã thành số âm được hiểu là quá khứ trước mốc kỷ nguyên. Kết quả là hệ thống tưởng nhầm hiện tại là ngày 13 tháng 12 năm 1901, và các chức năng tính toán theo ngày tháng có thể hoạt động sai lệch.
Điểm khác biệt là sự cố thiên niên kỷ xảy ra vì ghi năm bằng hai chữ số thập phân, còn sự cố năm 2038 xảy ra vì lưu thời gian trong một ô nhị phân 32 chữ số.

Những trường hợp đã xuất hiện và các thiết bị có rủi ro

Năm 2038 vẫn chưa đến, nhưng ở những chương trình tính toán ngày tháng xa trong tương lai, sự cố đã lộ diện.
- Hết thời gian chờ trên máy chủ web (AOLserver): Tháng 5 năm 2006, một chương trình máy chủ web đặt hạn chót cho những yêu cầu “không bao giờ được kết thúc” vào thời điểm một tỷ giây sau đó, và khi hạn chót ấy vượt quá năm 2038, phép tính bị rối khiến máy chủ ngừng hoạt động.
- Lỗi năm mới của máy chủ thư (Exchange Server): Ngày 1 tháng 1 năm 2022, chương trình máy chủ thư của Microsoft xử lý số hiệu bản cập nhật dưới dạng số 32 bit, và khi giá trị vượt quá giới hạn, chức năng quét mã độc đã ngừng hoạt động.
- Thiết bị nhúng dùng lâu năm (Embedded Systems): Những thiết bị một khi đã lắp đặt sẽ được dùng hàng chục năm và hiếm khi cập nhật, như hệ thống phanh ô tô, bộ định tuyến hay camera mạng, được xem là đối tượng đáng lo ngại nhất.
Tất nhiên, không phải thiết bị nào cũng gặp rủi ro. Những thiết bị không cần ngày tháng, hoặc chỉ tính hiệu giữa hai thời điểm, có thể sẽ không gặp vấn đề lớn.
Cách phòng tránh sự cố năm 2038

Sự cố năm 2038 không có giải pháp vạn năng nào sửa được mọi thứ một lần, nên nhiều phương pháp đang được dùng cùng lúc.
(1) Mở rộng ô lên 64 bit
Phương pháp được dùng rộng rãi nhất là mở rộng ô chứa thời gian lên 64 bit. Khi đó, phải mất khoảng 292 tỷ năm mới xảy ra tràn số, nên thực chất nó trở thành một chiếc đồng hồ không có hồi kết. Phần lớn hệ điều hành dành cho máy tính 64 bit đã áp dụng cách này.
(2) Sửa lại môi trường 32 bit cũ
Từ phiên bản 5.6 năm 2020, Linux cho phép dùng thời gian 64 bit ngay cả trên thiết bị 32 bit, và các hệ điều hành như NetBSD và OpenBSD cũng đã sớm chuyển sang thời gian 64 bit. Tuy nhiên, việc thay đổi kích thước ô có thể khiến hệ thống không còn tương thích với các chương trình hiện có, nên cần tiến hành thận trọng.
(3) Kiểm tra trong thời gian còn lại
Ngay cả khi hệ điều hành đã thay đổi, vấn đề vẫn còn nếu các chương trình hay cơ sở dữ liệu chạy trên đó vẫn xử lý thời gian bằng số 32 bit. Vì vậy, việc kiểm tra đều đặn để tìm và sửa trước mã nguồn cũng như thiết bị cũ là cách chuẩn bị chắc chắn nhất.
Sự cố năm 2038 cho thấy một lựa chọn thiết kế rất nhỏ có thể quay lại thành bài toán lớn sau hàng chục năm. Chúng ta cần nhớ rằng ngay cả một ô có vẻ đủ lớn lúc này, khi thời gian tích tụ, rồi cũng có ngày bị tràn, và cần chuẩn bị trước.
Hiểu rằng lựa chọn tiện lợi hôm nay có thể trở thành giới hạn của ngày mai chính là bước đầu tiên để thiết kế những hệ thống bền lâu.