Linux | 欢迎来到Linux世界

2,779 阅读8分钟

前言

在之前文章# 一个Android开发的学习Flag记录贴中有说Android系统是根据Linux内核的基础来进行开发的,而且在看源码时,在native层中很多实现都是系统调用,如果不了解Linux,将无法深入理解Android系统。

本系列是学习Linux知识,也是作为学习Linux的笔记,这里大家有兴趣可以学习极客时间刘超老师的Linux课程。

正文

由于笔者只在之前接触过很少的Linux,所以学习过程中有不对的地方,欢迎大家指正。

为什么学习Linux

首先是对于服务器端来说,Unix-Like OS的比例超过了百分之70,Linux更是中流砥柱;而且在Android系统,又以Linux内核为基础,所以可以说在编程世界中,Linux就是主流。

现在流行的技术,比如云计算、虚拟化、容器等几乎都是基于Linux技术,那些非常牛的系统,比如团购、打车、电商等系统,也几乎都是基于Linux技术,所以学习Linux也是开阔知识边界、提高能力的方式。

所以不论是前后端程序员,都可以适当学习Linux技术。

勇攀高峰

对于不经常使用Linux系统的开发人员来说,入门Linux还是非常难的,根据刘超大佬的总结,整个学习Linux的过程中,要爬的坡一共有6个,也是克服困难的6个阶段。

抛弃旧的思维习惯,熟练使用Linux命令行

上手Linux的第一步就是从Windows的思维习惯,切换为Linux的"命令行+文件"的使用模式。在Linux中,不论我们做什么事情,都会有相应的命令工具,只要找到某个命令行工具,我们就可以通过-h去查看对应的配置项,或者通过man命令查看文档,不断实践是第一步。

所以学习Linux爬的第一个坡就是熟练使用命令行,推荐书籍<<鸟哥的Linux私房菜>>。

使用系统调用或者glibc,自己进行程序设计

前面所说的命令行工具其实也是程序,只不过是别人写的程序,所以这里爬坡的第二步就是自己能够写程序,通过程序来操作Linux。

代码操作Linux,可以使用Linux的系统调用,也可以使用glibc库。Linux的系统调用非常多,而且使用的参数、返回值等都有很多讲究,从分析Android的native层代码就可以看出,很多函数的使用比较复杂。

如果说使用命令行是吃馒头,那么写代码操作命令行的人就是做馒头的。可能我们平时使用的一个简单的命令行,下面可以需要N个系统调用组合才能完成,所以对于重要的系统调用都需要深入学习。

当爬过这个坡,就很接近操作系统的原理了,这时就会豁然开朗。比如不理解的进程树,调用了fork就明白了;不理解的同步机制,调用了信号量,就明白了;等等。

这一部分推荐书籍<<UNIX环境高级编程>>。

了解Linux内核机制,反复研习

当学会使用代码操作Linux的时候,就像应用层开发人员迫切需要明白系统原理一样,这时就非常希望揭开Linux内核这层面纱,看看系统调用背后做了什么。

不论是哪个方向,理解内核底层原理,有助于更好地进行程序设计和上层开发。这里和我们学习Android系统架构一样,不建议直接看代码,因为Linux代码量太大了,只需要先了解内核机制地基本原理和流程即可。

这一部分推荐书籍<<深入理解Linux内核>>。

阅读Linux内核代码,聚焦核心逻辑和场景

当了解了内核机制后,这时就要针对特定的场景和模块进行重点攻克,这时就需要重点看看某个模块的代码。同样的,开源软件代码纷繁复杂,一开始阅读代码也不要纠结一城一池的得失,不需要每一行都理解它是干嘛的,而是聚焦核心的逻辑和使用场景。

到这个地步,假如是Android系统开发人员涉及到内核代码,这时就需要分析特定场景下的问题,以及给出解决方法。这个部分推荐书籍<<Linux内核源码代码情景分析>>。

定制Linux组件

