티스토리 뷰

[1줄 요약]

2038년 1월 19일(정확히는 2038/01/19 03:14:07초를 지난 시점)에 32bit의 모든 OS들이 1901년 12월 13일로 타임슬립한다는 내용입니다. ( 정식 명칭은 UNIX Y2K or Y2K38 or Y2038 )

 

[1줄 Solution]

결국은 OS를 64bit로 변경하는게 정답이라는 내용입니다.

 

"인용 글"

2038 년 문제에 대한 보편적 인 해결책은 없습니다. time_t 데이터 유형 의 정의를 변경하면 날짜 및 시간 표시가 부호있는 32 비트 정수 의 특성에 종속되는 모든 응용 프로그램에서 코드 호환성 문제가 발생 합니다. 

 

프로그래밍에 자신 있는 분들이라면 time_t 데이터를 변경하면 되지만, 종속되는 모든 코드들을 변경해야 되니... (불가능)

 

 

[자세한 내용]

컴퓨터의 시계가 UTC 0 기준, 2038년 1월 19일 3시 14분 7초(대한민국 표준시 UTC+9 기준, 2038년 1월 19일 12시 14분 7초)가 지나는 순간 음수값이 적용되어 1902년 12월 13일 20시 45분 52초나, 자동적으로 오류를 감지하고 초기값인 0, 즉 1970년 1월 1일 0시 0분 0초로 돌아가게 되는 버그를 칭한다. 영어로는 Year 2038 problem, Unix Millennium bug 등으로 표기한다.

간단하게 설명하면 2038년 1월 19일 새벽 3시 14분 7초를 지난 시점(2038/01/19 03:14:07)에 32비트 규격의 모든 컴퓨터가 136년 전 혹은 68년 전으로 단체로 타임슬립 해버리는 일이 벌어집니다.

 

컴퓨터에서 사람들이 사용하는 그레고리력 시간을 계산하는 방법은 여러가지가 있는데, 가장 많이 쓰는 방법이 유닉스 운영체제에서 채용한 유닉스 시간(Unix Time 또는 POSIX Time)이다. 여기서 사용한 방식이 32비트 크기의 정수형으로 시간을 나타내는 변수를 선언하고 초당 1씩 증가하게 처리하였다. 이로 인해 값이 32비트 크기의 표현한계인 2,147,483,647까지 증가한다면 더이상 증가할 값이 없게 된다. 컴퓨터에서는 이런 표현범위의 초과현상(Overflow 현상)이 발생할 경우 해당범위의 최소값으로 돌아가는 식으로 처리되는 특징이 있다. 간단하게 값(x)의 범위가 0≤x≤99 일때 99 다음의 수는 100이 아니라 0이 되는 식이다. (밀레니엄 버그 시즌2)

이로 인해 2038년 1월 19일 3시 14분 7초가 지나면 유닉스 시간의 맨 처음 시간으로 돌아가게 된다. 요컨데 컴퓨터의 시간이 과거로 역행하게 된다. 그로 인해 컴퓨터의 각종 연산에 문제를 줄 수 있다. 좀 오바질이 될 수도 있지만 과거 Y2K 문제에서 언급됐던 그런 현상들이 발생할 가능성이 있다. Y2K는 사람이 헷갈리는 거지만 이건 기계가 헷갈리는 거니까 진짜로.

시간을 나타내는 변수를 32비트 크기가 아니라 64비트 크기의 정수형으로 바꾸면 되긴 하지만 말처럼 쉬운게 아니란 점이 골치거리. 아직까지 많은 OS나 CPU들이 32비트 아키텍처[1]인 상황인데다가, 시간을 표현하는 변수의 형식을 그냥 막 바꿔버리면 기존에 구현했던 알고리즘들도 꼬이고 각종 호환성 크리가 터질 수 있어서 골치거리다.

정수형을 부호 없는 정수형(Unsigned Integer)으로 바꾸면 2106년까지 늦출수 있다. 음수 부분이 없이 0부터 시작하므로 4,294,967,295까지 증가하기 때문이다. 근데 이러면 시간의 계산을 할 수 없으니까 안된다.

 

하지만 컴퓨터 업계쪽 사람들은 의외로 느긋하게 생각하고 있는데 현재 컴퓨터들이 64비트 아키텍처와 시스템으로 넘어가는 단계이기 때문에 시간이 좀 흐르고나면 저절로 해결될 것이라 생각하고 있다. 유닉스 시간을 설계하던 당시에도 이 문제를 알고 있었지만 "후손님들이 그 전에 알아서 잘 해결할거야"였다나 뭐라나...(내가 그 후손이 될지도? -_-..) 하지만 이미 현실에서는 문제가 발생하고 있다. 바로 미래를 다루는 구형 시스템들. 예를 들어 연금보험을 2038년 문제를 보정하지 않은 구형 시스템으로 처리할 경우 1977년생이 만 61세부터 보험을 탈 수 있다고 가정하면 바로 2038년(!)에 첫 연금을 수령하게 된다. 수령 예상액 등을 미리 계산해보면 이 사람은 태어나기도 전인 1901년 or 1970년에 연금을 수령하는 꼴이 된다(...) 물론, 가정을 한 것이며 당연히 현재 국내 시스템은 2038년 문제가 없다고 생각 된다.

일단 64비트 시스템에도 숫자를 표시할 수 있는 한계는 여전히 있으므로 이대로 간다면 2922억 7702만 6596년문제가 발생하게 되지만 아직 이 문제를 진지하게 제기한 사람은 없다.근데 그정도면 우주의 나이도 아득히 초월하는데 그때까지 인류가 존재하긴 할까?

 

 

 

 

 

https://en.wikipedia.org/wiki/Year_2038_problem

https://namu.wiki/w/2038%EB%85%84%20%EB%AC%B8%EC%A0%9C

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함