派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【基本情報技術者試験のトッカカリ】 「メモリとストレージ」はどう違うのか

前回に引き続き、パソコンの構成についてお話していきます。

ハードウェアは、IPAの「基本情報技術者試験」や「ITパスポート」で、苦戦してしまう人も多いジャンルですが、理屈を知っていれば、頭に入りやすくなります。また、こうした知識は、サーバーの選定や、プログラミングにも役立ちますよ。

それでは今日も、ゆっくり進めていきましょう。

今日のニャゴロウ講座
メモリは「最低限」だと不便なんです......。

まだ前回の記事を読んでいない方はこちらからご覧いただけます。

入力装置と出力装置

前回は、CPUと、メモリ、I/Oについてザックリ学びました。CPUは演算装置で、メモリは記憶装置、I/Oは出入り口でしたね。

さて、出入り口をつけたら、「入力するもの」と「出力するもの」が必要になります。どんなものがあるでしょうか。

■入力装置

「入力装置」とわざわざ言うと、難しい感じがしてしまいますが、要は、キーボードやマウスのことです。キーボードは文字を入力しますし、マウスは「クリックする」「座標を移動する(移動量を伝える)」などを入力しています。他に、マイクや、スキャナーなど、「なんらかのデータをコンピューターに伝えるもの」を入力装置と言います。

以前は、音声入力はあまり一般的ではなかったのですが、Amazon Alexaで一気に使う人が増えましたね。まさにドラマ「STAR TREK」の世界です。音楽を録音しても、Alexaに指示をしても、どちらも入力です。

こうした入力装置は、人間が恣意的に操作するものが多いですが、そのうち、視線に従って動いたり、体温などを監視して動くものも広まっていくでしょう。

■出力装置

CPUが演算をしても、その結果を受け取ることができなければ、意味がありません。そこで登場するのが、「出力装置」です。入力装置と同じで、大げさな言い方をしていますが、ディスプレイやプリンタのことを言います。

またもや電卓で喩えてみましょう。電卓に計算させても、結果が見られなかったら意味がありません。そこで電卓は、小さな液晶に入力した数字や、計算結果を表示します。これが出力ということです。

今では、ディスプレイで見ることが一般的になっていますが、大昔は、「パンチカード」と呼ばれるもので、出力されていました。これは、細長い紙に、出力結果をパンチで穴を開けたもので、穴の位置から情報を読み取るのです。そう!大昔の映画や、アニメで登場するアレです。

種類はさまざまですが、このように、演算結果を出力して、我々は、コンピューターを扱っているのです。

ストレージとメモリが記憶を担う

これで、「入力→演算(&記憶)→出力」という、一連の流れができたわけですが、まだ紹介していない大物登場人物がいます。それはストレージです。

CPUは、メモリに置かれたプログラムやデータにアクセスして、演算をするのですが、メモリは、結構お高い!お高いのです!他にも理由は色々あるのですが、メモリ(タンス)だけでは、物を置く場所として足りません。そこでストレージ(倉庫)の登場です。

ストレージの役割は、メモリと同じく「データやプログラムの置き場所=記憶装置」です。ストレージとして一般的に使われるのは、ハードディスク(HDD=Hard Disk Drive)や、SSD(Solid State Drive)です。

メモリ(タンス)はCPUと直結していますが、ストレージ(倉庫)は、CPUと直結していません。では、何と繋がっているのかというと、なんと、I/Oと繋がっています。出入り口のあのI/Oです。

つまり、CPUにとって、メモリは家族のようなものですが、ストレージは、キーボードや、ディスプレイと同じ外の人なのですね。ですから、メモリは、家の中にありますが、ストレージはI/O経由で繋ぐ外部倉庫なのです。

*ストレージと聞いて、外付けHDDを思い浮かべた人もいるかもしれませんが、ここでいうストレージは、内部ストレージ(パソコン内部のHDDやSSD)の話です。

ストレージとメモリはどう違う?

ストレージとメモリは、使い方が違います。

メモリ(タンス)は、CPUと直結しており、「一時的な置き場所」として使われることが多いです。一方、ストレージ(倉庫)は、「永久的な保管場所」として使われます。

この話をするには、そもそもプログラムはどうやって動いているかという話をすべきでしょう。プログラムは、普段はストレージ(倉庫)に置かれています。そして、「そのプログラムを使いたい」と、オーダーが来たら、ストレージ(倉庫)からI/O(出入り口)を通って、メモリ(タンス)にコピーされます。すると、CPU(演算部隊)はメモリ(タンス)にアクセスして、そこに置かれたプログラムのとおりに演算をするのです。

