본문 바로가기
Linux

[Linux] Linux(Unix) 2038년 문제 - Y2K38

by lucas_owner 2023. 1. 4.

새해가 되면 많은 개발자, IT 업계에 종사하고 있는 사람들은 Linux 2038년 문제에 대해서 이야기를 나누고는 한다. 

2023년인 현재에 비해서는 15년이나 남았다. (하지만 하루하루 살다보면 2038년은 금방 올 수 있기 때문이다...!)

그렇다면 Linux 2038년 문제는 무엇일까?

[문제]

32bit 운영체제를 사용하는 OS(Linx,Unix)는 2038/01/19 03:14:07초 를 지나게 되면 1901/12/31, 혹은 1970/01/01

시점으로 타임슬립하는 문제이다. 정식 명칭은 Y2K38, Y2038 라고 한다.  

 

- 문제 원인

컴퓨터에서 '그레고리 력' 시간을 계산하는 방법에는 여러가지가 있는데, 현재 보편적으로 사용하는 방법은 

Unix Time을 사용한다. 해당 방법은

-> 32bit 크기의 정수형을 사용하여 시간을 나타냄, 초당 1씩 증가한다. 하지만 32비트의 표현 한계점은

2,147,483,647 이기 때문에 해당 수를 넘어가게 되면 OverFlow(초과되어 흘러넘침) 현상이 발생하고, 

OverFlow가 발생하면 최소값으로 돌아가게된다.

 

그렇게 된다면 2038/01/19 03:14:07초를 지나게 된다면 ?? 32bit를 사용하는 컴퓨터들의 시간은 1970/01/01 자정으로 돌아가게 된다. 

 

*Y2K 란?

- 'Y2K' 의 Y는  연도를 나타내는 'Y'ear, K는 1000을 의미하는 '킬로(Killo)'를 나타낸다. 

그 때 당시 컴퓨터의 운영체제는 연도 표기를 YY. MM. DD 를 사용하고 있었다. 

Ex) 1999년 1월 1일 -> 99.01.01 로 표기됨. 

그렇다면 1999년에서 2000년도로 넘어가게 된다면, 해당 표기를 사용하는 컴퓨터에서는 날짜를 00.01.01로 표기하게 되어

00년을 1900년으로 간주하여 오류가 발생한다는 문제이다. (Y2K, 밀레니엄버그)

 

- 이 때 당시 컴퓨터는 메모리, 저장장치의 성능이 좋지 않았고, 가격 또한 저렴하지 않았기에 연도 표기를 4자리(1999)로 하지 않았다.

그 이유는 연도 표시의 '19' 를 사용하게 된다면 메모리 용량이 많이 필요로 했고, 또한 불필요한 데이터를 입력시 컴퓨터의 정보 처리속도가

늦어져 성능 저하의 원인이 되었기 때문이다. 

 

[해결법]

1. 부호 없는 정수형으로 변경하는 것

   -> 해당 방법은 문제를 2106년까지 늦출 수 있다. 음수를 제외 하면 0 ~ 4,294,967,295 까지 증가 하기 때문이다. 

   -> 문제점 : Unix Time의 0인 1970년 1월 1일 이전의 시간은 셀 수가 없다. 즉 70년생 이하는 셀 수 없다.

 

2.OS를 64bit 이상으로 변경하는 것!

   -> 이것도 문제가 간단하지는 않다. 왜냐하면 32비트에 맞추어져 있는 실행 파일이나, 라이브러리들은 OS에서 64비트 정수형으로 

        시간을 처리한다는 사실을 모르기 때문에 64비트에 맞춰 수정하지 않는다면 기존 알고리즘 및 호환성에서 에러가 발생 할 수 있기 때.   문이다.

 

   -> 하지만 호환성 문제를 해결 한다면! 2922억 7702만 6596년 까지는 문제가 발생하지 않는다! 

        지구의 수명이 약 80억년 정도 남았다고 추정한다면, 지구가 남아있다면 다시는 고려하지 않아도 될 문제이다. 

 

*참고로 64비트 정수형의 최대값은 : 9,223,372,036,854,775,807 이다.

 

[추가]

1. 많이 사용하는 RDB인 MySQL에서 지원하는 TIMESTAMP 형에는 버그가 남아있다.

  다른 날짜 형식으로 바꿔도 10000년 이후는 표시 할 수 없다. 이는 다른 RDB도 마찬가지 이다. 

  해당 문제를 해결 하려면 입력받은 날짜를 64비트 정수로 변환하는 기능이 필요하다. 

  하지만 대부분 RDB는 64비트 정수를 날짜로 변환하는 기능을 제공 하고 있다! 

 

2. 안드로이드 8.0 이상 버전에선느 2038 문제가 이미 해결이 되어있다. (재현불가)

 

출처 : https://namu.wiki/w/2038년%20문제

반응형

댓글