Tôi có một chút lo ngại về điều này. Nó được gọi là "vấn đề năm 2038". Hạt nhân Linux hoặc Ubuntu đã sẵn sàng để xử lý ngày sau này chưa, kể từ ngày 12.04?
Tôi có một chút lo ngại về điều này. Nó được gọi là "vấn đề năm 2038". Hạt nhân Linux hoặc Ubuntu đã sẵn sàng để xử lý ngày sau này chưa, kể từ ngày 12.04?
Câu trả lời:
Không, nó sẽ không thất bại. Trong trường hợp xấu nhất, theo quan điểm của một lập trình viên, nó sẽ hoạt động như mong đợi: nó sẽ được đặt lại cho đến ngày 1901-12-13 20:45:51:
Điều này trong trường hợp bạn sẽ không cập nhật các bản phân phối hiện tại của mình cho đến khi điều này xảy ra. " Cập nhật rất dễ dàng. Một trong những cập nhật này chắc chắn sẽ có bản sửa lỗi. " Như chocobai nói.
Tôi nhớ rằng đó là vấn đề / câu hỏi tương tự với các máy 16 bit trước năm 2000 và cuối cùng, nó không có vấn đề gì.
Một giải pháp từ Wikipedia:
Hầu hết các hệ điều hành được thiết kế để chạy trên phần cứng 64 bit đã sử dụng
time_t
số nguyên 64 bit đã ký . Sử dụng giá trị 64 bit đã ký giới thiệu một ngày hoàn thành mới lớn hơn gấp hai mươi lần so với tuổi ước tính của vũ trụ: khoảng 292 tỷ năm kể từ bây giờ, lúc 15:30:08 vào Chủ nhật, ngày 4 tháng 12, 29.277.026.596. Khả năng tính toán vào các ngày bị hạn chế bởi thực tế làtm_year
sử dụng giá trị int 32 bit đã ký bắt đầu từ năm 1900 trong năm. Điều này giới hạn năm tối đa là 2.147.485.547 (2.147.483.647 + 1900). Mặc dù điều này giải quyết vấn đề khi thực hiện các chương trình, nhưng nó không giải quyết được vấn đề lưu trữ giá trị ngày trong các tệp dữ liệu nhị phân, nhiều trong số đó sử dụng các định dạng lưu trữ cứng nhắc. Nó cũng không giải quyết được vấn đề đối với các chương trình 32 bit chạy dưới các lớp tương thích và có thể không giải quyết được sự cố đối với các chương trình lưu trữ giá trị thời gian không chính xác trong các biến của các loại kháctime_t
.
Tôi sử dụng Ubuntu 13.04 trên 64 bit và vì tò mò, tôi đã thay đổi thủ công thời gian thành 2038-01-19 03:13:00. Sau 03:14:08 không có gì xảy ra:
Vì vậy, không có gì phải quan tâm về vấn đề này.
Thông tin thêm về:
Bạn có thể kiểm tra xem thời gian máy tính của bạn có bị sập hay không bằng cách sử dụng tập lệnh Perl sau:
#!/usr/bin/perl
use POSIX;
$ENV{'TZ'} = "GMT";
for ($clock = 2147483641; $clock < 2147483651; $clock++) {
print ctime($clock);
}
Nếu máy tính của bạn sẽ ổn, bạn sẽ nhận được điều này:
Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038 <-- Last second in 32-bit Unix systems
Tue Jan 19 03:14:08 2038
Tue Jan 19 03:14:09 2038
Tue Jan 19 03:14:10 2038
Nếu máy tính của bạn giống như của tôi, nó sẽ quấn quanh như thế này:
Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901
Nó cũng có thể làm điều này:
Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
Tue Jan 19 03:14:07 2038
ctime
?
Tôi đã viết và xuất bản một bài báo ngắn về điều này vào năm 1996. Điều này bao gồm một chương trình C ngắn để chứng minh điều đó. Tôi cũng đã có email với David Mills về các vấn đề tương tự với NTP - Giao thức thời gian mạng. Trên máy tính xách tay Ubuntu 14.04 64 bit của tôi, mã perl không thể hiện giới hạn nên các lib 64 bit cơ bản phải được sửa đổi.
Tuy nhiên, việc chạy mã kiểm tra từ lâu của tôi sẽ hiển thị thời gian kết thúc trở lại UNIX Epoch. Vì vậy, không phải tất cả đều tốt với mã 32 bit từ quá khứ.
Bài báo năm 1996 của tôi, Thời gian UNIX sẽ hết vào năm 2038! đã có mặt trên trang web của tôi từ khoảng năm 2000. Một biến thể của tiêu đề "Thời gian UNIX" này đã được xuất bản năm 1998 trong "Năm 2000 Thực tiễn tốt nhất cho máy tính thiên niên kỷ Y2K" ISBN 0136465064.
Linux 64-bit đã sẵn sàng, ít nhất là nếu bạn đang nói về các giao diện hệ điều hành cốt lõi (tất nhiên các ứng dụng riêng lẻ vẫn có thể làm hỏng nó). Theo truyền thống, time_t được định nghĩa là bí danh cho "dài" và "dài" trên linux 64 bit là 64 bit.
Tình huống đối với Linux 32 bit (và lớp tương thích cho các tệp nhị phân 32 bit trên Linux 64 bit) ít màu hồng hơn nhiều. Nó bị hỏng và sửa nó mà không phá vỡ tất cả các nhị phân hiện có không phải là một nhiệm vụ dễ dàng. Toàn bộ API sử dụng time_t và trong nhiều trường hợp, nó được nhúng như một phần của cấu trúc dữ liệu, do đó, không chỉ các API phải được sao chép cấu trúc dữ liệu mà chúng hoạt động cùng.
Ngay cả khi có một số mức độ tương thích ngược, tất cả các nhị phân muốn có thời gian chính xác sẽ cần phải được xây dựng lại để sử dụng giao diện thời gian 64 bit mới.
Đã có một số công việc được thực hiện (ví dụ: https://lwn.net/Articles/643234/ và http://www.sourceware.org/ml/libc-alpha/2015-10/msg00893.html ) nhưng chúng tôi cho biết vẫn còn một chặng đường dài từ một giải pháp đầy đủ. Vẫn chưa rõ liệu sẽ có phân phối 32-bit có mục đích chung là Y2K38 an toàn hay không.