什么是操作系统

​ 操作系统 (OS, Operating System) 是一组程序, 是用户和计算机硬件之间的中介, 负责管理计算机中的硬件设备和软件程序。

前面说过, 计算机是一台机器,它按照用户的要求接收信息、存储数据、处理数据,然后再将处理结果输出。计算机由硬件和软件组成:硬件是计算机赖以工作的实体,包括显示器、键盘、鼠标、硬盘、CPU等;操作系统会按照用户的要求协调整台计算机的工作,比如Windows、Linux、Mac OS等操作系统

OS

计算机的用途

计算机的用途不同, 导致注重的点不同, 因而系统的优化侧重点也不同, 随着硬件的发展和计算机用途的变革, 陆续地产生了不同的操作系统, 后面会把操作系统的产生和演变历程快速地过一遍, 之后你会对操作系统有一个清楚的认识

  • 个人计算机 (PC)

    我们平常使用的笔记本电脑, 台式机, 一体机都是PC, 很多时候英文会用Desktop来表述, 这类计算机注重图形界面的显示和用户的交互, 所以这类计算机使用的操作系统都注重显示和交互的优化, 我们平常用的Windows和Mac OS都是这类计算机的操作系统, 此外还有一些Linux的发行版也开始向PC扩张, 例如Ubuntu

  • 服务器 (Server)

    一般情况下,服务器我们看不到, 因为大多数都在机房或者机柜里且通常都不配备显示器的, 这类计算机注重计算和存储,因此使用的操作系统都在性能上做优化, 基本不会使用图形界面 (因此, 把图形界面集成在系统内核一起的Windows Server使用的很少很少); 在虚拟化技术成熟以后, 把很多大型计算机或性能很高的计算机虚拟成多个计算机对外提供服务, 现在的阿里云等云服务提供商提供的都是虚拟的服务器

  • 移动设备 (Mobile)

    我们的手机, 平板电脑都是移动设备, 这类设备注重的是触摸交互和能耗问题, 因此移动设备上使用的操作系统是针对此进行优化的, 现在基本就两个:iOS和安卓(什么? 你说还有鸿蒙? 好吧, 你说的都对…)

  • 嵌入式设备

    这类设备CPU 内存等硬件性能比上面说的都弱不少, 一般都是精简的操作系统烧录到芯片上随硬件一起的, 他们都有专业的用途,这里不细说了

操作系统的故事

操作系统族谱

操作系统族谱

关于控制台和终端

在早期的电脑上,往往具有带有大量开关和指示灯的面板,可以对电脑进行一些底层的操作,这个面板就叫做Console。其概念来自于管风琴的控制台。一台电脑通常只能有一个Console,很多时候是电脑主机的一部分,和CPU共享一个机柜。

一台大型主机往往需要支持许多用户同时使用,每个用户所使用操作的设备,就叫做Terminal——终端,终端使用通信电缆与电脑主机连接,甚至可以通过电信网络(电话、电报线路等等)连接另一个城市的电脑。

Terminal(终端)——指电线的末端,shell——指乌龟的壳,而tty——是一个奇怪的缩写。然后是console——一种机柜。

console

狭义的Shell仅指字符界面的命令解释器,在UNIX/Linux系统上广泛应用,所做的工作主要是:

① 读入用户输入(Read);

② 解释执行(Evaluate);

③ 打印执行结果和提示符(Print);

④ 回到①循环(Loop)。