到了这一步,就需要上手修改内核代码了,这也就是内核开发工程师的工作范围了。因为Linux是开源代码,我们开源根据现有的实现,定制化自己的模块。

这个部分就比较难了,前面还说我们不必计较一城一池的得失,这一部分就必须对每个细节都要搞清楚,确保定制组件功能完善。

面向真实场景开发,实践没有终点

万里长征第一步,学习完这么多,真正的高手都是在实战中摸爬滚打锻炼出来的。

对于Android开发方向来说,假如是应用层开发者,或许只需要了解到Linux内核机制即可,有了这部分知识,对我们分析crash、性能优化等都有很大的帮助。对于系统开发来说,就可能定制化修改Linux内核了,这时要求就更高了。

Linux操作系统概述

任何一个系统,如果使用其专业术语都不容易让入门的人了解,所以这里有一个非常好的比喻,就是把Linux系统比作一家软件外包公司,我们就来看看Linux中的各个部分,对于现实世界是什么。

  • 一家外包公司来业务了,首先就是要知道客户的需求,这时就会有客户对接员的角色,而这里的客户对接员就对应着计算机的输入设备,即鼠标、键盘等,即告诉计算机外部想干什么。
  • 当业务做完了,就需要交付人员把工作成果展示给客户,这时就会有交付人员的角色,而这里的交付人员就对应着输出设备,即显示器等,将计算处理用户请求的姐u共展示给客户。
  • 对于公司来说,接到项目后,就需要有一个项目执行计划书,项目计划书里规划着项目怎么办。而对应到操作系统中,这一个个项目计划书就是一个个程序,因为程序也是按照预定的计划在一步步执行。对于公司来说,可以把这些项目计划书放在一个地方保存,而电脑上程序很多,但是他们都是以二进制文件形式保存在硬盘上,硬盘是一个物理设备,要按照规定格式化为文件系统,才能存放这些程序。所以文件系统需要一个系统统一管理,就是文件管理子系统
  • 如何让项目顺畅进行呢,公司需要各种资源,比如盖章、开证明、申请会议室,这时资源有限而且有些还是涉及机密的,所以这时公司需要有一个统一的办事大厅,列出提供哪些服务,谁需要可以来申请,然后就会有回应。对应到操作系统中,这个办事大厅就是系统调用,当我们需要内核的一些能力时,就是通过系统调用。
  • 一旦项目正式成立,就需要成立项目组,将开发人员、测试人员分配到组里,这时公司就需要一个项目管理系统来管理者这些项目组。而在系统中,进程的执行也需要管理,这个管理系统就是进程管理子系统
  • 在项目执行中,不同的项目组一般会被分配到不同的会议室,这样项目组之间可以减少干扰,为了避免会议室冲突,公司有一个会议室管理系统。而对应到操作系统中,会议室就是内存空间,不同的进程需要有不同的内存空间,所以就需要一个系统来管理和分配内存,这个就是内存管理子系统
外包公司需求外包公司操作子系统作用
项目请求公司资源的统一入口办事大厅系统调用子系统操作系统功能调用的统一入口
对执行中的项目进行生命周期和资源管理项目管理系统进程管理子系统对执行的程序进行生命周期和资源管理
对执行的项目使用的会议室进行管理、分配、回收、隔离会议室管理系统内存管理子系统对操作系统的内存进行管理、分配、回收和隔离
对执行项目使用的文档资料进行管理档案管理系统文件子系统对文件进行管理
对项目的输入和输出进行管理客户对接人员和交付人员设备子系统对输入输出设备进行管理
需要和其他公司合作沟通对外合作部网络子系统网络协议栈和收发网络包

这里是一张图表明了Linux操作系统全貌:

image.png

总结

本篇文章主要介绍了Linux操作系统的各个子系统功能和作用,这里必须要记住,后续文章我们会一步一步揭开Linux的神秘面纱。

笔者水平有限,文章有错欢迎指正。最后记录一下Flag。# 一个Android开发的学习Flag记录贴