用 Go 进行系统编程

大家好,我是站长 polarisxu。

今天起我们开始一个系列:用 Go 进行系统编程,主要介绍系统编程相关的知识。

01 准备

本系列教程基于 Unix 系统(更确切是 Linux 系统),如果你使用的是 Windows 系统,请安装 Windows Subsystem for Linux(WSL)。安装步骤如下:

  • 以管理员身份打开 PowerShell,运行如下命令:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
  • 按提示重启电脑;
  • 根据你的喜好从 Microsoft Store 安装 Linux distribution;

Go 语言版本基于最新的 Go1.16。

02 什么是系统编程(System programming)

维基百科的解释

系统编程是指从事计算机系统软件的编码活动。

那什么是系统软件呢?维基百科的解释

System software is software designed to provide a platform for other software.

即服务于其他软件的软件就是系统软件,比如操作系统、游戏引擎、工业自动化等。相应的,面向用户的就是应用软件了。(有时界限没那么清晰)

系统编程是 Unix计 算机上编程的一个特殊领域。请注意,系统编程不限于 Unix 计算机,只是这个系列主要关注 Unix 系统。大多数与系统管理任务有关的命令,例如磁盘格式化,网络接口配置,模块加载和内核性能跟踪,都是使用系统编程技术来实现的。此外,可以在所有 Unix 系统上找到的 /etc 目录包含纯文本文件,这些文本文件处理 Unix 机器及其服务的配置,并且也可以使用系统软件进行操作。

一般可以将系统软件的各个领域和相关的系统调用分为以下几组:

  • 文件 I/O:这部分处理文件读取和写入操作,这是操作系统最重要的任务。文件输入和输出必须快速高效,并且最重要的是要可靠。
  • 高级文件 I/O:除了基本的输入和输出系统调用之外,还有其他更高级的方法来读取或写入文件,包括异步 I/O 和非阻塞 I/O。
  • 系统文件和配置:这些系统软件允许处理系统文件(例如 /etc/passwd)并获取系统特定信息(例如系统时间和 DNS 配置)等。
  • 文件和目录:这部分包括函数和系统调用,它们允许程序员创建和删除目录并获取信息,例如文件或目录的所有者和权限。
  • 进程控制:可以创建 Unix 进程并与之交互;
  • 服务器进程:这套工具包括允许您开发服务器进程的技术,这些服务器进程是在后台执行而无需活动终端的进程。 Go 并不能很好地以传统的 Unix 方式编写服务器进程。诸如 Apache 之类的 Unix 服务器使用 fork(2) 创建一个或多个子进程(此过程称为 fork,是指从父进程克隆一个子进程),并从同一点继续执行相同的可执行文件,最重要的是,共享内存。尽管 Go 不提供与 fork(2) 函数等效的功能,但这不是大问题,因为你可以使用 goroutines 来做到 fork(2) 的大多数用法;
  • 进程间通讯:这组功能允许在同一台 Unix 机器上运行的进程使用管道,FIFO,消息队列,信号量和共享内存等特性相互通信;
  • 信号处理:信号为流程提供了一种处理异步事件的方法,该方法非常方便。几乎所有服务器进程都有额外的代码,这些代码使它们能够使用该组的系统调用来处理Unix信号;
  • 网络编程:这是开发基于 TCP/IP 协议的程序。其实这部分严格来说不是系统编程。但是,大多数 TCP/IP 服务器和客户端都在处理系统资源,用户,文件和目录。因此,在大多数情况下,如果不进行某种系统编程就无法创建网络应用程序;

03 为什么写这个系列

04 参考

本系列教程主要参考如下资料:

  • Unix 环境高级编程(第三版)
  • System Programming with Go
  • Go System Programming
  • Mastering Go(Second Edition)


133 字

0001-01-01 08:05 +0805