Sự cố máy tính năm 2000

**Sự cố máy tính năm 2000** (còn được gọi là **sự cố Y2K**, **lỗi thiên niên kỷ**, hay đơn giản là **Y2K**) là sự cố máy tính diễn ra vào thời khắc đầu tiên bước sang năm 2000. Nguyên nhân là do các máy tính thế hệ cũ, các vi mạch đồng hồ điện tử cũ không thể nhận biết được sự khác biệt giữa các năm 2000 và 1900, bởi vì chúng được lập trình với 2 chữ số cuối cùng của năm nhằm tiết kiệm dung lượng lưu trữ khi mà giá cả sản xuất phần cứng máy tính trong giai đoạn đầu còn đắt đỏ. Khi những máy này cộng thêm một con số vào sau 99 (Ví dụ 1), BIOS sẽ đặt lại số đếm thành 00. Vấn đề này là do máy tính nhận dạng ngày 01/01/00 (ngày 1 tháng 1 năm 2000) như là ngày 1 tháng 1 năm 1900.

Trong việc thiết kế lập trình chương trình máy tính, hai chữ số của năm bị phát sinh lỗi khi chuyển từ x99 đến x00. Điều này đã gây ra một số mặt hạn chế liên quan đến hoạt động không chính xác của ngày và thời gian sau ngày và giờ và sau ngày 1 tháng 1 năm 2000 gọi là ngày giới hạn hay với cái tên "chân trời sự kiện". Nếu như không được sửa chữa kịp thời thì hệ thống làm việc lâu dài sẽ bị phá vỡ khi "...97, 98, 99, 00..." tăng dần theo thứ tự trở nên không hợp lệ và sẽ xảy ra lỗi Y2K.

Vì sự cố này, công ty và các tổ chức trên toàn thế giới đã kiểm tra, sửa chữa, và nâng cấp hệ thống máy tính của họ.

Mặc dù đã có các nỗ lực khắc phục hậu quả, số lượng các lỗi máy tính đã xảy ra khi đồng hồ của chúng chuyển sang năm 2000 vẫn là một ẩn số; một trong các lý do là do sự ngần ngại của các tổ chức khi báo cáo về vấn đề này.

Ngày nay, các máy tính đời mới đã khắc phục được sự cố Y2K có thể xảy ra trong khi hết thế kỉ.

## Bối cảnh

Y2K (Sự cố máy tính năm 2000), một từ gồm chữ ghép với số, là viết tắt phổ biến của vấn đề phần mềm năm 2000. Viết tắt này là kết hợp của: Y cho "Year", và K cho tiền tố đơn vị kilo có ý nghĩa là 1000; do đó 2K có nghĩa là 2000. Ngoài ra, nó còn có một tên gọi khác "Lỗi Thiên Niên Kỷ" (Millennium Bug) bởi vì nó có liên hệ với sự kiện chuyển giao thiên niên kỷ, mặc dù vấn đề này có thể xảy ra vào thời điểm cuối của bất cứ thế kỷ bình thường nào.

Sự cố năm 2000 là tên của một cuốn sách được viết trước đó, Computers in Crisis, của Jerome và Marilyn Murray (Petrocelli, 1984; được McGraw-Hill tái bản dưới tựa đề The Year 2000 Computing Crisis vào năm 1996).

Từ viết tắt Y2K được tạo ra bởi David Eddy, một lập trình viên ở Massachusetts, trong một thư điện tử được gửi đi vào ngày 12 tháng 6 năm 1995. Sau này ông nói rằng, "Mọi người gọi nó là CDC (Century Date Change), FADL (Faulty Date Logic). Ngoài ra còn có nhiều từ khác. Y2K chỉ đơn giản là xuất hiện từ các ngón tay của tôi."

