質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

5回答

1247閲覧

メモリについて初歩的な質問です

eve

総合スコア19

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2021/05/23 08:30

現在、コンピュータの基礎を理解しようと、
メモリとは何か?というところを勉強しています。

データ(命令)を1バイトずつ区切ってメモリアドレスを割り振り、メモリに格納されたデータをCPUが1行ずつ読みだして処理していくという基本的なことは理解しました。

32ビットプロセッサの場合、一度の処理で4バイトずつ処理が可能なため、メモリ空間には1行に4バイトずつデータが格納されているという認識であっていますでしょうか。(メモリ空間のアドレスが4バイトずつ増えるのもそのため?)

また64ビットプロセッサの場合はどのようになるのでしょうか。

おかしい質問をしてしまっていたらすみません。
なかなかイメージしづらく、認識の確認のために質問させていただきました。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

メモリーには論理的には行というのは存在しません。

番地(アドレス)が付いていますが、現在一般的なCPUでは、CPUのビット数にかかわらず、1バイト(8ビット)毎にアドレスが1ずつ増えていきます。

32ビットCPUでも64ビット単位のデータを扱う命令もあるし、64ビットCPUでも32ビットや8ビットのデータを扱う命令もあります。

CPUが、32ビットデータをまとめて読み込む場合は、4つ連続したメモリ上のデータを読み込みます。

投稿2021/05/23 08:48

otn

総合スコア84491

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

厳密に言うと微妙な部分もあるかとおもいますが、なるべくざっくりした説明で書きますね。

他の方の回答にもあるように、メモリーには行といった考え方は本来ないのです。
言ってみれば「ながーい紙テープのようなものに、1ビットの情報が書き連ねられている」と思ってください。その1ビットは、0か1、実際には電気が溜まっているか、溜まっていないかという情報が記録されています。ざっくりいうと、以上終わり、です。

で、これをコンピューターとして使おうとする際に、紙テープからどこのビットを読むかを指定しやすいように、テープ上の場所に通し番号を打ったものが、アドレスです。

で、あるアドレスから、CPUなどが情報(01の連なり)を切り出して使う際に、毎回長さがまちまちだと大変なので「決まった長さで切り出すようにしよう」ということになり……その切り出す長さが8ビットだったり、16ビットだったり、32ビットだったり、64ビットだったり、というのが「~ビット」という数値です。

なので「~ビット」というのは、切り出した情報を入れる「情報の入れ物」のサイズとも一致します(CPUなどの用語だとレジスター、プログラミングだと変数のデータサイズとほぼ一致)。

アドレスが4バイトずつ増える、ってのは、あれですね、メモリーを長方形に描いた図などの左に書かれているアドレスのことですね。これは、上記のように「長いテープのような」メモリーでは表現しづらいので、上記のようにデータを切り出す長さごとに折り返して表現することが通例となっています。なので、32ビットコンピューターが主流のころだと、「横32bit=4bytes」でテープを折り返して積み重ねるように表現して、縦長の長方形で描くと、質問主さんのおっしゃる「行」ごとのアドレスが4バイトずつ増える縦長の表になります。
これは、人間が判りやすいよう便宜的にそう描いただけで、実際のメモリーは1本のテープのようになっており、特に行や区切りといったものは有りません。

なんとなくおわかりでしょうか?疑問の解消になるかどうかは判りませんが、理解の足しになれば幸いです。

なお、この「アドレス」という通し番号もコンピューターの中で情報として扱う必要があるので、アドレス用の情報の入れ物が用意されています。このサイズも、コンピューターが32bitなら32bitサイズ、64bitなら64bitサイズになっていますので、32bitコンピューターだと、アドレスの上限は32bitで表現出来る数値になってしまい……それがだいたい4GB弱になる。なので「32bitコンピューターではメモリーは4GBまでしか認識できない」みたいなことになります。

