ABOUT ME

성운이의 잡다한 기록 저장소

Today
Yesterday
Total
  • 시간에 관하여(5) - 컴퓨터가 시간을 다루는 방법
    잡학사전/시간에 관하여 2021. 4. 6. 22:57
    반응형

     

    지금까지의 이야기

    달력과 시계에서 12와 60이라는 수를 사용하게 된 배경부터 시작했습니다. 4년에 한 번씩 1년이 366일이 되는 달력과, 1분이 61초가 되는 시계에 대해 알아보았습니다. 날짜와 시계를 표시하는 국제 표준 규격이 생기기까지의 과정을 알아보았습니다. '시간에 관하여'가 책이라면 첫 번째 챕터가 끝난 셈입니다.

    지금의 시계가 있기까지 과정이 그리 간단하지만은 않았습니다. 힘들게 정한 이 시계가 어떤 의미가 있는 걸까요? 이번 포스팅부터는 현대 문명에서 시계가 가지는 의미에 대해 알아보겠습니다. 그 첫 번째 이야기는 앞서 다루었던 협정 세계시(UTC)와 컴퓨터에서 시작합니다.

     

    Unix Timestamp - 컴퓨터의 시계

    타임스탬프(Timestamp)는 말 그대로 '시각'을 나타내는 도장입니다. 앞선 포스팅에서 다루었던 날짜를 표기하는 방법들인 '2021-04-06T12:34:56+09:00', 'Tue Apr 6 12:34:56 2021 GMT+9'이 모두 타임스탬프입니다. 하지만 표현이 모두 제각각이고, 무엇보다 길이가 깁니다. 값을 저장하기에도, 다른 곳으로 전송하기에도 손해입니다. 어떻게 하면 시각을 간단하게 나타낼 수 있을까요?

    결론부터 말씀드리겠습니다. 위에서 타임스탬프의 예시로 든  '2021-04-06T12:34:56+09:00' 는 컴퓨터에서 '1617680096'으로 저장됩니다. 어떻게 나온 수인지 감이 오시나요? 컴퓨터는 협정 세계시(UTC) 1970년 1월 1일 0시를 기준으로 몇 초가 지났는지를 사용해 현재 시각을 나타냅니다. 16억이 넘는 큰 수를 우리가 알아볼 수 있도록 변환하기 위해 추가적인 계산이 필요하다는 단점이 있지만, 표현의 모호성을 없애고 단 하나의 수로 나타낼 수 있다는 장점 때문에 도입되었습니다. 이러한 표기 방식을 유닉스 시간(Unix Timestamp), POSIX 또는 Epoch 시간이라고 부릅니다. 일반적인 타임스탬프와 Epoch 간의 변환은 www.epochconverter.com 에서 직접 테스트해 볼 수 있습니다. 1970년 이전을 나타낼 때는 음수를 사용하며, 조금 더 정확한 값을 위해 밀리초, 마이크로초 심지어는 10억 분의 1초인 나노초 단위로 확장하여 사용하는 경우도 있습니다.

    UTC를 기준으로 하고 모호성도 없으며 표현마저 간단한 이 방법은 언뜻 보기에 완벽해 보입니다. 하지만 컴퓨터이기에 피해 갈 수 없는 약점 역시 존재합니다.

     

    첫 번째 약점 - 오버플로우 - 강남스타일 조회수의 비밀

    싸이의 강남스타일을 기억하시나요? 세계적인 인기를 끌었던 싸이의 뮤직비디오가 세계 최대 동영상 플랫폼인 YouTube에서 무려 -21억에 달하는 조회수를 달성했습니다. 오타가 아닙니다. 마이너스 21억입니다.

    컴퓨터는 수를 나타날 때 일반적으로 32bit 정수를 사용합니다. 0과 1로 이루어진 32자리 이진수를 사용한다는 의미입니다. 이 중 가장 앞자리는 부호를 나타내는 데 사용하고 나머지 31자리로 수를 표현합니다. 이 방법을 사용하면 -2,147,483,648 ~ 2,147,483,647까지의 수를 나타낼 수 있습니다. 무려 42억에 달하는 수를 나타낼 수 있지만 치명적인 문제가 있습니다. 가장 큰 수인 2,147,483,647에 1을 더하면 가장 작은 수인 -2,147,483,648가 되어 버립니다. 받아올림에 의해 표현할 수 있는 자릿수를 벗어나면서 생기는 문제이며, 이를 오버플로우(Overflow)라고 부릅니다.

    Youtube는 영상의 조회수가 21억이 넘는 일이 없을 거라 생각했지만, 세계 최초로 강남스타일 뮤직비디오가 이 기록을 깨 버렸습니다. 이 사건 이후 Youtube는 기존의 두 배인 64비트 정수를 사용하도록 수정되었습니다. 이제 922경에 달하는 조회수가 생기지 않는 한 안전합니다.

    일찍부터 컴퓨터에 관심을 가지셨던 분들은 밀레니엄 버그 또는 Y2K라고 부르는 문제를 들어 보신 적이 있으실 겁니다. 초기 컴퓨터는 날짜를 표기할 때 연도를 뒤에 두 자리만 기록하는 방법을 사용했습니다. 그래서 1999년 말, 2000년이 될 때 컴퓨터 연도가 00으로 바뀌며 큰 문제가 생길 수 있다는 괴담이 퍼졌고, 이를 밀레니엄 버그라고 말합니다. 실제로 사회에 혼란이 있을만한 문제는 없었지만, 일부 컴퓨터에서 연도가 100년 또는 1900년으로 표기되는 해프닝은 있었습니다.

    위 두 개의 사건은 이미 지났고, 해결이 되었습니다. 하지만 모든 문제가 사라진 것은 아닙니다. 유닉스 시간 역시 기본적으로 32비트 정수를 사용하고 있기 때문에 21억 초까지만 셀 수 있습니다. 지금이 16억 초 정도로 표시되니까 한계점의 3분의 2 정도 다다른 것입니다. 이 값이 최대치가 되는 순간은 UTC 기준 2038년 1월 19일 3시 14분 07초입니다. 여기서 1초가 더 지나는 순간 값이 음수로 바뀌면서 1901년 2월 13일 20시 45분 52초로 바뀌거나, 초기값인 1970년 1월 1일 0시로 돌아가게 되는 버그가 발생할 수 있습니다. 실제로 업데이트가 되지 않은 구형 휴대폰이나 앱에서 일정을 2038년 1월 19일로 설정하면 1970년 1월 1일로 바뀌는 버그가 있습니다. 또한 몇몇 캘린더 앱은 2037년 이후의 일정을 등록할 수 없도록 막아두고 있습니다.

    일찍부터 예견된 문제이고 앞으로 17년 남았습니다. 점점 우리의 삶에서 컴퓨터가 차지하는 비중이 커지고 있는 만큼 예방이 필수적입니다.

     

    두 번째 약점 - 윤초 - 1초 때문에 수백 대의 항공기 결항

    이전 포스팅에서 UTC의 오차 보정을 위해 도입한 윤초에 대해 알아보았습니다. 윤초는 어떤 문제를 일으킬까요?

    앞선 포스팅에서 다루었듯, IERS에서 윤초 도입을 결정하면 네트워크에 연결된 컴퓨터들은 해당 윤초를 스케줄에 등록하고, 도입 시점이 되었을 때 적용합니다. 여기에는 잠재적인 문제점이 있습니다. 1분이 59초가 되는 경우 1초를 건너뛰게 되며 61초가 되는 경우, 같은 시각이 두 번 나타날 수 있습니다. 단순해 보이지만, 이 문제는 강남스타일이나 밀레니엄 버그보다 더 큰 문제를 일으켰습니다.

    2012년 7월 1일 한국 시각 오전 9시, 전 세계의 많은 인터넷 서버가 동시에 작동을 멈췄습니다. UTC 기준 6월 30일 23시 59분에 윤초가 도입되고 7월 1일 0시가 되는 순간 많은 컴퓨터의 CPU가 100%의 사용률을 달성하며 어떠한 추가 계산도 하지 못하는 상태에 빠지게 되었고, 실제로 많은 서비스가 중지되었습니다. 이 중에는 소셜 서비스 Linked In과 해외 유명 커뮤니티 Reddit, 그리고 호주의 항공사 Qantas와 한국의 비트윈을 포함한 많은 서비스의 서버 컴퓨터가 포함되어 있었습니다.Qantas는 예약 시스템에 문제가 생겨 수백대의 항공기가 이륙하지 못하는 상황까지 벌어졌습니다.

    이번 사건은 예상하지 못한 문제였던 만큼 손실이 막대했습니다. 이후 이 문제는 서버 컴퓨터 운영체제인 Linux 커널 버그로 밝혀졌고, 지금은 수정되었습니다. 2008년 이후 4년 만에 적용되는 윤초였으며, 이전보다 컴퓨터의 비중이 늘어나면서 크게 체감되었던 문제였습니다.

    반면 구글은 이 문제를 피해 갔습니다. 2005년 윤초가 도입되었을 때 자체 서버 몇 대가 문제를 일으킨 것을 확인하고는 자체적인 윤초 처리 시스템을 도입해 운영하고 있었기 때문입니다. 1초가 추가되는 윤초가 도입되었다고 가정합니다. 구글은 윤초가 도입되기 12시간 전부터 시계가 조금씩 천천히 가도록 조정합니다. 그리고 윤초가 도입되기 직전 구글의 시계는 UTC보다 0.5초 느린 상태가 됩니다. 그리고 윤초가 도입되면 구글의 시계는 UTC보다 0.5초 빠른 상태가 됩니다. 다시 이후 12시간 동안 같은 속도로 천천히 시계가 동작하고 나면, UTC와 구글의 시계는 동일하게 맞춰집니다. 프로그램들은 윤초가 없었던 것처럼 평소와 같이 동작할 수 있게 됩니다. 구글의 이러한 방법을 Leap Smear라고 합니다.

     

    분산 컴퓨팅 그리고 클라우드

    최근 컴퓨터를 통한 서비스가 급격하게 증가하면서 프로그램을 만드는 방법이 많이 달라졌습니다. 하나의 컴퓨터로는 수많은 사용자를 감당할 수 없기 때문에 여러 대의 컴퓨터를 사용해 사용자의 요청을 분산시켜 서비스를 제공하는 이른바 '분산 컴퓨팅'이 대세가 되었습니다. 이 포스팅에서 분산 컴퓨팅에 대해 자세하게 다루지는 않겠지만, 우리가 초점을 맞출 부분은, 분산 컴퓨팅을 위한 기본은 '정확한 시계'라는 점입니다.

    조별 과제를 생각해 봅시다. 우리는 과제 중에 각 조원들이 어디까지 진행했는지 확인할 때도 있고, 속도가 느린 사람의 작업을 중간에 다른 사람이 대신하기도 합니다. 그리고 마지막에는 자료를 하나로 합칩니다. 분산 컴퓨팅에서도 전체적인 흐름은 비슷합니다. 여러 컴퓨터가 작업을 나누어서 한다면 중간중간 서로의 상태도 확인해야 하고, 마지막에 작업 결과물을 합치기 위해 사건의 순서도 중요해집니다. 이 때 두 컴퓨터의 시계가 크게 차이나면 작업의 순서가 달라지고, 서로의 결과물을 신뢰할 수 없는 상태가 됩니다.

    이를 막기 위해 컴퓨터들은 정확한 시계를 기반으로 한 합의(Consensus) 알고리즘을 사용해 서로간의 신뢰를 지속적으로 유지합니다. 윤초는 컴퓨터 시계 사이에 한 번에 큰 오차를 만들 수 있는 만큼 치명적이기에 그 처리가 더욱 중요해졌습니다. AWS나 GCP와 같은 현대 클라우드 컴퓨팅 서비스들은 고객사들이 구글의 Leap Smear를 사용할 수 있도록 시계 동기화 서버를 제공하고 있습니다.

     

    마무리

    컴퓨터가 시간을 다루는 방법에 대해 알아보았고, 자칫 가볍게 넘길 수 있는 오버플로우와 윤초 때문에 치명적인 문제가 발생하는 사례를 직접 확인했습니다. 대부분의 문제는 지금은 해결되었으며, 오버플로우 역시 많은 사람들은 문제가 발생할 때 쯤이면 이미 해결이 되어 있을거라 예상합니다. 우리가

    모르는 사이 엄청난 기술들이 현대 기술의 기반을 받치고 있습니다.하지만 분산 합의 알고리즘과 윤초 처리라는 컴퓨터 공학적인 접근만으로 모든 문제가 해결되지는 않습니다. 다음 포스팅에서는 현대 과학 기술의 꽃이라고 부를 수 있는 GPS에 대해 알아보며, 시계와 관련된 또 다른 문제에 대해 다루겠습니다.

     

     

     

    시간에 관하여

    시간에 관한 모든 것 목차 시간에 관하여(1) - 시계와 달력의 12와 60은 어디서 나왔을까? 시간에 관하여(2) - 2월은 왜 28일일까? 시간에 관하여(3) - 날짜를 표기하는 방법 시간에 관하여(4) - 새로운

    nebula-archive.tistory.com

     

    시간에 관하여(4) - 새로운 1초 그리고 협정 세계시

    시간대 (Timezone) 지구는 둥글고 자전하기 때문에 나라마다 해가 뜨는 시간이 달라집니다. 나라별로 시간대를 정해서 사용한다면 국가별로 제각각인 시간대를 사용하게 되고, 심지어 어떤 나라는

    nebula-archive.tistory.com

     

    시간에 관하여(6) - GPS와 상대성이론

    우리는 처음 가 보는 곳도 쉽게 길을 찾을 수 있고, 산에서 길을 잃어도 방향을 찾고 구조를 받을 수 있습니다. 매일같이 사용하는 스마트폰과 내비게이션이 GPS 위치 정보를 얻어서 위치를 알려

    nebula-archive.tistory.com

     

    반응형

    댓글

Designed by Tistory.