Goならわかるシステムプログラミング

Goならわかるシステムプログラミング

通常価格 ¥3,200(税込¥3,520) 特別価格

Go言語による新時代のコンピュータシステム入門

  • 渋川よしき 著
  • 388ページ
  • A5判
  • ISBN:978-4-908686-03-0
  • 2020年4月27日 第1版第4刷 発行(更新履歴
  • 正誤表

いつも開発に使っている言語やライブラリの裏側は、いったいどうなっているの? システムプログラミングの世界を知りたいと思ったら、やっぱりC/C++のコードを読むしかないのだろうか……。

そんなことはありません! 低レイヤはOSの世界。いまなら、さまざまなOSで動作するプログラムをシンプルに記述できるGo言語があります。 本書では、Go言語の実装を掘り下げたり、さまざまなライブラリが利用しているコンピュータシステムの基本的な概念を学びながら、アプリケーション開発者の視点で低レイヤの仕組みを学んでいきます。

2016年9月から2017年8月にかけてアスキーjpの「プログラミング+」コーナーで連載された大好評のWebコンテンツを、さらにわかりやすく紙版の書籍として編纂、発売するものです。連載では扱えなかったOSにおける時刻・タイマー、およびセキュリティ関連の情報を加筆。豊富なイラストも全面的に改訂のうえ収録しています。

 

著者紹介

渋川よしき

自動車会社、ソーシャルゲームの会社を経て現在はフューチャーアーキテクト株式会社勤務。Python/C++/JavaScript/Golangあたりを仕事や趣味で扱う。ウェブ関連は仕事よりも趣味寄り。

著書に『Real World HTTP』『Mithril』(ともにオライリー・ジャパン)、共著に『つまみぐい勉強法』『Mobage を支える技術』(ともに技術評論 社)、訳書に『アート・オブ・コミュニティ』(オライリー・ジャパン)、共訳に『エキ スパートPythonプログラミング』『ポモドーロテクニック入門』(ともにアスキー・メディアワークス)など。

 

目次

第1章 Go言語で覗くシステムプログラミングの世界
  1.1 システムプログラミングは
  1.2 Go言語
  1.3 Go言語のインストールと準備
  1.4 デバッガーを使ってシステムコールを「見る」
  1.5 本章のまとめと次章予告
  1.6 問題

第2章 低レベルアクセスへの入口1:io.Writer
  2.1 io.Writer はOSが持つファイルのシステムコールの相似形
  2.2 Go言語のインタフェース
  2.3 io.Writer は「インタフェース」
  2.4 io.Writer を使う構造体の例
  2.5 インタフェースの実装状況・利用状況を調べる
  2.6 低レベルの機能を組み合わせて入出力API を作る
  2.7 柔軟性が高く、パフォーマンスのよい設計のためのTips
  2.8 本章のまとめと次章予告
  2.9 問題

第3章 低レベルアクセスへの入口2:io.Reader
  3.1 io.Reader
  3.2 io.Reader の補助関数
  3.3 入出力に関するio.Writer とio.Reader 以外のインタフェース
  3.4 io.Reader を満たす構造体で、よく使うもの
  3.5 バイナリ解析用のio.Reader 関連機能
  3.6 テキスト解析用のio.Reader 関連機能
  3.7 io.Reader / io.Writer でストリームを自由に操る
  3.8 本章のまとめと次章予告
  3.9 問題

第4章 低レベルアクセスへの入口3:チャネル
  4.1 goroutine
  4.2 チャネル
  4.3 システムからの通知
  4.4 本章のまとめと次章予告
  4.5 問題

第5章 システムコール
  5.1 システムコールとは何か?
  5.2 Go言語におけるシステムコールの実装
  5.3 POSIX とC言語の標準規格
  5.4 システムコールより内側の世界
  5.5 Go言語のシステムコールとPOSIX
  5.6 システムコールのモニタリング
  5.7 エラー処理
  5.8 通常のシステムコール以外の特殊なシステム
  5.9 本章のまとめと次章予告
  5.10 問題

第6章 TCPソケットとHTTPの実装
  6.1 プロトコルとレイヤー
  6.2 HTTPとその上のプロトコルたち
  6.3 ソケットとは
  6.4 ソケット通信の基本構造
  6.5 Go言語でHTTPサーバーを実装する
  6.6 速度改善(1): HTTP/1.1 のKeep-Alive に対応させる
  6.7 速度改善(2): 圧縮
  6.8 速度改善(3): チャンク形式のボディー送信
  6.9 速度改善(4): パイプライニング
  6.10 本章のまとめと次章予告

第7章 UDPソケットを使ったマルチキャスト通信
  7.1 UDPとTCPの用途の違い
  7.2 UDPとTCPの処理の流れの違い
  7.3 UDPのマルチキャストの実装例
  7.4 UDPを使った実世界のサンプル
  7.5 UDPとTCPの機能面の違い
  7.6 本章のまとめと次章予告

第8章 高速なUnix ドメインソケット
  8.1 Unix ドメインソケットの基本
  8.2 Unix ドメインソケットの使い方
  8.3 Windows の名前付きパイプ
  8.4 Unix ドメインソケットとTCPのベンチマーク
  8.5 ソケットのシステムコール小話
  8.6 本章のまとめと次章予告

第9章 ファイルシステムの基礎とGo言語の標準パッケージ
  9.1 ファイルシステムの基礎
  9.2 ファイル/ディレクトリを扱うGo言語の関数たち
  9.3 OS内部におけるファイル操作の高速化
  9.4 ファイルパスとマルチプラットフォーム
  9.5 path/filepath パッケージの関数たち
  9.6 本章のまとめと次章予告

第10章 ファイルシステムの最深部を扱うGo言語の関数
  10.1 ファイルの変更監視(syscall.Inotify*)
  10.2 ファイルのロック(syscall.Flock())
  10.3 ファイルのメモリへのマッピング(syscall.Mmap())
  10.4 同期・非同期/ブロッキング・ノンブロッキング
  10.5 select 属のシステムコールによるI/O 多重化
  10.6 本章のまとめと次章予告

第11章 プロセスの役割とGo言語による操作
  11.1 プロセスに含まれるもの(Go言語視点)
  11.2 プロセスの入出力
  11.3 プロセスの名前や資源情報の取得
  11.4 OSから見たプロセス
  11.5 exec.Cmd によるプロセスの起動
  11.6 os.Process によるプロセスの起動・操作
  11.7 プロセスに関する便利なGo言語のライブラリ
  11.8 Go言語では触れることのない世界
  11.9 子プロセスの内部実装
  11.10 本章のまとめと次章予告

第12章 シグナルによるプロセス間の通信
  12.1 シグナルのライフサイクル
  12.2 シグナルの種類
  12.3 Go言語におけるシグナルの種類
  12.4 シグナルのハンドラを書く
  12.5 シグナルの応用例(Server::Starter)
  12.6 Go言語ランタイムにおけるシグナルの内部実装
  12.7 Windows とシグナル
  12.8 本章のまとめと次章予告

第13章 Go言語と並列処理
  13.1 複数の仕事を同時に行うとは?
  13.2 Go言語の並列処理のための道具
  13.3 スレッドとgoroutine の違い
  13.4 GoのランタイムはミニOS
  13.5 runtime パッケージのgoroutine 関連の機能
  13.6 Race Detector
  13.7 sync パッケージ
  13.8 sync/atomic パッケージ
  13.9 本章のまとめと次章予告

第14章 並行・並列処理の手法と設計のパターン
  14.1 並列・並行処理の手法のパターン
  14.2 Goにおける並行・並列処理のパターン集
  14.3 本章のまとめと次章予告

第15章 Go言語のメモリ管理
  15.1 メモリ確保の旅
  15.2 Go言語の配列
  15.3 Go言語のスライス
  15.4 ガベージコレクタ
  15.5 アプリケーションのメモリ配置
  15.6 本章のまとめと次章予告

第16章 時間と時刻
  16.1 OSのタイマー/カウンターの仕組み
  16.2 さまざまな時間
  16.3 時間に関するシステムコール
  16.4 Go言語で時間を扱う
  16.5 時刻のフォーマット
  16.6 本章のまとめと次章予告

第17章 Go言語とコンテナ
  17.1 仮想化
  17.2 コンテナ
  17.3 libcontainer でコンテナを自作する
  17.4 本章のまとめ

付録A セキュリティ関連のOSの機能とssh
  A.1 乱数
  A.2 TLS(Transport Layer Security)
  A.3 ssh(Secure Shell)
  A.4 キーチェーン

付録B 参考文献

あとがき
  謝辞

索引