ある程度の年齢の方であれば、「メモリが足らないから、パソコンが重い」というセリフに聞き覚えがあるのではないでしょうか。この「メモリが足らない」というのは、要はタンスが小さいから、CPUがマゴマゴするということです。

ハードディスクとSSDの違いとメリット

さて、「メモリはお高い!!」と連呼しましたが、実は、最近では、メモリと同じようなものがストレージとして使われるようになってきています。それが、SSDです。

我々がメモリと呼んでいるものの正体は、半導体(シリコン)です。半導体は、電気信号で記憶するものなので、電気信号がなくなると記憶がなくなってしまいます。ざっくり言えば、電源を切ると、情報が消えてしまうということです。つまり、これでは永続的にデータを保持することができません。三歩歩いたら忘れてしまう鳥じゃないんですから、これでは困ります。

一方で、ハードディスクは、磁気で情報を記録するものであり、電源は関係がありません。故に、永続的にデータを保存することができます。これなら安心です。

では、SSDは大丈夫なのかというと、SSDは半導体を使っていますが、電源を切っても記憶がなくならないようにしたものです。それにどんなメリットがるかと言えば、スピードです。磁気ディスクと半導体とでは、読み書きのスピードに大きな差があるため、SSDだと速いのです。

ニャゴロウ先生のまとめ

意外とこのあたりの仕組みは、知らない人も多い内容です。特に、若いエンジニアは知らない人も多いかもしれません。「知らなくてもいいのか?」と問われれば、「まあ、知らなくても、仕事に大きな影響はない(ことが多い)」が答えです。しかし、知っていると、モヤモヤが解決したり、よりシビアな環境でも対応できるようになります。

もし、あなたがIPAの試験の受験を考えているのであれば、丸暗記でこなしてしまう問題も多いでしょうが、今回の内容は理解しておくと、今後も役立ちます。

【筆者】小笠原 種高さん(ニャゴロウ先生)
技術ライター、イラストレーター。システム開発のかたわら、雑誌や書籍などで、データベースやサーバー、マネジメントについて執筆。図を多く用いた易しい解説に定評がある。主な著書に『なぜ?がわかるデータベース』(翔泳社)、『図解即戦力 Amazon Web Serviceのしくみと技術がこれ1冊でしっかりわかる教科書』『ゼロからわかるLinuxサーバー超入門 Ubuntu対応版』(技術評論社)、『仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん』(マイナビ出版)がある。

※本記事に記載されている会社名、製品名はそれぞれ各社の商標および登録商標です。

