タイムスタンプ、2038 年にコンピューターが直面する問題 (コードデモ)

        この章では、タイムスタンプ、タイムスタンプの定義、タイムスタンプの問題、詳細な危機分析、2038 年にコンピュータが直面する問題、コード シミュレーション、および 2000 年の Y2K 危機のレビューを紹介します。

目次

1. タイムスタンプの定義

2. タイムスタンプの危機

3. 詳細な分析

4. コードデモ

5. 解決策

6. 前の例 - Y2K バグ

7. エンディング


1. タイムスタンプの定義

        タイムスタンプ。1970 年 1 月 1 日、英国グリニッジ、経度 0 度の 00:00:00 から現在までの経過秒数として定義されます。中国は東 8 区にあり、グリニッジより 8 時間早いため、グリニッジが 0 時であるとき、中国はすでに 8 時であるため、中国のタイムスタンプは 1970 年 1 月 1 日、北京時間 8:0 になります。 00 秒 それから経過した秒数。タイムスタンプの定義により、コンピュータが時間を計算できないという問題が解決されます。

2. タイムスタンプの危機

        1960 年代には、コンピュータ メモリのコストが非常に高かったため、32 ビット メモリが一般的に使用され、多くのデバイスやプログラムが 32 ビット メモリを使用していました。これまで、現在 32 ビット 64 ビット コンピュータと呼ばれるものになりました。芯。1997 年の「西暦 2000 年バグ」の警報により、人々は桁の欠如によって引き起こされる多くの問題に徐々に気づきました。

        タイムスタンプには「枯渇した」日があります。32 ビットのタイムスタンプ記憶構造によれば、正しく表現できる最大秒数は 2147483647 (2 の 31 乗、最初のビットは符号ビット) です。 、イギリスのグリニッジ行き 時刻は 2038 年 1 月 19 日の 03:14:07、つまり北京時間の 2038 年 1 月 19 日の 11:14:07 です。その時点では、すべての 32 ビット デバイスと 32 ビット プログラムが深刻な影響を受けます。

3. 詳細な分析

        この問題の発生は、Python のネイティブ言語である C 言語によって引き起こされます。C言語では日時を表すのにtime_t(整数int型)を使い、32ビットデータで格納され、最上位ビットが符号ビット(0は正数、1は負数)、残りの31ビットが符号ビットとなります。ビットは数値の格納に使用されるため、32 ビットでは 2 の 31 乗 = 2147483648 秒しか表現できません。タイムスタンプの場合、2147483648 秒を超えると、つまり英国グリニッジ標準時 2038 年 1 月 19 日の 03:14:07 秒を超えます。コンピューターの時間に問題が発生する可能性があります。

整数オーバーフローが負になる
負の数は増え続ける

        32 ビット コンピューターの場合、0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 を超えると、 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 111111。負の数は補数で表現されるので、その正の数を使って反転(最上位ビットを除く)して+1することになります。逆に、負の 2 進数がわかっている場合は、上に示したようにその 10 進数を求めます。

        オーバーフローが増加し続けると、負の数もどんどん大きくなり、たとえば、-2147483647 が増加し続けると、-2147483646 になります。この数値を取得した後、オーバーフロー ポイントの前後の変化を分析します。

オーバーフロー境界のタイムスタンプ
「昔に戻って」

        コンピューターの時刻ストレージがオーバーフローすると、時刻は中国の 1970 年 1 月 1 日 8:00:1 の 2147483648 秒前、つまり 1901/12/13 20:45:52 に「巻き戻り」ます。常に 32 ビットを使用すると、コンピュータ内の時間経過は、①→②→①→②の繰り返しサイクルになります。しかし時間の乱れは解消されないため永久に使い続けることはできず、引退する運命にある。

 

4. コードデモ

        コードを使用して、32 ビット コンピューターが直面する問題をシミュレートします。datetime.datetime.fromtimestamp() は負の値を渡すことができないため、「過去に戻る」という状況をシミュレートすることはできませんが、ここではこの関数のエラーを使用して「過去に戻る」ことを表現しています。

        2147483648 の前後の 5 つの数値を 2 進数に変換すると、2147483648 より前の数値は 31 であることがわかります。これは、最上位ビットが 0 であるため表示されず、最上位ビット <2147483648 が埋め戻されます。

        埋め戻すと、2147483648 より前の最上位ビット (32 番目のビット) が 0 であるのに対し、2147483648 の後の最上位ビット (32 番目のビット) は 1 であることがわかります。最上位ビットは正の数の場合は 0、負の数の場合は 1 です。

        2 進数を 10 進数に変換します。このとき、2147483648 より小さい数は正の数、2147483648 より大きい数は負の数となります。この数値を time 関数に渡して、2038 年の 32 ビット コンピューター危機をシミュレートします。最終的なコードは次のとおりです。