这种工作方式被称为交互式Shell(Interactive Shell),Shell通常还支持批处理方式(Batch),用户提前写好要执行的命令,形成脚本(Shell Script),Shell一次性把脚本中的命令执行完。 UNIX/Linux系统上存在多种字符界面的Shell,比较著名的有:

  • sh(Bourne Shell),1977年由Steve Bourne开发,成为各种UNIX的标配,兼容POSIX的sh在1992年开发;
  • csh(C Shell),1978年由Bill Joy开发,随BSD UNIX发布,语法和C语言相似;
  • tcsh(TENEX C Shell),1983年开发,兼容POSIX是csh的增强版本,支持命令补全等特性,在FreeBSD、Mac OS X等系统上替代csh;
  • ksh(Korn Shell),由David Korn开发,兼容sh并添加了很多csh引入的特性,是现代各种UNIX的标配,这些系统上sh实际是指向ksh的符号链接;
  • bash(Bourne Again Shell),1989年由GNU项目开发,与POSIX标准保持一致,同时兼容sh,是Cygwin、Linux系统的标配,这些系统上sh实际是指向bash的符号链接;
  • zsh(Z Shell),1990年由Paul Falstad开发,在兼容bash基础上引入ksh、tcsh的多种特性,如自动补全、智能提示等,配置高度自由,被称为终极shell;
  • fish(Friendly Interactive Shell),2005年开发,目标是易于使用、记忆命令,和zsh是对手。

你的终端窗口

在你用的Mac电脑的OS X系统下是终端, Windows系统下是DOS命令行窗口

terminal

打开你的终端, 先看标题:

第一个显示的是当前的目录, 这个当前的目录叫做: 工作目录 (Work Directory) » 再讲讲相对目录的概念

打开终端的时候就连接到了控制台, 你当前一定在一个目录下, 这个目录就是你当前的工作目录, 每个目录每个文件都有绝对的路径, “绝对"是指从根目录到文件的的路径, 相对是指针对从你当前的目录, 怎么找到对应的文件

中间显示的是你终端当前使用的是什么shell (可以切换)

最后显示一个80x24 什么意思? 我在刚参加工作的时候, 有编程规约, 要求写代码一行不许超过80的字符, 为什么?

看看终端里的描述, 这些话什么意思?