Vấn đề nảy sinh trên cả các máy tính lớn và các máy tính cá nhân mới hơn, thiết bị lưu trữ thời đó rất đắt đỏ, từ mức thấp vào khoảng 10 đô la cho 1 kilobyte, cho đến nhiều trường hợp lên đến 100 đô la một kilobyte. Do đó giảm dung lượng là một vấn đề rất quan trọng đối với các lập trình viên. Từ khi phương pháp thêm tiền tố "19" cho một năm của một ngày, hầu hết các chương trình máy tính đều sử dụng phương pháp này một cách nội bộ, hoặc dùng để lưu trữ trên đĩa hoặc băng, các tệp dữ liệu có định dạng ngày tháng gồm 6 chữ số MMDDYY, MM tượng trưng cho 2 ký tự của tháng, DD tượng trưng cho hai ký tự của ngày, và YY là hai ký tự của năm. Tương tự, không gian lưu trữ dữ liệu trên băng, đĩa rất đắt đỏ, cho nên phương pháp này giúp tiết kiệm chi phí bằng cách giảm dung lượng của các tệp dữ liệu và các cơ sở dữ liệu.

Nhiều chương trình máy tính lưu năm dưới dạng hai chữ số; ví dụ, năm 1980 được lưu là 80. một vài chương trình như vậy không thể phân biệt năm 2000 và năm 1900. Các chương trình khác cố gắng đặt tạm năm 1900 làm đại diện cho năm 2000. Điều này có thể gây ra sự sụp đổ hoàn toàn và dẫn đến các phép so so sánh ngày cho kết quả sai. Một số hệ thống nhúng cũng sử dụng logic ngày tương tự, đã được dự kiến là thất bại và sẽ làm tê liệt các tiện ích cũng như các cơ sở hạ tầng khác.

Một vài cảnh báo đặc biệt nghiêm trọng về những gì sẽ xảy ra nếu không có biện pháp xử lý đã được đưa ra:Sự cố Y2K là một thảm họa El Niño đối với điện tử và sẽ gây ra các bất ngờ khó chịu trên toàn cầu - *[[John Hamre]], Phó Thư ký Bộ quốc phòng Mỹ.*Các ủy ban đặc biệt đã được thành lập bởi các chính phủ để giám sát công tác khắc phục và lập kế hoạch khẩn cấp, đặc biệt là các cơ sở hạ tầng quan trọng như viễn thông, các tiện ích và những thứ tương tự, nhằm đảm bảo các dịch vụ quan trọng đã sửa chữa các vấn đề của chúng và đã sẵn sàng khi có vấn đề nảy sinh với các thiết bị, dịch vụ liên quan. Trong khi một số nhà bình luận và chuyên gia lập luận rằng vấn đề bao trùm lên sự kiện này là lo ngại khủng bố, và nỗi lo này sẽ qua đi khi vượt qua được "chân trời sự kiện" của Y2K vào ngày 1 tháng 1 năm 2000. Ros Anderson, giáo sư ngành Kỹ thuật An ninh tại Phòng thí nghiệm Máy tính Đại học Cambridge, ông cho biết mặc dù đã gửi đi hàng trăm thông cáo về kết quả nghiên cứu cho thấy vấn đề không nghiêm trọng như các gợi ý khác, nhưng chúng đã không được giới truyền thông quan tâm.

## Sự cố lập trình
Việc sử dụng định dạng ngày 2 chữ số của các máy tính thế hệ trước nhằm tiết kiệm chi phí và nâng cao sự tiện lợi sẽ không làm phát sinh vấn đề cho đến khi ngày tháng được lưu trữ trong chúng được sử dụng trong việc tính toán.

### Nhu cầu bảo quản bit
Trong thập niên 1960, bộ nhớ máy tính rất khan hiếm và đắt tiền, và hầu hết các dữ liệu được thực hiện trên phiếu đục lỗ là dữ liệu văn bản trong 80 cột tài liệu hồ sơ. Các ngôn ngữ lập trình thời gian như COBOL và RPG xử lý số liệu trong ASCII hoặc EBCDIC. Các nhà lập trình lúc trước họ sử dụng bit gọi là "đục lỗ vùng" để lưu một ký tự trừ cho dạng số âm, hoặc để nén hai chữ số thành một byte hình thức này gọi là mã thập-nhị phân, nhưng nếu không thì đã được xử lý số như dạng chữ thẳng (straight text). Sau một thời gian thì các phiếu đục lỗ chuyển đổi thành băng từ tính và sau đó là những tập tin đĩa, tiếp sau là đến cơ sở dữ liệu đơn giản như ISAM nhưng cấu trúc của các chương trình thường thay đổi rất ít. Phần mềm phổ biến như dBase tiếp tục thực hiện việc lưu trữ văn bản vào những thập niên 1980 và 1990.