また、たとえば32bitで情報を扱う場合、その情報をコンピューター内で転送したり移動したりする必要があります。その際に「32bitのデータを一気に運べるように電線を32本並べて繋げよう……」ということで、繋いだ32本の電線による情報の通り道が「バス」です。その「バス」の電線の数が32本の場合「バス幅32bit」、64bitの場合「バス幅64bit」となります。

いろいろと情報が絡み合った話になるので混乱しがちな部分ですが、理解しておくとプログラミングや、システムの設計、規模の見積もりや運用など、いろんな部分でじわじわと効いてくる部分です。皆さんの話も含めて参考にされた上で、イメージを掴んでおかれると役に立つと思います。がんばってくださいねー。

投稿2021/05/24 00:30

編集2021/05/24 00:39
backyard

総合スコア534

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eve

2021/05/26 22:53

ありがとうございます!ほかの回答者の方々も大変参考になったのですが、 一番理解しやすかったため、ベストアンサーにさせていただきました。 わかりやすい、丁寧なご回答ありがとうございました。 今までイメージしていたメモリが間違いだったことに気づきました。助かりました!
backyard

2021/05/27 02:41

ありがとうございます。厳密なところは結構いい加減かもしれないので、足がかり、くらいに思ってもらっておくと良いかと思います。 ちなみに、この「メモリーには区切りが無い」けれど、実際には区切って使わないと面倒だし問題が起きる、という話は、セキュリティの話とかとも繋がります(バッファオーバーランとか)。 派手な話でも無いし最新の話でもありませんが、今の技術が「どういう経緯で出来たか」というところからおさらいしておくと、最新の技術がすんなり頭に入ることもあるので。 そのあたりの勉強なら、基本情報処理技術者や、応用情報などの参考書を使って、試験を受けなくても一通りの内容が何となく分かるようになっておくと、長い目で見たときに強みになると思います(もちろん最新のことの勉強も手を抜かずに並行で)。がんばってくださいねー。
eve

2021/05/28 00:19

ありがとうございます。ちょうど、セキュリティについて学びたいと思っていたところでした・・・。 メモリ、詳しくやってみたいと思います! アドバイス本当に参考になります!そうですね、経緯を知ることは大事ですよね。 頑張ります!
guest

0

32ビットプロセッサの場合、一度の処理で4バイトずつ処理が可能

「最大で」4バイトずつと解釈して、
一般的な命令ではそうですが、既出のようにSIMD系の命令ではもっと大量に読みます。

メモリ空間には1行に4バイトずつデータが格納されているという認識であっていますでしょうか。

現代のCPUではメモリ空間はだいぶ仮想的な存在なので、それを考えることにあまり意味はありません。
1行4バイトだと思ってアクセスしてもいいですし、1行8バイトだと思っても2バイトだと思ってもよいです。メモリコントローラあたりがよしなに扱ってくれます。
ただ、4バイトのデータを読む時4の倍数の番地からでないと読めなかったり読めるが速度が下がるといったことはあります。
物理的なメモリモジュールのデータバス幅について言えば、
32bitCPUになってからも一般的なメモリモジュールのバス幅はPentium(初代)のときに32bitから64bitに変わったりしていますし、
今さら聞けないメモリーの基礎知識 DIP~DIMM編
デュアルチャンネルで128bit相当にすることができたりします。
デュアルチャネル

まあ、基礎ということなので、CPUからメモリバスが直接生えておりメモリの仮想化をしておらずキャッシュもないようなごく単純なCPUを考えるなら、32bitCPUならデータバス幅は32bit(=メモリ空間は1行に4バイト)となるのが自然だろうとは思います。

(メモリ空間のアドレスが4バイトずつ増えるのもそのため?)

何についての話をしているのか分かりません。

また64ビットプロセッサの場合はどのようになるのでしょうか。

CPUによって違います。例えばRISC-Vでは32bitと64bitで単純に全てのメモリアクセス命令の幅が増えますが、x86-64では64bit幅のアクセスはx86の32bit幅のアクセスより制限が多かったように記憶しています。

投稿2021/05/23 13:21

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

