OSを基礎から丁寧に (2)OSの役割
第二週目
今週はOSのプログラミングインターフェースについてです。
OSは応用プログラムに対して、ファイルや入出力装置を利用する機能など、種々の機能を提供していますが、この応用プログラム向けの機能について説明します。
シリーズの構成
大学のOSの講義で推奨されていた本を参考に章立てしていきます。
- OSの役割
- OSのプログラミングインターフェース ←本記事!
- OSの構成
- ファイルの管理
- プロセスとその管理
- 多重プロセス
- メモリの管理
- 仮想メモリと仮想化
- ネットワークの制御
- セキュリティと信頼性
- OSと性能
OSのプログラミングインターフェース概要
プログラミングインターフェースといえば、よくAPIと言われるものがありますが、これはアプリケーションプログラミングインターフェースの略称です。
これのOSバージョンなので、周辺機器等のハードウェア呼び出しと応用プログラムの橋渡し的な役割を持っていると言っても良いでしょう。
この図のように、アプリケーションからの呼び出しに対して、 例えば入出力の呼び出しがあった場合に、動作をコントロールする命令を出すための入口的な役割を果たします。
また、プログラミングインターフェースは応用プログラム向けであることを強調してAPIと呼ばれることもあります。
プログラミングインターフェースの実現方法
ここからは若干細かい話になります。
複数人で利用することが前提のOSでは、本体が応用プログラムからは隔離されています。
OSの本体はカーネルなどと呼ばれることがありますが、このカーネルが誤って応用プログラムによって破壊されたりしないように、ハードウェア的に別の実行モードで動いています。
- 応用プログラム:ユーザー権限
- カーネル:root権限
なので、ユーザー権限でroot権限のカーネルを呼び出す(カーネル呼び出命令)ことになるわけですが、
内部では、プロセッサの割り込み処理が行われています。
下の図が大雑把なイメージです。
OS側から見れば、OSの機能の本体はカーネルの中で実現されていて、 応用プログラムが直接呼び出すAPIルーチンは、必要な準備をした後カーネル呼び出命令を実行する。
という繋ぎ目の役割を果たしているに過ぎません。
システムコール
UNIXのプログラミングインターフェースでは、ここのOSの機能のことをシステムコールと呼ぶ。
システムを呼び出して処理をイライする、という意味で使われる。
具体的なOS API
これまではOS APIが何をするのかを確認してきた。では実際にどのようなインターフェースがあるのか。
1. C言語企画の標準ライブラリに含まれるOS機能
C言語の標準ライブラリには、OS関係の機能も含まれている。具体的な関数を一部列挙すると
- ファイル操作
- fopen()
- close()
- remove()
- rename()
- 書式付き入出力
- fprint(), printf()
- fscanf(), scanf()
- 文字列入出力関数
- getchar(), fgetc(), gets()
- fgets(), putchar(), fputc(), puts(), fputs()
- 直接入出力関数
- fread()
- fwrite
- ユーティリティ関数
- malloc()
- free()
- exit()
- abort()
- 日付と時刻
- clock()
- time()
などである。Cを書く人なら一度は使ったことあるこれらは、元々はUNIXの機能の一部として提供されていたものであり、言語企画の一部でもあるが、OS APIとしてみることもできる。
2. UNIXシステムインターフェース
UNIXのAPIは、次の形で提供される。
- システムコール関数
- その他のライブラリ関数
具体的には
- 入出力
- open()
- read()
- write()
- close()
- ディレクトリ操作
- mkdir()
- rmdir()
- パイプ
- pipe()
- ファイル保護
- chmod()
これらのシステムコールは、呼ばれるたびにカーネル呼び出しの内部割り込み処理が発生して、本来の処理はカーネルで行われる。
3. WindowsのAPI
Microsoft社は、Windows用のAPIとしてWIndows APIを定めている。
私はWIndowsユーザーではないのでこの部分は割愛する。
OSを基礎から丁寧に (1)OSの役割
初めに
今週から、OSについて体系的に整理していきたいと思っています。
特に割り込み処理や、プロセスとスレッドの定義、多重プロセス多重スレッド、メモリ管理、等々。
普段の開発や勉強で、ふわっと理解をしながら設計、実装していた部分の「Why」の部分を強化したいなってものあります。こう言うのって時間が余ってる学生の特権っぽい気がしますし!
シリーズの構成
大学のOSの講義で推奨されていた本を参考に章立てしていきます。
すでに理解が深い部分の章を除いて、大きく以下のように進んでいこうと思っています(順次リンクを貼り付けます!)
- OSの役割 ←本記事!
- OSのプログラミングインターフェース
- OSの構成
- ファイルの管理
- プロセスとその管理
- 多重プロセス
- メモリの管理
- 仮想メモリと仮想化
- ネットワークの制御
- セキュリティと信頼性
- OSと性能
OSについて整理する前に
まずは自分のOSに対する、今までの経験と知識を列挙してみます。
- OSはコンピュータを使うための最も根幹のソフトウェア
- 種類によって使い勝手が異なる(macOS, Windows, Unix, Linux...)
これくらいでした、、意外と言葉で説明するのって難しい。
そして、GPT4の理解はこんな感じ。
そうだねって感じでした。笑
OSが生まれた背景
コンピュータの基盤になっているのはわかるんだけど、そもそもなぜOSが必要になったのかは背景を理解するとより腑に落ちそうでした。
1. コンピュータを使いやすくする
ハードウェアは人間にとって、そのままでは複雑で使いずらい。これを使いやすくするために、コンパイラやインタプリタが開発されたが、これだけではハードウェアは思い通りに動かない(まだ制約が多い。)それを解決するために、ハードウェアと応用プログラムの橋渡しをするためにOSが開発されたのが背景。
2. コンピュータリソースを効率的に使う
プログラムの実行の制御は、プログラムを実行するソフトウェアであるOSが担うことで、効率よく処理を行うことができた。
3. 利用者に優しく
低レベルのコンピュータハードウェアを利用者が使いやすいようにレベルの高い論理的なマシンとして提供することが、結局利用者にとって本質的なOSの役割であると言える。
OSが提供する機能
OSは、先ほどの背景からもわかる通り、利用者がコンピュータを使いやすくするために存在していると言っても良さそう。具体的には、 - ユーザインターフェース - プログラミングインターフェース(または、API)
さらに、コンピュータはネットワーク経由で他のコンピュータと通信し合うわけだが、その基本的な制御もOSが行う。 これを通信インターフェースとするならば、担う役割は3つである。
ユーザインターフェース
OSはコンピュータを直接操作する利用者に対してユーザインターフェースを提供している。
利用者はこのインターフェースを使って、コンピュータシステムを操作し、プログラムの実行を制御している。このうち、画面ベースでマウスを用いて行えるようにしたものをGUIと呼ぶ。当然GUI以前は、文字ベースで各種コマンドを打ち込んでいた。
プログラミングインターフェース(API)
OSの次に高級な応用プログラムは、例えば入出力機器に対して入出力を行いたいときに、OSの特定機能を呼び出すことによりそれを依頼する。依頼されたOSが、応用プログラムに変わって複雑な制御をしてくれるため、OSは応用プログラムの作成を楽にしてくれる。
pythonでいうprint()なんかは最たる例ですね。 出力するために入出力のプログラムがどうなっているかを意識しないで使えるのは、プログラミングインターフェースがあるおかげ。
通信インターフェース
利用者や、応用プログラムは、OSの通信インターフェースを介することで、近くのコンピュータやインターネット上のコンピュータと通信をすることができる。この通信インターフェースの中身は、通信のための標準接続方であるプロトコルである。
プロトコルに従って、他のコンピュータと会話をしている。
これはネットワークの部分でより詳しく説明するのが良さそう。
OSが管理する資源
また、OSはコンピュータリソース(資源)も管理している。
具体的にどんな資源かというと、
ハードウェアのコンポーネント - プロセッサ - メモリ - ハードディスク - その他の入出力機器 - etc...
である。OSは、いわゆるハードウェアの資源を、応用プログラムで制御できるように仲介をしているイメージ。 プロセスを一定時間使わせたり(時間貸し)、メモリの一部を使わせたり(空間貸し)できる。
OSはこのようにハードウェアの資源を管理するだけでなく、ソフトウェアの資源も管理する。
例えばプログラマが書いたコードや、データなど。OSを通してファイルを利用し保存することができる。
最後に
一応、参考書には、Unixコマンドや、Power Shellのコマンドも紹介されていたが、OSを理解する!という目的から若干外れそう(なのと、普通にまとめるのが面倒)だったので割愛しました。
こうやってみたらわかるけど言葉にできないことって、みなさんどうやって説明できるようになるんだろう。
口でもしゃべってみようかな。
技術面接対策のまとめ
varootです!
今回の記事では、直近1週間後に控える技術面接の対策として、よく聞かれているであろう質問を備忘録としてまとめることにしました。
ネットワーク周りのあるあるの質問から、データエンジニア採用ということで、データエンジニアリングらしいところまで、自分の言葉でまとめていこうと思います!
(連載1週目から早速水曜日更新できておらず、毎週の締め切りとか守れる人本当にすごい。。。)
Updates
2023/06/03 最終更新
よく聞かれるドメイン知識
好きなプログラミング言語は、またそれはなぜか?
トラブルシュートをするときにどのようなステップを取るか?
white box testingとblackbox testingの違いは?
データエンジニア向けの技術質問
データエンジニアの役割はどのようなものですか?
- データの収集と処理
- データパイプラインの設計と構築
- データの取り込み
- トランスフォーメーション
- ストレージ
- バッチ処理やリアルタイム処理
- データのストレージと管理
- データの分析支援
あなたは非構造化データの取り扱いにおいて困難に直面した経験はありますか?それをどのように解決しましたか?
過去の経験が2つあるのでそれを思い出しておく。(webのログと衛星データ) 1. まずはデータの理解。最終的なビジネス要件はどのようになるか、というところから、そのためにはどのようなデータがあると嬉しいのかを確認する。 2. 必要とあれば、データ処理によって、構造化されたデータに修正する。
データモデリングとは何か
データモデリングは、データベースの設計やデータの分析に向けた最初のステップ。
コンセプチュアルモデル、論理モデル、物理モデルの順に、構造間の関係を示す能力を持っていることを説明する必要がある。
構造化データと非構造化データの違いは?
構造化データは、明確に定義されたデータ型であり、アルゴリズムやコーディングを使用してパターン化され、簡単に検索可能な形式。
一方、非構造化データは、ビデオ、写真、テキスト、オーディオなど、さまざまな形式のファイルの束。
非構造化データは、管理されていないファイル構造に存在するため、エンジニアはそれを収集し、管理し、データベース管理システム(DBMS)に格納して検索可能な構造化データに変換する。
非構造化データは、手動で入力されたり、コーディングを使用したバッチ処理を介して入力される場合がある。
そのため、ELT(抽出、変換、読み込み)がクラウドベースのデータウェアハウスにデータを変換および統合するためのツールとして使用される。
データモデリングのデザインスキーマとは何か
Star, Snowflake, and Galaxyの3つがある。
star schemaは、複数の関連するディメンションテーブルを持つファクトテーブルを中心にしたスキーマ。
その形状が星に似ていることから、データウェアハウススキーマの中で最も単純な形式として知られる。
snowflakes schemaは、スタースキーマの拡張であり、データを分割し、スノーフレークの放射状のスポークのようになるような追加のディメンションテーブルを追加する。
The Galaxy schema contains two fact tables, and it shares dimension tables between them.
Big Dataの4つのV
ボリューム(Volume)、速度(Velocity)、多様性(Variety)、真実性(Veracity) 4つVはValueという第五のVを生み出すために必要である。
- ボリューム(Volume):データセットのサイズ(テラバイトやペタバイト)を指す
- 速度(Velocity):データが生成される速度を指す
- 多様性(Variety):構造化データや非構造化データの多様なソースとファイルタイプを指す
- 真実性(Veracity):分析されるデータの品質を指す
No technical, but the questions are important to think about.
What makes you the best candidate for this position?
What is the toughest thing you find about being a data engineer?
What is data orchestration, and what tools can you use to perform it?
Apache Airflowとか、AWS Glueは経験あり。
ブログと自己紹介
初めに
みなさん初めまして!Varootです。
筆者は、情報系の大学に通いながら、ソフトウェアエンジニアとしてインターンをしています。
半年ほど前に就活も終わり、研究もリズムが安定してきた中で、
自分の原動力であった、
「頑張らねばならない」
環境が、最近薄れ始めているのを感じました。
日々を充実のためには、やはり適度(過度)な忙しさが重要であるという脳筋なので、自分に強制力を働かせるために技術ブログを始めることにしました。
週次の研究発表とか、
インターンで成果を出すため
であれば、問題なく時間を割いて努力をすることができるのですが、
フワッと自分のための技術のインプットって、なかなか続かないというか、
呼吸をするようにできる人すごいなって思います。
憧れるし、自分もそれを週間にしたいのでブログという仕組みを利用してみることにしました。
自己紹介
日本の大学でComputer Scienceを専攻する学部4年生です。
研究分野はComputer Visionで、物体検出を目的に、超解像を専門に研究しています。
インターンとして、過去には自然言語処理をメインで扱ってデータ分析をしたり、分析のデータパイプラインを作っていました。
現在は宇宙系のスタートアップで、ソフトウェアエンジニアとしてインターンをしています。
データエンジニアとして、都内の事業会社から内定をもらっており2024年4月から勤務予定です。
ブログの目的
上記でも少し述べたように、自分の技術に対するインプットとアウトプットを強制させる目的でブログを始めました。
毎週水曜日の夜更新を目標に、習慣になるまで続けられるように頑張ります!
ここまで読んでいただいた方、ありがとうございます!
もしよかったらTwitterもやっているのでフォローよろしくお願いします!