import datetime
for i in range(2147483648-5,2147483648+5):
    print(i)                     # 时间戳
    er = str(bin(i)).replace('0b','')         # 时间戳转为二进制,判断32位二进制最高是0还是1
    if len(er) == 31:
        er = f'0{er}'
        print(er)                # 如果二进制是31位,那给它还原最高位0
        wei_32 = int(er,2)
        print(wei_32)            # 长度是31证明最高位0,正数,直接把二进制转十进制
        ti = datetime.datetime.fromtimestamp(wei_32)           # 十进制的时间戳 输出时间
        print(ti)
        print('-'*50)
    else:
        print(er)                # 它长度为32,那最高位是1,那它(32位)表示的是负数
        wei_32 = -int(er,2)
        print(wei_32)
        ti = datetime.datetime.fromtimestamp(wei_32)       # 负数传该函数这会报错
        print(ti)
        print('-' * 50)

        タイムスタンプが 2147483648 に達するかそれを超えると、32 ビット メモリは負の数を表し、予想どおり、コンピューターに危機が発生し始めました。そして、32ビットコンピュータで示されるのは「過去への遡行」であり、タクシーの価格設定、株式の開設、オンラインバンキング、鉄道、その他のシステムなど、時間に関するすべての問題が表示されます。

        また、この図からは、32 ビット コンピューターのタイムスタンプは北京時間の 2038 年 1 月 19 日 11:14:07、つまり 2038 年 1 月 19 日 03:14:07 GMT までしか表現できないことがわかります。

5. 解決策

        32 ビットのデバイスとプログラムを適時に廃止し、64 ビットを普及させ、64 ビットの数値を使用してそれを表します。64 ビット 2 進数で使用できる実際の桁数は 63 で、最大表現はグレゴリオ暦の UTC 時間 292,277,026,596 12 月 4 日 15:30:08 です。もし当時人類がまだ存在していたら、西暦は使いにくいという理由で放棄されていたかもしれません。

        サーバーや最新のコンピューターでは、64 系オペレーティング システムが置き換えられ、2038 年のタイムスタンプの問題はなくなります。組み込みデバイスに関しては、依然として多数の 32 ビット システムが世界中で稼働しており、これらのシステムが 2038 年までに名誉ある形で廃止されるとは誰も保証できません。さらに、64 ビット OS では 32 ビット アプリケーションも動作するため、2038 年問題も人々に脅威をもたらしており、過小評価することはできません。(百度百科-2038 質問より)

        現在、私たちのコンピューターは基本的に 64 ビットですが、32 ビット アプリケーションがそのコンピューター上で実行される可能性も排除されません。「2000 年問題の解決には 2 年しかかかりませんでしたが、2038 年問題にはまだ 15 年あります。私は科学者たちが 32 ビットから 64 ビットに完全に移行する方法を見つけてくれると信じています。また、2000 年のコンピューター危機が収まることを願っています」 2038年も順調に乗り越えられます。

6. 前の例 - Y2K バグ

        ミレニアム バグは、「コンピュータ 2000 年問題」とも呼ばれ、「Y2K」と略されます。1960 年代にはメモリ コストの問題があり、コンピュータ プログラムのインテリジェント システムの年は 2 桁の 10 進数でしか表されないため、システムが何世紀にもわたって日付処理を行うとエラーが発生し、さまざまなシステムの機能不全やクラッシュが発生します。ミレニアムバグは、ウイルスではなく、使用桁数の不足によって引き起こされる人為的なバグと考えることができます。

        1997 年までに、情報業界は「2000 年バグ」の警鐘を鳴らし始めました。この問題は非常に深刻であるため、各国政府が「2000年バグ」問題を解決するために名乗り出て数億ドルを投資しています。大晦日には素晴らしい結果が得られました。しかし、来るべきものは来るでしょう。広州のある企業はコンピューター障害が相次ぎました。ソフトウェア会社に助けを求めたところ、100 社以上のデータベースが麻痺していることが判明しました。北京コンピューター 2000 問題対策室には、 3 日以内に 12 件の助けを求める電話があり、12 月 31 日 23:59 に 3 分間電話をかけましたが、電話会社の請求書には (-100 年 + 3 分) と表示されていました...2010 年そして2016年には小規模ながら再発し、経済に多大な損失をもたらしました。(百度百科事典 - ミレニアム バグ - 2000 年コンピューター問題より)

7. エンディング

        興味のある友達は、自分のコンピューターのオペレーティング システムが何桁なのかを確認してみましょう。「マイコンピュータ」を右クリックし、「プロパティ」を選択し、「システムの種類」を確認します。私の場合は「64ビットOS、x64ベースのプロセッサ」です。

おすすめ

転載: blog.csdn.net/m0_71559726/article/details/130234732