Việc tiết kiệm hai chữ số cho mỗi trường ngày đã được chú ý đến vào thập niên 1960. Các nhà lập trình ở thời điểm đó đã không chú ý đến lập trình thời gian mà họ chỉ quan tâm đến giải quyết các vấn đề chương trình, phần cứng dẫn đến việc sai số ở hai chữ số của năm rất đáng kể.

Tất nhiên sẽ có trường hợp ngoại lệ. Người đầu tiên biết được sự cố này là nhà khoa học máy tính nổi tiếng Bob Bemer, người đã nhận ra vào năm 1958 khi làm việc trên phần mềm phả hệ. Ông đã trải qua hai mươi năm đèn sách để trở thành nhà lập trình viên IBM, chính phủ Mỹ và ISO đã tham gia vào nhưng kết quả đem lại không đáng là bao. Điều này đã thúc đẩy ngôn ngữ lập trình COBOL ra đời vào năm 1961 để xác định bốn chữ số của năm cho chính xác. Mặc dù sự cố này được thông báo trên các tạp chí từ năm 1970 trở đi nhưng phần lớn các lập trình viên mới công nhận sự cố lớn Y2K này trong giữa thập niên 1990, thậm chí kéo dài đến gần cuối thập niên này mới được giải quyết thoả đáng.

**<big>Chú ý sớm</big>**

Người đầu tiên được biết là giải quyết công khai vấn đề này là Bob Bemer, người đã nhận thấy nó vào năm 1958 do kết quả của công việc trên phần mềm phả hệ. Ông đã dành hai mươi năm tiếp theo để cố gắng làm cho các lập trình viên, IBM, chính phủ Hoa Kỳ và Tổ chức Tiêu chuẩn hóa Quốc tế nhận thức được vấn đề, với rất ít kết quả. Điều này bao gồm khuyến nghị rằng mệnh đề hình ảnh COBOL nên được sử dụng để chỉ định bốn năm chữ số cho ngày.

Vào những năm 1980, ngành môi giới bắt đầu giải quyết vấn đề này, chủ yếu là do trái phiếu có ngày đáo hạn sau năm 2000. Đến năm 1987, Sở giao dịch chứng khoán New York đã chi hơn 20 triệu đô la, bao gồm cả "một nhóm 100" lập trình viên trên Y2K.

Mặc dù các bài báo trên tạp chí về chủ đề này từ năm 1970 trở đi, phần lớn các lập trình viên và nhà quản lý chỉ bắt đầu nhận ra Y2K là một vấn đề lờ mờ vào giữa những năm 1990, nhưng ngay cả khi đó, quán tính và sự tự mãn khiến nó hầu như không được giải quyết cho đến vài năm trước thập kỷ. Năm 1989, Erik Naggum là công cụ đảm bảo rằng thư internet đã sử dụng bốn chữ số đại diện của năm bằng cách bao gồm một khuyến nghị mạnh mẽ về hiệu ứng này trong tài liệu yêu cầu máy chủ internet RFC 1123. Vào ngày Cá tháng Tư năm 1998, một số công ty đã đặt ngày các máy tính lớn của họ thành năm 2001, do đó "ngày sai sẽ được coi là niềm vui tốt thay vì tính toán xấu" trong khi có cả ngày thử nghiệm.

Trong khi sử dụng 3 chữ số năm và 3 chữ số trong năm đó đã được một số người sử dụng, những người khác đã chọn sử dụng số ngày kể từ ngày cố định, chẳng hạn như ngày 1 tháng 1 năm 1900. Không hành động không phải là một lựa chọn và có nguy cơ thất bại lớn. Các hệ thống nhúng có logic ngày tương tự dự kiến sẽ gặp trục trặc và khiến các tiện ích và cơ sở hạ tầng quan trọng khác bị hỏng.