'); $backTopNav.appendTo($('.no-entry .entry-content')); } ////////////////////////////////////////////////////////// /* /* カテゴリ **/ function setLocalNav(){ // 右カラム:イベントレポートのナビ生成 var $reportNav = $('#js-report-nav'); if ( $reportNav.length > 0 ) { var reportCatParentIndex = 2; var reportCats = itseCategory[reportCatParentIndex][1]; $.each(reportCats,function(index, val) { $('
  • '+itseCategoryText[reportCatParentIndex][1][index]+'
  • ').appendTo($reportNav); }); } // 右カラム:コラム・連載のナビ生成 var $columnNav = $('#js-column-nav'); if ( $columnNav.length > 0 ) { var columnCatParentIndex = 1; var columnCats = itseCategory[columnCatParentIndex][1]; $.each(columnCats,function(index, val) { $('
  • '+itseCategoryText[columnCatParentIndex][1][index]+'
  • ').appendTo($columnNav); }); } } function setClassCategories(){ $('.categories a').each(function(){ if(!$(this).hasClass('.urllist-category-link')){ $(this).addClass('urllist-category-link category-'+$(this).text()); } }); } setLocalNav(); setClassCategories(); ////////////////////////////////////////////////////////// /* /* カレンダー **/ var eventData; var Calendar = function (elm) { this.$elm = elm; } Calendar.prototype.init = function () { this.$calendar = null; this.calendarDate = {}; this.settings = { year: 0, month: 0, weekValue: ['æ—¥', '月', '火', 'æ°´', '木', '金', '土'], areaClass: 'calendar', activeDateClass: 'active-date', prevNavClass: 'prev', nextNavClass: 'next', sunClass: 'sun', satClass: 'sat', todayClass: 'today', emptyClass: '', headerFormat: 'yå¹´m月', emptyValue: ' ' } var date = this.getDate(); this.calendarData = { year: date.year, month: date.month, date: date }; this.today = date.days; this.currentMonth = date.month; this.currentYear = date.year; this.setup(); } Calendar.prototype.getDate = function () { var date = new Date(); var toYear = date.getFullYear(); var toMonth = date.getMonth() + 1; var toDays = date.getDate(); var result = {}; result = { year: toYear, month: toMonth, days: toDays }; return result; }; Calendar.prototype.getPrevDate = function () { var result = { year: this.calendarData.year, month: this.calendarData.month }; if (result.month === 1) { result.year--; result.month = 12; } else { result.month--; } return result; }; Calendar.prototype.getNextDate = function () { var result = { year: this.calendarData.year, month: this.calendarData.month }; if (result.month === 12) { result.year++; result.month = 1; } else { result.month++; } return result; }; Calendar.prototype.zeroFormat = function (v, n) { var vl = String(v).length; if (n > vl) { return (new Array((n - vl) + 1).join(0)) + v; } else { return v; } }; Calendar.prototype.weekClass = function (weekNumber, targetDate) { var date = this.getDate(); var classArr = []; var classStr = ''; if (weekNumber === 0) { classArr.push(this.settings.sunClass); } else if (weekNumber === 6) { classArr.push(this.settings.satClass); } if (targetDate && targetDate === '' + date.year + this.zeroFormat(date.month, 2) + this.zeroFormat(date.days, 2)) { classArr.push(this.settings.todayClass); } if (classArr.length > 0) { classStr = ' class="' + classArr.join(' ') + '"'; } return classStr; }; Calendar.prototype.createBaseHTML = function () { var htmlStr = ''; htmlStr += '\n
    \n'; htmlStr += '
    \n'; htmlStr += '
    \n'; htmlStr += '
    \n'; htmlStr += '
    \n'; htmlStr += '
    \n'; htmlStr += '
    \n'; htmlStr += '
    \n'; htmlStr += '
    \n'; this.$calendar = $(htmlStr); this.$calendar.addClass(this.settings.areaClass); this.$calendar.find('.calendar-month').addClass(this.settings.activeDateClass); this.$calendar.find('.calendar-prev').addClass(this.settings.prevNavClass); this.$calendar.find('.calendar-next').addClass(this.settings.nextNavClass); }; Calendar.prototype.createBody = function () { var self = this; var year = this.calendarData.year; var month = this.calendarData.month; var lastdays = new Date(year, month, 0); var forDate = new Date(year, month - 1, 1); var emptyCell = '
  • ' + this.settings.emptyValue + '
  • \n'; var rowCount = 1; var htmlStr = ''; var i; var j; var len; htmlStr = '\n'; htmlStr += '\n'; htmlStr += '\n'; this.$calendar.find('.calendar-body').html(htmlStr); }; Calendar.prototype.setHeader = function () { var headerText = this.settings.headerFormat.replace('y', this.calendarData.year).replace('m', this.calendarData.month); this.$calendar.find('.calendar-month').html(headerText); }; Calendar.prototype.setup = function () { var self = this; this.createBaseHTML(); this.setHeader(); this.createBody(); // ヘッダー内、左右のリンクをクリックしたときの処理 this.$calendar.find('.js-change-month a').on('click', function () { var mode = $(this).attr('href').replace(/^#/, ''); if (mode === 'prev') { self.prevMonth(); } else if (mode === 'next') { self.nextMonth(); } return false; }); this.$elm.append(this.$calendar); }; Calendar.prototype.changeCalendar = function (year, month) { var date = this.getPrevDate(); if (year && month && String(year).match(/^[0-9]{4}$/) && String(month).match(/^[0-1]?[0-9]$/)) { this.calendarData.year = Number(year); this.calendarData.month = Number(month); this.setHeader(); this.createBody(); } }; Calendar.prototype.prevMonth = function () { var date = this.getPrevDate(); this.changeCalendar(date.year, date.month); }; Calendar.prototype.nextMonth = function () { var date = this.getNextDate(); this.changeCalendar(date.year, date.month); }; ////////////////////////////////////////////////////////// var getEventData = function () { var d = $.Deferred(); // dataを作る var data = {}; eventSchedule.forEach(function(v, i){ var date = new Date(v.date); var event = { category: v.category, year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate(), url: "http://www.itstaffing.jp" + v.url, title: v.title, }; data[i+1] = event; }); // ここまで d.resolve(data); return d.promise(); } if ($("#calendar").length > 0) { var getData = getEventData(); getData.then(function (data) { eventData = data; //console.log(eventData); var calendar = new Calendar($("#calendar")); calendar.init(); }); } //}; }); }();