web-dev-qa-db-ja.com

RAMで正確に1バイトを更新することは可能ですか?

たとえば、静的なC++配列{'d', 'o', 'c', 's'}。そして、私が持っています x86アーキテクチャ、32ビット長のワード。

cgに置き換えたい。私が理解している限り、バイトアドレス指定可能なRAMから読み取り操作を行うと、CPU alwaysはそこから1ワードを読み取ります。したがって、配列全体を読み取ります。

CPUが配列を読み取った後、cgに置き換えて、メモリに書き戻します。

CPUはRAMに1バイトまたは4バイトを書き込みますか?

4バイトを書き込む場合、Wordアドレス指定可能ではなくバイトアドレス指定可能メモリを使用する意味は何ですか?

[〜#〜]更新[〜#〜]

別の例を考えてみましょう。 CPUは32ビットワードを使用します。 RAMに4バイトの配列があります。アドレス0x000から始まります。

0x000: 1110 1111 0000 1100 [1110 1111] 0000 1100 // we want to update byte in brackets
0x003: ....
0x007: ....

RAMはバイトアドレス指定が可能なため、各セルには正確に1バイトが含まれます。したがって、理論的には、単一のメモリアクセスを使用して1バイトを読み書きできます。ただし、コンピュータには32ビットバスがあるため、CPUは常に32バイトを読み取ります単一メモリアクセスを使用するビット。

私が理解している限り、CPUはWord全体をレジスタに読み込みます。

1110 1111 0000 1100 [1110 1111] 0000 1100

次に、このレジスタの3番目のバイトを更新します(たとえば、1000 1111):

1110 1111 0000 1100 [1000 1111] 0000 1100

そして次は何なのかわかりません。 [主な質問] CPUはレジスタから32ビットすべてをRAM=または8ビットのみに書き込みますか?

[Answered] 32ビットを更新する場合、Wordのアドレス指定を使用しないことの意味は何ですかRAMこれはまったく同じように機能しますか?以下の回答によると、私たちの過去とスニーカーネット。

4
No Name QA

インターネット。

複数のコンピュータがネットワーク化されている場合、「ワードサイズ」などはありません。すべてのコンピュータには、バスの大きさが独自の考えがあります。しかし、それらはすべてバイトに同意します(たとえ バイトオーダー に同意できない場合でも)。したがって、バイトをアドレス可能にし続けます。互換性の問題に役立ちます。それはバスサイズだった8ビットコンピューティングの時代からのキャリーオーバーです。

スニーカーネット。

物理的に接続されていないコンピューターでも、リムーバブルメディアを使用してデータを共有します。アドレス可能なメモリ単位の大きさについて、何らかの合意が必要です。ここでも8ビットバイトで解決しました。 ASCIIおよびEBCDICがバイトに収まるのはそのためです。

これらの伝統的な力が、バスのサイズが大きくなると、通常、8で割り切れるサイズに成長する理由です。

RAMで正確に1バイトを更新することは可能ですか?

はい。

それはする必要があります。それがどのように行われるかという問題に過ぎません。それがどのように行われるかは、アーキテクチャに依存します。

通常、バス自体は「バイトアドレス指定可能」です。だから私が必要以上に多くのバイトを送ったからといって、それらすべてを使わなければならないということにはなりません。

ここ の良い説明を見つけました。

12
candied_orange

C標準では、実装がシングルバイトを読み書きできる必要があります。配列char a [100]があり、あるスレッドがa [0]を1増やし、別のスレッドがa [1]を1増やす場合、実装で競合状態が発生しないことが必要です。

これは、コードが2つのソケット(2つの独立したCPU)を持つサーバーで実行され、これらの2つのスレッドが2つの異なるCPUにある場合でも当てはまります。

多くのバストラフィックが行き来し、効率はよくありませんが、論理的には各スレッドが1バイトを読み書きできます。

8
gnasher729

論理的には、バイトのみを更新します。バイトはすでに論理的な概念であることに注意してください。ハードウェアレベルでは、バイトはありません。現代のコンピューターでは、CPUのレジスターとメインのワーキングメモリのメモリセルの間に多くの電子機器があり、CPU(または命令)はメモリを直接制御しません。最近のトランジスタは安いので、多くの最適化とキャッシングが行われています。

最終的に8つのスイッチが反転するか、または複数キロバイトの行全体が書き換えられるかは、メモリテクノロジーによって異なります。私たちソフトウェアの人々にとって、心配する必要はありません。その論理バイトをどれだけ速く書き込めるかを知りたいだけです。そして、ランダムまたはシーケンシャルに大量のバイトを書き込んだ場合、おそらくそれはどのように行われるでしょうか。

したがって、答えは、ハードウェアレベルで何が起こっているかを正確に知ることができず、自分の健全性のためにあまり気にする必要がないということです。

4
Martin Maat

CPU(少なくともmy CPU)は、常に一度に64バイトの読み取りまたは書き込みを行います。これは「キャッシュライン」と呼ばれます。 1バイトを書き込むように指示すると、64バイトが読み取られ、1が更新され、最終的には64バイトが書き込まれます。 (同じ64バイトを更新し続ける場合、何度も何度も読み書きを続ける必要はありません。また、CPUは64バイトの多くのグループを保存できます)

メモリチップ(少なくとも一部のチップ)は、常に一度に8192バイトを読み書きします。これは「行」と呼ばれます。 CPUがメモリチップに64バイトを書き込むように指示すると、メモリチップは8192バイトを読み取り、64バイトを更新してから、8192バイトを書き込みます。 (同じ8192バイトを更新し続ける場合、何度も読み書きを続ける必要はありません。メモリチップは8192バイトのグループを1つしか保存できませんが、通常、読み取りと書き込みによって引き起こされる速度の問題はありませんそれらを書く)

バイトアドレスを使用すると、CPUに1バイトを書き込むように指示できます。メモリはビットアドレス指定できないため、CPUに1ビットを書き込むように指示することはできません。 CPUに1ビットを書き込むように指示するには、ビットシフトおよびマスク命令を使用する必要があります。メモリがバイトアドレス指定可能ではなくキャッシュラインアドレス指定可能であった場合、64バイトのみを書き込むように指示することができます。 1バイトを書き込むには、ビットシフトとマスク命令を使用する必要があります。

4
user253751

注:これは完全な答えではありません。これは、この質問に対する既存のさまざまな回答を誰でも解析できるようにするメンタルフレームワークを紹介することを目的としています。

(0.A)読み始める前に:教育プログラムに参加していますか、コースの勉強をしていますか、それとも試験の準備をしていますか?これが事実である場合、あなたの研究を担当する機関はまた、どの回答が受け入れられるかを決定する責任があります。したがって、最善の策は、他の場所で答えを探すのではなく、彼らが決定したことに固執することです。これは、回答がwrongであっても当てはまります。あなたは彼らが受け入れる間違った答えを単にオウムしますが、勉強を終えたらこの答えに固執しないように気をつけてください。

(0.B)コンピュータシステムの種類も重要です。ほとんどの人(学生とソフトウェアプログラマー)にとって重要な2つのタイプは、「汎用コンピューター」と「組み込みシステム」です。

「組み込みシステム」の回答が必要な場合は、 Electronics Stack Exchange のユーザーがより適切な回答を提供します。今日の「組み込みシステム」はビスケットサイズのPCに移行していることに注意してください。これは、今日多くの開業医が小型汎用コンピュータを使用して、組み込みシステムで行っていた作業を行っていることを意味します。過去10年間の組み込みシステムでは、趣味の回路基板に「32k x 8ビットSRAM」などのディスクリート電子コンポーネントが含まれる場合があります。これらは、4ビットまたは8ビットバス上で実行される「バイトアドレス指定可能な」メモリです。 。小型汎用コンピュータを使用するという現在の傾向は、それらの個別の電子コンポーネントが過去のものになるかもしれないことを意味します。

たとえば、「メインフレームコンピュータ」、または廃止されたコンピュータアーキテクチャに対する回答が必要な場合は、 Retrocomputing Stack Exchange を参照してください。

「8ビットコンピューティング」の回答が必要な場合は、両方のサイト(電子機器、レトロコンピューティング)で役立つアドバイスを提供します。

(1)Cプログラマーから見た答えgnasher729の答えを参照 。 C標準のバイトの定義は、バイトが「少なくとも256の異なる値」を保持できるということです。つまり、正確に8ビットである必要はなく、少なくとも 8ビット(または同等のもの)を意味します。

(2)アセンブリ言語またはマシンコード(CPUが実行するバイナリコード)を書くプログラマから見た答え:彼らは何を見るか命令セットアーキテクチャ(ISA)が指定した。 x86 ISAは、一度に1バイトを更新する命令を許可します。ただし、1バイト(8ビット)を更新する場合、64バイトを更新する場合に8分の1の時間がかかる保証はありません。ビット値(メモリ内の8ビット値の更新には、メモリ内の64ビット値の更新と同じ時間がかかる可能性が非常に高いです。)

(3)CPUキャッシュに見られる回答: ser253751の回答、最初の段落を参照キャッシュコヒーレンスプロトコルの理解が必要な場合があります。詳細については、Wikipediaの記事を参照してください 。 Intelアーキテクチャドキュメントでは、CPUメモリバスのパフォーマンスは「トランザクション」(「MT/s」:秒あたりのメガトランザクション、「GT/s」秒あたりのギガトランザクション)で測定されます。 「トランザクション」とは、コマンドごとのデータ転送の最小単位を指します。

(4)メモリバスに見られる答え:SDRAMバスコマンドは、メモリコントローラからRAM =モジュール。技術的に正確な答えを理解するには、セクションバースト順序およびバースト長を読む必要があります。SDRAM(およびそれ以降の標準、DDR4など)では、 「ワードサイズ」は64ビットです。このトピックに関するWikipediaの記事を参照してください: Synchronous_dynamic_random-access_memory @ Commands

(5)SDRAMモジュールにある電気的制御回路に見られる答え: マーティン・マートの答え、2番目の段落を参照 =。

(6)メモリチップ上のトランジスタベースメモリセルの行に見られる回答: ser253751の回答、2番目の段落を参照 =。メモリセルの行全体が一度に更新されます。 (「行」は、SRAMおよびDRAMを指す場合に一般的に使用される用語です。「ブロック」は、不揮発性ランダムアクセスメモリ、NVRAMを指す場合に一般的に使用される用語です。どちらも、必要なメモリユニットの最小構成を指します。一度にすべて更新されます。)

(7)オペレーティングシステム(OS)から見た答え。アプリケーションが自身のメモリにアクセスしている限り、アプリケーションがメモリページに触れるのはこれが初めてではないので、OSは違反しません。通常、回答(1-6)は通常どおり適用されます。ただし、いくつかの状況ではOSの介入が必要になります。(1)アプリケーションがOSに新しい新しい空のページを与えるように要求し、OSはそれを許可しました(そしてその新しいページへのメモリページアドレスを与えました)が、まだそれを準備します。この場合、初めてのメモリアクセスにより、いくつかのページ準備操作がトリガーされます。これには、メモリに複数バイトのデータを書き込むことが含まれる場合があります。 (2)アプリケーションが、許可されていないメモリアドレスにアクセスしようとしました。この場合、OSが停止します。

4
rwong

最近のすべてのマイクロプロセッサは、1バイトを超える単位でメモリを物理的に読み書きしますが、個々のバイトの内容を変更できます。

2
Mike Robinson

この質問は非常にアーキテクチャ的に具体的であり、プロセッサーにキャッシュがある場合、技術的にはそうではありません。ただし、キャッシュを使用しても、コンテキストによっては1バイトも変更されない場合があります。

なぜ動的RAMを使用しているのかを考慮していないのはなぜですか、動的RAMは常に更新されています。つまり、コンテンツを維持するために常に書き直されています。

1
Robert Baron