データ(命令)を1バイトずつ区切ってメモリアドレスを割り振り

そんな仮想的?なものじゃなくて、この辺はおおよそ物理的な「部品」と対応しているから、68000(16bit CPU)あたりで自分でコンピュータを組み立ててみれば嫌でも理解できるけどねぇ...って、68000の単品チップなんて今どき売ってないか。

68000システム
アドレスバスがA1~になっているのに注意
(68000をMPUと呼びたい人は脳内変換してください)

投稿2021/05/23 11:53

編集2021/05/23 12:02
thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2021/05/23 12:33

68000まで出してしまうと、ややこしいのでは? (もっとややこしいのもあるけど) otnさんの回答にあるように "現在一般的なCPUでは、" としないと理解が大変。 PCで一般的な Intel系として考えた方が良い。
thkana

2021/05/23 12:37

68000素直だとおもうけどなぁ? 普遍的な8bit単位のバス構造の例として出しただけです。自分で作った経験もあるので。 書いた範囲でなにか68000に依存する特殊性がありますか?別に8086に置き換えても、64bit幅にしておなじみのintel系に書き換えてもいですけれど。
pepperleaf

2021/05/23 13:38

確かに素直とは思うけど、16bitと言いながら、アドレスは、8bitが単位とか、、。あと、8bitアクセス無かったですか? (A0もあるのでは? ) ... 等々、考えると面倒だし、過去のモノ。(当時、16bitでアクセスするのを使った事もある...ほんとの16bit) もっとも ikadzuchiさんの回答の方が、現実? でも難しいですね。
thkana

2021/05/23 22:15

まぁ確かにA0があって8bitデバイスもそれなりに使えるようになっていたと思いましたけれど(仕様書もどっか失くしちゃった...実家かなぁ?)。メモリとCPUの関係という今回の説明では敢えてそのへんは端折ってます。メモリだけじゃないだろう、アドレスデコーダーがあって他のデバイスもつながるだろうとか言い出したらキリがないし。お題は「メモリって?」なのでそこに絞ったモデルを提示したつもり。 言いたかったのは、メモリという想像上のナニカがあるんじゃなくて、CPUとメモリという明確に物理的にも分離できる部品がバスで繋がっている、という感覚があればそのへんの理解は易くなるのでは、ということだったわけで、仮想CPUで書きたくなかったんですけど、まぁ入手不能じゃ変わらないか...
guest

0

32ビットCPUの場合は、一度に処理できる最大サイズが4バイトです。それ以下の場合もありえます。

ただし、掛け算の場合は繰り上がりの結果も含めて8バイトを考える必要があります。これは複数のレジスタを組み合わせることで実現しています。

以下追記

最大サイズは言い過ぎでしたね。専用命令とか特殊な演算もあるので、必ずしもではないです。いずれにしても、4の倍数とは限りません。

投稿2021/05/23 09:26

編集2021/05/23 12:54
HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HogeAnimalLover

2021/05/23 11:23

ああ。専用命令とかは例外としました。断り書きがなく失礼しました。
pepperleaf

2021/05/23 12:36

浮動小数点演算も専用命令とすべき? 今時のCPUだったら内蔵ですね。
thkana

2021/05/23 13:00

nビットCPUって何?という質問だったらそういう回答でしょうけれど、 質問は「メモリ」(アドレス)の話なので、CPU内の処理の話はちょっと違わないでしょうか?
Zuishin

2021/05/23 13:07 編集

質問にはメモリやアドレスという言葉が使われていますが、よく読んでいくと、アライメント調整の話ではないかと思います。であれば、CPU が最も効率よく扱えるアライメントはどうなるのかという話になるので、やはり CPU の話ではないかと。 いや、CPU ではなくメモリのハードの話になるのかな。
ikadzuchi

2021/05/23 13:23

掛け算はレジスタの扱いは特殊なことが多いものの、メモリアクセスに関しては他の命令と特に違うことは無いと思いますがいかがでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問