最后一行, 命令提示符$ ( Linux一般是# , 这跟shell有关 ) , 再看看$之前的信息

常用命令

- 显示当前工作目录: pwd 命令

是 Print Working Directory (打印工作目录)的缩写,功能是显示用户当前所处的工作目录。用法:

pwd

示例:

MacBook-Pro-2:~ zhouleqing$ pwd
/Users/zhouleqing
MacBook-Pro-2:~ zhouleqing$ 
  • - 切换目录 : cd 命令

是 Change Directory 的缩写,用来切换工作目录(改变当前目录)。用法:

cd [相对路径或绝对路径]
特殊符号 作 用
~ 代表当前登录用户的主目录
. 代表当前目录
.. 代表上级目录

示例:

MacBook-Pro-2:~ zhouleqing$ pwd
/Users/zhouleqing
MacBook-Pro-2:~ zhouleqing$ cd ..
MacBook-Pro-2:Users zhouleqing$ pwd
/Users
MacBook-Pro-2:Users zhouleqing$ cd zhouleqing/
MacBook-Pro-2:~ zhouleqing$ pwd
/Users/zhouleqing
MacBook-Pro-2:~ zhouleqing$ cd ./Documents/
MacBook-Pro-2:Documents zhouleqing$ cd /
MacBook-Pro-2:/ zhouleqing$ pwd
/
MacBook-Pro-2:/ zhouleqing$ 

练习一下, 打开终端窗口以后,切换到文稿目录, 切换到文稿的上级目录, 然后切换到hosts文件的目录(/etc/hosts)

技巧: 输入前几个字母按Tab键, 如果没有自动补全, 说明要么没有这个目录要么有重名的, 这时候,再按一下tab键会在控制台显示一下有哪些目录

MacBook-Pro-2:~ zhouleqing$ cd Do
Documents/ Downloads/ 
MacBook-Pro-2:~ zhouleqing$ cd Do
  • - 查看目录下文件: ls 命令

list 的缩写,是最常见的目录操作命令,其主要功能是显示当前目录下的内容。用法:

ls [选项] 目录名称
选项 功能
-a 显示全部的文件,包括隐藏文件(开头为 . 的文件)也一起罗列出来,这是最常用的选项之一。
-A 显示全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录。
-d 仅列出目录本身,而不是列出目录内的文件数据。
-f ls 默认会以文件名排序,使用 -f 选项会直接列出结果,而不进行排序。
-F 在文件或目录名后加上文件类型的指示符号,例如,* 代表可运行文件,/ 代表目录,= 代表 socket 文件,| 代表 FIFO 文件。
-h 以人们易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等。
-i 显示 inode 节点信息。
-l 使用长格式列出文件和目录信息。
-n 以 UID 和 GID 分别代替文件用户名和群组名显示出来。
-r 将排序结果反向输出,比如,若原本文件名由小到大,反向则为由大到小。
-R 连同子目录内容一起列出来,等於将该目录下的所有文件都显示出来。
-S 以文件容量大小排序,而不是以文件名排序。
-t 以时间排序,而不是以文件名排序。

示例:

MacBook-Pro-2:_Lession zhouleqing$ ls -l
total 274024
drwxr-xr-x  5 zhouleqing  staff        160  5  4 13:18 Node
-rwx------@ 1 zhouleqing  staff     358144  4 18 13:15 OS简单族谱.key
drwxr-xr-x  2 zhouleqing  staff         64  4 20 11:08 go_lession1
drwxr-xr-x  6 zhouleqing  staff        192  4 27 15:20 source
-rw-r--r--@ 1 zhouleqing  staff      17319  4 18 08:00 历史.xlsx
-rw-r--r--@ 1 zhouleqing  staff  113819646  4 19 11:17 图模板.key
-rwxrwxrwx@ 1 zhouleqing  staff   15288348  5  4 11:21 带儿子学编程.key
-rwxrwxrwx@ 1 zhouleqing  staff   10260179  4 21 15:52 带儿子学编程课件.key
MacBook-Pro-2:_Lession zhouleqing$ 
  • - 创建目录 mkdir 命令

是 make directory 的缩写,用于创建新目录

  • - 删除空目录 rmdir

(remove empty directories 的缩写)命令用于删除空目录

由于只能删除空目录 因此用的不多

  • - 创建文件 touch 命令

也用来修改文件时间戳

先会用touch创建文件即可, 修改时间戳的暂时不用理会

  • - 复制文件或目录 cp 命令

主要用来复制文件和目录

  • - 移动或改名 mv 命令

(move 的缩写),既可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名

上面几个命令的示例:

MacBook-Pro-2:~ zhouleqing$ mkdir test
MacBook-Pro-2:~ zhouleqing$ cd test/
MacBook-Pro-2:test zhouleqing$ mkdir sub1
MacBook-Pro-2:test zhouleqing$ ls
sub1
MacBook-Pro-2:test zhouleqing$ mkdir sub2
MacBook-Pro-2:test zhouleqing$ ls
sub1	sub2
MacBook-Pro-2:test zhouleqing$ rmdir sub2
MacBook-Pro-2:test zhouleqing$ ls
sub1
MacBook-Pro-2:test zhouleqing$ touch file1.txt
MacBook-Pro-2:test zhouleqing$ ls
file1.txt	sub1
MacBook-Pro-2:test zhouleqing$ cp file1.txt file2.txt
MacBook-Pro-2:test zhouleqing$ ls
file1.txt	file2.txt	sub1
MacBook-Pro-2:test zhouleqing$ mv file2.txt sub1/
MacBook-Pro-2:test zhouleqing$ ls
file1.txt	sub1
MacBook-Pro-2:test zhouleqing$ cd sub1
MacBook-Pro-2:sub1 zhouleqing$ ls
file2.txt
MacBook-Pro-2:sub1 zhouleqing$ 
  • - 删除文件或目录 rm 命令

(remove)的缩写, 是强大的删除命令,它可以永久性地删除文件系统中指定的文件或目录。在使用 rm 命令删除文件或目录时,系统不会产生任何提示信息。也不会在废纸篓里哦

选项:

  • -f:强制删除(force),和 -i 选项相反,使用 -f,系统将不再询问,而是直接删除目标文件或目录。
  • -i:和 -f 正好相反,在删除文件或目录之前,系统会给出提示信息,使用 -i 可以有效防止不小心删除有用的文件或目录。
  • -r:递归删除,主要用于删除目录,可删除指定目录及包含的所有内容,包括所有的子目录和文件。

示例(把上面操作的那一串都删掉, 不提示):

MacBook-Pro-2:~ zhouleqing$ rm -rf test
  • - vi / cat / grep

上面这些命令, 再加上vi cat grep 基本就够日常使用了

示例:

  1. 用vi创建一个test.txt文件并打开
MacBook-Pro-2:~ zhouleqing$ vi test.txt
  1. vi的编辑窗口, 此时按一下i键(insert 的意思)开始编辑

  1. 输入文字

  1. ESC键后输入:wq (表示保存退出)

  1. 用cat查看文件内容, cat全称“concatenate”,意思为“连接”。cat命令用于连接文件并打印到标准输出设备上
MacBook-Pro-2:~ zhouleqing$ cat test.txt 
gxl@126.com
zlq@gmail.com
zgc@126.com
MacBook-Pro-2:~ zhouleqing$ 
  1. grep 正则表达式 查询

grep超级强大, 以后有机会慢慢学吧, 这里演示简单的, 以后用到的时候去查一下帮助, 在服务器上上查询程序出错log记录的时候特别有用, 另外, 正则表达式是一个好东西, 以后有机会学习一下, 现在知道有这么一个东西就行了

MacBook-Pro-2:~ zhouleqing$ grep 'zlq' test.txt 
zlq@gmail.com
MacBook-Pro-2:~ zhouleqing$ grep '^126' test.txt 
MacBook-Pro-2:~ zhouleqing$ grep '^zgc' test.txt 
zgc@126.com
MacBook-Pro-2:~ zhouleqing$ grep -E 'zlq|zgc' test.txt 
zlq@gmail.com
zgc@126.com
MacBook-Pro-2:~ zhouleqing$ cat test.txt|grep 'zlq' > test2.txt
MacBook-Pro-2:~ zhouleqing$ cat test2.txt 
zlq@gmail.com
MacBook-Pro-2:~ zhouleqing$ cat test.txt 
gxl@126.com
zlq@gmail.com
zgc@126.com
MacBook-Pro-2:~ zhouleqing$ 

到这里这些命令记住了,会用了, 就可以应对很多情况了, 真的不难!

练习一下, 做个文本文件, 记录一下成绩

  1. ping命令

Ping命令是一种常见的网络诊断工具,可以测试两台计算机之间的网络连接。它发送一个网络数据包到目标IP地址,并等待目标设备返回回复。回复包告诉您发出请求的主机和目标主机之间的延迟时间,以及目标主机是否可达。

Ping命令通常用于排除网络连接问题。如果您正在尝试连接到远程服务器或网站,但无法连接,则可以使用Ping来测试网络连接并确定问题所在。Ping也可以用来测试本地网络连接,例如在局域网中测试连接到其他设备的速度。

使用ping命令很简单,只需要在命令提示符下输入“ping”加上需要测试的IP地址或主机名即可。命令会反复发送数据包,并显示每个数据包的延迟时间和成功率。

例如,要测试与Google服务器的连接,可以在命令提示符下输入以下内容:

ping www.google.com

Ping命令会发送数据包并显示每个数据包的延迟时间和成功率。如果连接正常,您将会看到类似下面的输出:

Reply from 74.125.227.145: bytes=32 time=123ms TTL=54 Reply from 74.125.227.145: bytes=32 time=124ms TTL=54 Reply from 74.125.227.145: bytes=32 time=124ms TTL=54 Reply from 74.125.227.145: bytes=32 time=125ms TTL=54

如果连接失败,则会显示“请求超时”或“目标设备不可达”等错误信息,这表明您需要进一步排除连接问题。

Unix的特点和哲学

下面是Unix的最大特点,一定要牢记,将来慢慢你会理解这是多么巧妙多么有用…

Everything (include hardware) is a file.

有人总结了很多Unix的哲学,下面这三条记下来,它们不但贯穿整个Unix世界,还影响着这个世上所有的程序员 …

当你要编程的时候,先想想这三句话再动手不迟!

  • Write programs that do one thing and do it well.
  • Write programs to work together.
  • Write programs to handle text streamsbecause that is a universal interface.

X Windows 的设计者 Mike Gancarz 给出了下面九条哲学思想

  1. Small is beautiful.
  2. Make each program do one thing well.
  3. Build a prototype as soon as possible.
  4. Choose portability over efficiency.
  5. Store data in flat text files.
  6. Use software leverage to your advantage.
  7. Use shell scripts to increase leverage and portability.
  8. Avoid captive user interfaces.
  9. Make every program a filter.

操作系统的文件管理及使用

操作系统非常重要的一个功能就是文件管理, 所有操作系统都是通过目录(也叫文件夹, Directory) 和其中的文件(File)来管理的, 文件在目录下, 文件夹可以嵌套, 找到一个文件要通过的一系列目录叫做文件的路径

​ 在Unix系列的操作系统里, 只有一个根目录用/表示这是所有目录和文件的起点,

Windows 系统是有盘符的, 例如 C:\ D:\ 等, 每个盘符作为一个根(windows的目录符号和Unix不一样用的是反斜杠\)平常使用时一般用户都会给Windows分区, 就是前面说的C:等, 一般系统安装在C盘, 所以在以前Windows系统使用的时候一般不把数据放在C盘, 目的是一旦系统崩溃(windows特点)格式化掉C盘,重新安装系统在C盘, 其他盘上的文件不受影响, 这也是被WIndows的不稳定性逼的, 这样分区的方式会导致硬盘空间不能得到充分使用, 现在window10以后,windows虽然也支持分区,但一般买来的机器自带Windows操作系统都不会给用户分区了, 原因是win10稳定性和安全性变好了,病毒也渐渐少了

Mac作为Unix的一个分支当然也是一样以一个/作为根目录. 前面操作系统故事曾经说过, Unix从设计之初就是多用户多用途分时系统吧? Unix原生就是多用户的, 所以/根目录下是系统级的文件,例如下面是我的Mac上的根目录的结构( 我用命令 tree / -L 1 列出的, tree命令mac系统没有自带,Linux系统有, 所以Mac需要brew安装一下 )

/
├── Applications
├── Library
├── System
├── Users
├── bin
├── etc -> private/etc
├── private
├── sbin
├── tmp -> private/tmp
├── usr
└── var -> private/var

​ 我们把主要的一个个说明一下(可能你列出的还有其他的, 不用太关注, 用到的时候查一下就好, 但是别乱删根目录下的东西)

├── Applications  : 存放的是所有用户共用的应用程序软件, 例如安装Office的时候提示是为所有用户安装还是当前用户
├── Library : 系统资源库。 比如字体、各种配置设置以及共用的库资源都安装在 Library 目录下适当的子目录中
├── System : 包含由Apple安装的系统软件。这此资源是系统正常运行所必须的
├── Users : Unix是多用户系统,每个用户有用自己用户名命名的目录,都在这个目录下(下面再详细讲这个目录)
├── bin : 储存有基本的UNIX指令如ls,rm,mv等
├── etc : 系统的配置文件存放位置, Unix哲学曾经讲过的配置都是文本方式存放的,例如hosts文件, 此目录实际为指向/private/etc的链接
├── private : 里面的子目录存放了/tmp, /var, /etc等链接目录的目标目录
├── sbin : 传统unix管理类命令存放目录,如fdisk,ifconfig等等
├── tmp : 临时文件存放目录,其权限为所有人任意读写。此目录实际为指向/private/tmp的链接。
├── usr : 第三方程序安装目录
└── var : 存放经常变化的文件,如日志文件。此目录实际为指向/private/var的链接。
  • Users目录结构

    Linux系统有个root用户, 这个是管理员账号, 这个账号是最大权限, 因为Linux大多都是作为服务器使用的,因此root一般禁止远程登录的, 将来等你用到的时候, 再慢慢了解SSH远程登录等内容

/Users
├── Shared
│   ├── ...一堆略掉
└── zhouleqing
    ├── Applications
    ├── Desktop
    ├── Documents
    ├── Downloads
    ├── Library
    ├── Movies
    ├── Music
    ├── Pictures
    ├── Public
    └── ~

这些目录对应你在Finder里看到的, 能找到对应的吧?

Applications 包含一些只有当前用户可以使用的程序,比如我们安装了一个程序,安装时选Applications,应用程序将会默认安装到这里!
Desktop:包含当前用户显示在Finder桌面上的所有项目
Documents:用户个人的一些文档。** 我们常用的,写笔记,写代码最好都放到这里 就是这个"文稿"
Downloads: 下载的文件默认放在这里
Library:包括应用程序设置、预置及其它用户指定的系统资源或设置
Movies:QuickTime或其它格式的影片
Music:数字音乐文件
Pictures:图片文件,包括iPhoto自动导入的数码相机中的图片
Public:你可以把需要与其它用户共享的文件放在这个目录中,默认状态下,这个目录可以被其它所有用户访问。

Mac安装应用程序

  1. 应用商店, 这个不用说了

  2. 下载pkg文件, pkg 类似 Windows 下的安装程序 .exe.msi,属于系统级软件的安装程序,一般是一路NEXT安装, 有时候要注意一下提示, 需要权限; 这类一般都会有附带一个卸载软件, 用这个卸载

  3. 下载dmg文件, dmg,全称为disk image,即磁盘镜像文件; 双击.dmg文件,然后会弹出一个弹窗,将应用图标拖入到Applications文件夹内即可,卸载时,直接在启动台中长按图标删除或进入访达中的Applications`文件夹内删除应用

  4. 使用brew包管理器 > > HomeBrew 是 Mac 下的一个包管理工具,作用类似于 centos 下的 yum; brew 可以用一条命令在mac上安装、卸载、更新各种软件包,因为brew的使用方便,如今已成为使用mac电脑的程序员的必备工具 > > 安装brew命令: > > /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" > > brew基本用法: > > - 安装: brew install nodejs > > - 更新: brew upgrade nodejs

    • 删除: brew remove nodejs

    • 查看都用brew安装了哪些软件: brew list > > 这是我安装的: > > shell > MacBook-Pro-2:~ zhouleqing$ brew list > ==> Formulae > brotli gradle libpng node sqlite > c-ares icu4c libtiff numpy tcl-tk > cookiecutter isl libuv openblas tree > freetype jemalloc mono openssl@1.1 wxpython > gcc jpeg mpdecimal python-tk@3.9 xz > gdbm libev mpfr python@3.9 zstd > gmp libmpc nghttp2 readline > MacBook-Pro-2:~ zhouleqing$ > > > HomeBrew官网 > > > 如果出现错误报警, 有可能是github被墙了, 修改成国内的阿里镜像能好点

  • Finder(访达) 的使用, 在菜单里配置…

再扩展讲讲隐藏文件和隐藏扩展名

Finder对应Windows里的是"资源管理器”

  • 关于输入法

    一定要安装一个顺手的输入法, 这是提高敲键盘效率非常重要的一点, 我用的是Mac搜狗输入法, 改了快捷键(command+空格),另外,还设置了在一堆写代码的应用里只用半角标点符号(英文符号)这很有用, 否则切换输入就能累死了…

  • /etc/hosts文件

hosts文件的路径是什么? 另, 讲讲localhost和127.0.0.1

  • 分区格式

    Mac, Windows, Linux 的分区格式是不同的, 分区格式可以自己去网上查,了解一下就好, 作为使用者,要了解分区格式有些互相支持,有些这不行, Linux的别的系统基本都不支持, Mac的Windows也不能读, Windows系统现在一般用NTFS, Mac能读不能写(版权问题, 需要安装软件才能写), 在分区的确定和使用上, 最常用的是U盘, U盘分区最常见的格式有: FAT、FAT32、NTFS和exFAT,普遍的U盘格式是:FAT和FAT32,但现在因为单个文件越来越大,例如:高清电影,大型游戏安装包等,超过4GB的文件FAT和FAT32格式都不支持,所以现在的U盘格式都会被转换成NTFS或exFAT格式, exFAT是各个系统都支持的, 但它也有它的弊病, 这里不细讲了…

Mac下使用磁盘工具分区, 注意! 抹掉以后什么都没有了,注意注意!

另外,讲这个的目的是将来你用U盘和别人交换文件的时候, 有问题知道是怎么回事…(好像用的也不多, 除非超大文件, 否则微信传了…)