image frame

长 安

最是人间留不住,曾是惊鸿照影来。

电脑的组成部分:

image-20201008133459188

Input:

  • 键盘
  • 鼠标

Output:

  • 显示器

运算:

  • CPU
  • GPU

存储:

  • RAM 内存
  • ROM 硬盘

以上是硬件部分,组装好之后就需要安装操作系统,操作系统安装好之后有很多看似简单,但是深究也很复杂的问题:

  • 桌面图标是什么?双击之后的流程是怎样触发的?
  • 键盘敲击与字符显示之间的流程?
  • PC 如何定位鼠标点击的位置,如何定位键盘输入的位置?
  • 键盘点击 ‘a’ ,显示器是怎样渲染出 ‘a’ 这个图像的?
  • 为什么回车可以将字符发送的另一台机器上?

一个”双击打开聊天软件”这样简单的操作,几乎涵盖操作系统的所有功能,以这个操作为切入,初识操作系统。

Linux学习阶段的六个坡度:

  • 熟练使用 Linux 命令行
  • 使用 Linux 进行程序设计
  • 了解 Linux 内核机制
  • 阅读 Linux 内核代码
  • 实验定制 Linux 组件
  • 生产实践落地

第一个坡:抛弃旧思维,熟练使用 Linux 命令行

上手 Linux ,首先需要从使用图形化界面切换成 Linux 的 “命令行+文件” 的使用模式。

Linux 中做任何事情都有对应的命令工具,这些命令一般在 bin 或者 sbin 目录下,但是因为命令太多,如果事先没有一个大概的方向,则很难找到。所以需要对基本的命令进行掌握。

有了基本命令之后,可以使用 -h 查看具体的配置项,也可以使用 man 查看文档。

这个过程刚开始比较困难,等熟练之后会发现大部分的命令行为模式都很类似,不需要搜索就可以完成大部分操作。

完成这个过程之后的收获:

  • sed 和 awk 命令
  • 熟练使用正则表达式
  • 熟练使用管道和 grep
  • 熟练使用 bash 自动化处理一些任务

推荐阅读:《鸟哥Linux私房菜》、《Linux系统管理技术手册》。后者更加深入。

第二个坡:通过系统调用或者 glibc,学会自己进行程序设计

命令行工具也是程序,所以使用命令行是使用别人写的程序。从使用别人写的程序到自己写程序,通过自己写的程序操作 Linux,这是第二个坡

这个步骤可以直接使用 Linux 系统调用(是系统的API?)也可以使用 glibc 库。

掌握 Linux 系统调用,需要对 Linux 的函数:

  • 入参
  • 返回值
  • 调用方式

进行掌握,其中需要掌握 Linux 操作系统原理,否则无法理解为何这样调用。

从使用者到开发者的角色转变,需要大量的进行学习,读文档,做实验。

完成这个阶段之后的收获:

  • 对 Linux 操作系统的认知更加深刻:进程树 —-> 调用了 fork 函数之后就明白了
  • 进程同步机制 —-> 调用了信号量之后就明白了
  • 网络应用层和传输层的分界线 —-> 调用 socket 之后就明白了

推荐阅读:《UNIX环境高级编程》 —-> 有代码,有介绍,有原理。

第三个坡:了解 Linux 内核机制,反复研习、重点突破

当可以开发程序调用 Linux API 的之后的下一步就是对内核进行理解,所以这一步的目标

  • 进一步了解内核原理 —-> 更好地使用命令行和程序设计

但是不推荐直接看代码,因为 Linux 代码量太大,很容易迷失,找不到源头,推荐先了解内核机制,知道基本的原理和流程就可以。

Linux 内核机制非常复杂,相互关联:

  • 进程运行需要分配内存,内存映射涉及文件关联,文件读写需要经过块设备,从文件中加载代码才能运行起来进程。

这些相互关联的知识点需要反复对照,才能理清思路。

完成这个阶段之后的收获:

  • Linux 这个复杂的系统开始变得透明,无论是运维还是开发,你都能知道系统背后的运行流程,出现问题时大概知道背后发生的事情,并且能准确定位异常位置。

Linux 内核机制是专栏的重点内容,基于最新的 4.x 内核进行讲解,图文对照,目的是理解并记住机制。

推荐阅读:《深入理解LINUX内核》 —-> 言简意赅地讲述了内核的主要机制,虽然版本比较老,但是没有问题。

第四个坡:阅读 Linux 内核代码,聚焦核心逻辑和场景

学习机制的时候会遇到很多困惑,理论和描述可以让你从高维度上了解机制,但是容易忽略细节。

这个时候就需要遇到代码了,代码是准确的,找到有疑惑的地方,直接开始看代码,很多问题就会解决了。

一开始阅读代码不要纠结细节,不要每一行都搞清楚作用,而是要聚焦核心逻辑使用场景

完成这个阶段之后的收获:

  • 深度并且清晰地掌握了操作系统的原理。

总结:

六个阶段,六个对Linux不同的掌握度,可以总结成下面这张图,时刻对照自己的进度,稳步前行。

熟练使用命令行 —-> 能够调用 API 实现程序 —-> 了解 Linux 内核机制 —-> 阅读 Linux 内核源码 —-> 定制 Linux 组件 —-> 实践没有终点

image-20201008131841554

《数据结构与算法之美》04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

image-20200924154722860

上篇介绍了 大 O 表示法以及常见的复杂度分析案例,这篇介绍四个复杂度分析方面的知识点:

  • 最好情况时间复杂度 (best case time complexity)
  • 最坏情况时间复杂度 (worst case time complexity)
  • 平均情况时间复杂度 (average case time complexity)
  • 均摊时间复杂度 (amortized time complexity)

这四个知识点搭配上章的 大O表示法,基本上囊括了复杂度分析需要的知识。

阅读更多...

《数据结构与算法之美》03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗

image-20200924154741884

数据结构和算法的目的是让代码运行的更快或让代码更节省存储空间,根据不同的场景与需求获得一个最均衡的结果。

而这个”“ 与 ““ 需要指标进行衡量,也就是时间、空间复杂度分析

学习算法与数据结构离不开时间、空间复杂度分析,因为需要用指标去衡量效率,而复杂度分析是算法学习的精髓,掌握了分析复杂度的方法,数据结构与算法的内容就掌握了一半

阅读更多...
  • © 2015-2020 Ahri
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信