死磕 Linux !
在知乎看到一个问题:为什么计算机专业的学生要学习使用 Linux 系统?
在这里,也同步分享下我的想法。
很简单,也很直接一个原因:很多互联网大公司都有大量的服务器运行在基于 Linux 的操作系统。因此,我们工作不可避免会接触 Linux 系统。
不过,也要看岗位:
后端开发岗、运维岗工作都会涉及 Linux 系统;
客户端、前端开发涉及就比较少;
之所以服务器选择用 Linux 操作系统,原因有很多:
自由开源:Linux 操作系统完全免费且可用作开源软件,通过开源方式,您可以轻松查看用于创建 Linux 内核的可用代码,还可以修改代码以修复任何错误等。只要你做够厉害,你完全可以按照自己的方式构建和自定义服务器。这些是在 windows 上无法实现的。
稳定性:在 windows 上,我们进程看到系统崩溃或者卡死,但是在 Linux 上,这种情况发生的几率极小,Linux 系统以其最终的稳定性而闻名。
成本低:Linux 是免费的,如果你想在其中一台服务器上安装 Windows,则需要支付激活费用,这意味着你需要多花一笔钱。
操作方便:对于普通人来说,Windows 操作更为快捷,但是对计算机专业人士来讲,Linux 操作比 Windows 快捷的多,几条命令就可以执行很多的操作。
接下来,跟大家聊下 Linux 怎么学习?
Linux 学习主要有三个方向:
Linux 命令:Linux 系统都是命令式操作的,就是比如你要创建一个文件、查看一个文件、删除一个文件等,都是需要输入命令, 所以要熟练用起 Linux 系统,命令的熟悉是必不可少的。
Linux 脚本:熟悉了基本 Linux 命令后,就可以去学习 Linux 脚本,其实很简单,就是把各种命令写在一个脚本文件里,执行脚本的时候就会把所有命令执行一遍,用于自动部署一些项目。
Linux 编程(系统编程/网络编程):如果走 C/C++ 开发,这一块就需要学习,因为 Linux 系统是由 C 语言开发的,所以系统调用接口,都是 C 式编程开发的。
我们可以在自己的 Windows 电脑装一个虚拟机,然后装一个 centos 或 ubuntu 发行版本的 Linux,网上的安装资源很多的,自己搜一搜跟着搭建就行。有条件可以买一个云服务器,使用起来会更方便一些,因为有公网 ip 地址,任何时候都可以远程登录使用。
Linux 命令学习
我当初学习 Linux 命令的时候,看的是《鸟哥私房菜Linux基础学习篇》,这本书讲的还是很通俗易懂的。
对于初学者可以先掌握这些基本 Linux 命令:
文件/文件夹的查看、创建、删除、移动、复制、修改权限;
文件内容的编辑、保存;
系统内存、硬盘、cpu、网络流量的查看;
软件的安装、删除;
….
Linux 脚本学习
Linux 脚本常用使用就是 bash 环境,脚本编程其实跟 C 语言编程类似,也有变量定义、函数声明、控制语句,但是他不会很复杂,学起来还是很快的。
这里推荐阮一峰老师写的 Bash 编程教程。
地址:https://wangdoc.com/bash/grammar.html
Linux 编程(系统编程/网络编程)学习
Linux 系统编程,可以看《Linux 程序设计》这本书,学 Linux 编程一定要在多敲代码,并且在 Linux 跑起来。
接下来说说我学 Linux 网络编程的心得。
当初在学网络编程的时候,看见网上的人都说 UNP(Unix 网络编程)、APUE(Unix 高级环境编程)这两本书是网络编程圣经的书,那么好学的小林,那肯定毫无犹豫买了。
书到货后,我瞬间就懵逼了,这两本书是我买过最厚的书,这尼玛怎么学?
跟着书本的节奏,学了一段的时间,是懂了些 Linux 网络和系统 API 的用法,摸索来摸索去都是各个 API 的细节,始终不知道高并发网络框架是如何实现的。
后面我又重新找了一波关于网络编程的书,找到了这两本:《TCP/IP 网络编程》和《Linux高性能服务器编程》。
《TCP/IP 网络编程》绝对是新手村级别的书,书里的内容不会有过多的术语,作者都用大白话来表达,配图也很清晰,也有介绍我想知道的网络框架,虽然是比较基础的多进程服务端模型、多线程服务端模型、异步 IO 模型。而且最后一章实现了简单的 HTTP 服务端,让我知道了从代码角度是怎么解析 HTTP 报文的,以及状态机是如何实现和运转的。
《Linux高性能服务器编程》这本书主要是网络框架为主,前几章关于网络基础知识对于掌握了计算机网络知识的同学可以直接跳过的,你看,很多知识是想通的,当我们知道掌握了这块知识后,在学习新一本书的时候,就可以跳过重叠的内容。在这本书我学到了,Reactor、Proactor、信号、定时器、多进程编程、多线程编程、进程池和线程池等。
这两本书让我大概知道了如果一个服务端要服务多个客户端时,不是就简单写个 socket 编程就完事,而是还要结合 IO 多路复用 + 多线程的思想,也就是 Reactor 的设计理念,知道了这些事情后,后面我在看很多开源框架的网络模型时候,发现大多数基于 Reactor 的思想来实现的。
有了网络编程总体的视角后,在需要深入理解 socket api 中各种属性设置(超时、非阻塞 IO、阻塞 IO 等)和异常处理就要回归 APUE 这本书。
到这里我才知道 UNP 和 APUE 为什么会被称为网络编程圣经级别的书,原因是书里各种细节和异常都写的很全,也很细致,可以应对工作中很多问题。
但是事实证明,它并不是个入门级的书,所以 UNP 和 APUE 的用途比较像字典,在需要的时候去查阅就好。
最后,列一下,我自己看过和在豆瓣高分的 Linux 的书籍,给大家供个参考。
命令学习
《鸟哥的Linux私房菜 : 基础学习篇》,豆瓣评分9.1
系统编程
《Linux程序设计》,豆瓣评分8.3
《UNIX环境编程》,豆瓣评分9.4
网络编程
《TCP/IP网络编程》韩国的,豆瓣评分8.6
《Linux高性能服务器编程》,豆瓣评分7.9
《Linux多线程服务端编程》,豆瓣评分8.8
《UNIX网络编程》,豆瓣评分9.5
内核源码
《Linux内核设计与实现》,豆瓣评分8.6
《深入Linux内核架构》,豆瓣评分9.0