Tiết kiệm không gian vào các ngày được lưu trữ vẫn tồn tại trong thời đại Unix, với hầu hết các hệ thống biểu thị ngày thành một từ 32 bit duy nhất, thường biểu thị ngày là giây trôi qua từ một ngày cố định, gây ra vấn đề Y2K38 tương tự

## Các sự cố khác

### Trước năm 2000
* Vào ngày 1 tháng 1 năm 1999, đồng hồ taxi ở Singapore ngừng hoạt động, trong khi ở Thụy Điển, giá vé taxi được đưa ra không chính xác.
*Vào ngày 28 tháng 12 năm 1999, 10.000 thẻ của ngân hàng HSBC được sản xuất bởi công ty Racal ngưng hoạt động các giao dịch nhận và rút tiền, do vậy các giao dịch phải chuyển sang giao dịch trên giấy.

### 1 tháng 1 năm 2000
Vào ngày 1 tháng 1 năm 2000 có một số trục trặc xảy ra ở các nước như sau:

* Tại Sheffield, Anh, các đánh giá rủi ro không chính xác về hội chứng Down đã được gửi tới 154 phụ nữ mang thai và hai lần phá thai được thực hiện do kết quả trực tiếp của lỗi Y2K gây ra tính toán sai tuổi của các bà mẹ. Bốn em bé mắc hội chứng Down cũng được sinh ra từ những bà mẹ được cho biết chúng thuộc nhóm nguy cơ thấp.
* Ở Ishikawa, Nhật Bản, thiết bị theo dõi bức xạ không hoạt động vào nửa đêm, nhưng không gây rủi ro nào.
* Ở Onagawa, Nhật Bản, báo động ở nhà máy nguyên tử hai phút vào trước 24h đêm.
* Ở cảng Osaka Media, Nhật Bản, một thiết bị viễn thông bị lỗi vì xử lý dữ liệu, lỗi được sửa kịp thời và không gây nguy hại.
*Tại Nhật Bản, Mạng truyền thông di động NTT (NTT DoCoMo), nhà điều hành di động lớn nhất của Nhật Bản, đã báo cáo vào ngày 1 tháng 1 năm 2000, rằng một số kiểu điện thoại di động đã xóa các tin nhắn mới nhận được, thay vì các tin nhắn cũ hơn, khi bộ nhớ bị lấp đầy.
* Ở Australia, máy kiểm tra vé xe bus ngừng hoạt động.
* Ở Pháp, dịch vụ dự báo thời tiết quốc gia, Meteo France, xuất hiện lỗi trên website với lý do lập trình, trang web hiển thị ngày 1 tháng 1, năm "1900".

### 1 tháng 3 năm 2000
Các vấn đề đã được báo cáo nhưng chủ yếu là nhỏ.

* Tại Nhật Bản, khoảng 5% máy rút tiền bưu điện không hoạt động.

### Vào 31 tháng 12 năm 2000 hoặc 1 tháng 1 năm 2001
Một số phần mềm chưa nhận chính xác năm 2000 là một năm nhuận và do đó hoạt động trên cơ sở năm có 365 ngày. Vào ngày cuối cùng của năm 2000 (ngày 366), các hệ thống này đã xuất hiện nhiều lỗi khác nhau. Đây thường là nhỏ, ngoài các báo cáo về một số chuyến tàu Na Uy đã bị trì hoãn cho đến khi đồng hồ của họ được đưa trở lại một tháng.

### 1 tháng 1 năm 2020
Một số phần mềm đã sử dụng một quy trình gọi là windowing để khắc phục sự cố bằng cách diễn giải các năm 00-19 là 2000-2019 và 20-99 là 1920-1999. Do đó, một làn sóng trục trặc mới bắt đầu xuất hiện vào năm 2020, bao gồm cả đồng hồ đỗ xe ở thành phố New York từ chối nhận thẻ tín dụng vì sai ngày, các vấn đề với các đơn vị bán hàng Novitus, một số công ty tiện ích in hóa đơn niêm yết năm 1920 và trò chơi điện tử WWE 2K20 gặp sự cố.

## Chú thích