为什么要学习Linux操作系统?_cpongo311111的博客-程序员宝宝

技术标签: 操作系统  数据结构与算法  数据库  

你好,我是你的老朋友刘超。在“趣谈网络协议”结课半年之后,我又给你带来了一个新的基础课程,“趣谈Linux操作系统”。

在“趣谈网络协议”的开篇词中,我表达了作为一个合格的 IT工程师,在职业生涯中学习基础知识的重要性。如果说当时,我对这件事只是一种感性认识,在专栏推出之后,我的想法有了一些变化。

我通过留言区和同学们进行了很多互动,也和其他做基础知识专栏的作者有了不少交流,我发现,无论是从个人的职业发展角度,还是从公司招聘候选人的角度来看,扎实的基础知识是很多人的诉求。这让我更加坚信,我应该在“趣谈“基础知识这条道路上走下去。

目前极客时间的专栏,覆盖了网络、算法、数学、数据库、编程语言等各个方面,而操作系统也是基础中非常重要的一环。尤其我作为一名云架构师,Linux操作系统的基础知识更是必不可少的。在实践中收获了很多心得之后,我希望在极客时间继续跟你分享。

你可能会说,我们大学里上过操作系统的课,而且每天都在用操作系统,为什么还要专门学一遍呢?尽管我的操作系统课成绩不错,但是在大学的时候,我和你的看法一样,我觉得这门课没有什么用,现在回想起来可能有这样几个原因。

第一,大学里普遍使用的操作系统是Windows,老师大多也用Windows。Windows的优势是界面友好,很容易上手,于是我们就养成了要配置东西了就去菜单找,用鼠标点点的习惯,似乎会攒电脑、装系统、配软件就能搞定一切问题。

第二,一种操作系统对应的是一系列的软件生态,而大学里很多课程都是围绕Windows软件生态展开的。例如学C++用的是Vistual Studio,学数据库用的是SQL Server,做网站用的是IIS等等。

第三,大学里的操作系统课往往都是纯讲理论,讲了很多原理,但是压根儿没法和平时用的Windows系统的行为关联起来,也根本弄不清操作系统在底层到底是怎么做的。

直到毕业之后,我加入EMC,第一个项目就是基于Linux开发分布式文件系统。你能想象,只能对着一个黑框敲命令时,我心中的崩溃吗?我那时真的觉得,我大学的操作系统算是白学了。于是,我痛定思痛,开启了学习Linux的征程。

一旦开始学,我发现,Linux对于编程世界来说,简直就像一扇门。尽管门里的知识浩如烟海,每一本书都厚如砖头,但我发现这条路上任何一片景色都精彩无比。

打开Linux操作系统这扇门,你才是合格的软件工程师

根据2018年W3Techs的数据统计,对于服务器端,Unix-Like OS占的比例近70%,其中Linux可以称得上是中流砥柱。随着移动互联网的发展,客户端基本上以Android和iOS为主。Android是基于Linux内核的,因而客户端也进入了Linux阵营。可以说,在编程世界中,Linux就是主流,不会Linux你就会格格不入。

那些火得不行的技术,什么云计算、虚拟化、容器、大数据、人工智能,几乎都是基于Linux技术的。那些牛得不行的系统,团购、电商、打车、快递,都是部署在服务端,也几乎都是基于Linux技术的。

所以说,如果你想进大公司,想学新技术,Linux一定是一道绕不过去的坎。只有进入Linux操作系统这扇门,你才能成为合格的软件工程师。

研究Linux内核代码,你能学到数据结构与设计模式的落地实践

Linux最大的优点就是开源。作为程序员,有了代码,啥都好办了。只要有足够的耐心,我们就可以一层一层看下去,看内核调度函数,看内存分配过程。理论理解起来不容易,但是一行行的“if-else”却不会产生歧义。

在Linux内核里,你会看到数据结构和算法的经典使用案例;你甚至还会看到并发情况下的保护这种复杂场景;在实践中遇到问题的时候,你可以直接参考内核中的实现。

例如,平时看起来最简单的文件操作,通过阅读Linux代码,你能学到从应用层、系统调用层、进程文件操作抽象层、虚拟文件系统层、具体文件系统层、缓存层、设备I/O层的完美分层机制,尤其是虚拟文件系统对于接入多种类型文件系统的抽象设计,在很多复杂的系统里面,这个思想都能用得上。

再如,当你写代码的时候,大部分情况下都可以使用现成的数据结构和算法库,但是有些场景对于内存的使用需要限制到很小,对于搜索的时间需要限制到很小的时候,我们需要定制化一些数据结构,这个时候内核里面这些实现就很有参考意义了。

了解Linux操作系统生态,能让你事半功倍地学会新技术

Linux是一个生态,里面丰富多彩。很多大牛都是基于Linux来开发各种各样的软件。可以这么说,只要你能想象到的技术领域,几乎都能在里面找到Linux的身影。

数据库MySQL、PostgreSQL,消息队列RabbitMQ、Kafka,大数据Hadoop、Spark,虚拟化KVM、Openvswitch,容器Kubernetes、Docker,这些软件都会默认提供Linux下的安装、使用、运维手册,都会默认先适配Linux。

因此,在Linux环境下,很容易能够找到现成的工具,这不仅会让你的工作事半功倍,还能让你有亲密接触大牛思想的机会,这对于你个人的技术进步和职业发展都非常有益。

如果不进入Linux世界,你恐怕很难享受到开源软件如此多的红利。

考虑到以上这些,在设计“图解Linux操作系统“这个专栏的时候,我主要秉承两大原则,希望能够帮你打开Linux操作系统这扇门。

第一个原则仍然是“趣谈”。我希望通过故事化的方式,将枯燥的基础知识结合某个场景,给你生动、具象地讲述出来,帮你加深理解、巩固记忆、夯实基础。

操作系统是干什么的呢?我们都知道,一台物理机上有很多硬件,最重要的就是CPU、内存、硬盘、网络。同时,一台物理机上也要跑很多程序,这些资源应该给谁用呢?当然是大家轮着用,谁也别独占,谁也别饿着。为了完成资源分配这件事,操作系统承担了一个“大管家”的作用。它将硬件资源分配给不同的用户程序使用,并且在适当的时间将这些资源拿回来,再分配给其他的用户进程。

鉴于操作系统这个“大管家”的角色,我设计了一个故事,将各个知识点串起来,来帮助你理解和记忆。

假设,我们现在就是在做一家外包公司,我们的目标是把这家公司做上市。其中,操作系统就是这家外包公司的老板。我们把这家公司的发展阶段分为这样几个时期:

  • 初创期:这个老板基于开放的营商环境(x86体系结构),创办一家外包公司(系统的启动)。因为一开始没有其他员工,老板需要亲自接项目(实模式)。
  • 发展期:公司慢慢做大,项目越接越多(保护模式、多进程),为了管理各个外包项目,建立了项目管理体系(进程管理)、会议室管理体系(内存管理)、文档资料管理系统(文件系统)、售前售后体系(输入输出设备管理)。
  • 壮大期:公司越来越牛,开始促进内部项目的合作(进程间通信)和外部公司合作(网络通信)。
  • 集团化:公司的业务越来越多,会成立多家子公司(虚拟化),或者鼓励内部创业(容器化),这个时候公司就变成了集团。大管家的调度能力不再局限于一家公司,而是集团公司(Linux集群),从而成功上市(从单机操作系统到数据中心操作系统)。

\"\"

第二个原则就是图解。Linux操作系统中的概念非常多,数据结构也很多,流程也复杂,一般人在学习的过程中很容易迷路。所谓“一图胜千言”,我希望能够通过图的方式,将这些复杂的概念、数据结构、流程表现出来,争取用一张图串起一篇文章的知识点。最终,整个专栏下来,你如果能把这些图都掌握了,你的知识就会形成体系和连接。在此基础上再进行深入学习,就会如鱼得水、易如反掌。

\"\"

例如,这张图就表示了文件操作在各个层的数据结构的关联。只要你学完之后,能对着这张图将它们之间的关系讲清楚,对于文件系统的部分,你就会了然于心了。

我是谁:

我是刘超,网易杭州研究院云计算技术部首席架构师,QCon2019 广州专题出品人。我有 15 年云计算领域研发及架构经验,出版过《Lucene 应用开发解密》。

极客时间的老用户都知道,我也是极客时间“趣谈网络协议”专栏的作者,这个专栏目前有超过 3 万人订阅,我收到很多用户的反馈,说非常认可我这种“像小说一样”的“趣谈”形式,讲得通俗易懂,可以更好的理解底层知识。

大家的学习热情也十分高涨,光互动留言就超过了 5 万字。在和很多同学交流后,我发现很多人希望我继续延续“趣谈”的形式,讲一讲 Linux 操作系统。这也是《趣谈 Linux 操作系统》专栏诞生的初衷。

点击这里试看或订阅《 趣谈 Linux 操作系统 》

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cpongo3/article/details/89027298

智能推荐

Python所有的库_It Bean的博客-程序员宝宝_python的库

文章目录前言库名称简介:一、文件处理1.库名称简介Mimetypes,Python标准库,映射文件名到MIME类型。二、图像处理1.库名称简介PIL(Python Image Library),基于Python的图像处理库,功能强大,对图形文件的格式支持广泛,内置许多图像处理函数,如图像增强、滤波[算法]等Pillow,图像处理库,PIL图像库的分支和升级替代产品。Matplotlib,著名的绘图库,提供了整套和matlab相似的命令API,用以绘制一些高质量的数学二维图形,十分适合交互式地进行制图。bre

SpringDataJPA-3_ginger_mr的博客-程序员宝宝

文章目录Specifications动态查询1.使用Specifications完成条件查询2.方法对应关系多表设计1.表之间关系的划分2.在JPA框架中表关系的分析步骤JPA中的一对多1.示例分析2.表关系建立3.实体类关系建立以及映射配置4.映射的注解说明5.一对多的操作JPA中的多对多1.示例分析2.表关系建立3.实体类关系建立以及映射配置4.映射的注解说明5.多对多的操作Spring Data JPA中的多表查询1.对象导航查询Specifications动态查询有时我们在查询某个实体的时候,给

USB JTAG adapter_xianfengdesign的博客-程序员宝宝

 http://www.ixo.de/info/usb_jtag/http://www.edaboard.com/ftopic114946-0-asc-0.htmlProject Background The goal of the project was to build a budget USB JTAG adapter. Basically it should allow dir

[RK3568 Android11] 开发之系统动态隐藏导航栏(三)_~未来可期~的博客-程序员宝宝

目录前言一、系统创建导航栏广播接口二、验证导航栏广播接口功能1、使用am命令测试广播接口2、APP调用代码和实际效果前言 前面两篇已讲在 设置->显示 里添加按钮控制导航栏的显示和隐藏;这篇讲怎么给出接口让APP应用调用导航栏的显示和隐藏,此篇是基于前面两篇的基础上修改的([RK3568 Android11] 开发之系统动态隐藏导航栏(二)),采用发送广播的形式去控制;一、系统创建导航栏广播接口1、定义导航栏显示和隐藏的广播public stat...

《Linux/UNIX系统编程手册》 英文版读书笔记 Alternative I/O Models63.4_kingeasternsun的博客-程序员宝宝

63.4.4 A Closer Look at epoll SemanticsWhen we create an epoll instance using epoll_create(), the kernel creates a new in-memory i-node and open file description, and allocates a new file descriptor in

手写demo了解vue响应式原理,订阅模式,观察者模式_想搞全栈的前端的博客-程序员宝宝

Vue2.X响应式原理一.defineProperty 的应用在Vue2.X响应式中使用到了 defineProperty 进行数据劫持,所以我们对它必须有一定的了解,那么我们先来了解它的使用方法把, 这里我们来使用 defineProperty来模拟Vue 中的data<body> <div id="app"></div> <script> // 模拟 Vue的data let data = {

随便推点

揭密微信跳一跳小游戏那些外挂_腾讯WeTest的博客-程序员宝宝

作者:Hahn, 腾讯高级UI工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 原文链接:http://wetest.qq.com/lab/view/364.html WeTest 导读张小龙:这个游戏发布以后,其实它的效果有点超出我们的预期,我们自己开玩笑说,这个游戏突然变成了有史以来可能用户规模最大的一个游戏,因为它的DAU大概到了1点几亿,但同时出现了很多外挂,我...

STL 之 iterator traits 备忘_xuqing-ICT的博客-程序员宝宝

//5种迭代器,为了激活重载机制,定义的5个类型。每种迭代器就是一个类型。struct input_iterator_tag{};struct output_iterator_tag{};struct forward_iterator_tag : public input_iterator_tag{};struct bidirectional_iterator_tag:public fo

adb 命令_prog_dong的博客-程序员宝宝

Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 可以通过下列几种方法加入adb:1. 在设备上运行shell命令2.通过端口转发来管理模拟器或设备3.从模拟器或设备上拷贝来或拷贝走文件 下面对adb进行了介绍并描述了常见的使用.查询模拟器/设备实例概要Android 调试系统是一个面对客户服务系统,包括

初识kotlin,实现一个简单的列表__implements的博客-程序员宝宝

开场小絮叨:kotlin被谷歌正式作为Android的一级开发语言已经好几个月了,一直想学习一下,一直没有时间(好吧,我承认是我懒)。最近买了本书啃,也算下定决心学习这门语言。学习新知识,首先你要知道它是什么它的历史和它的用途。它是针对Java平台的一种编程语言,在这我强调一下,kotlin并不是一门新的语言,它其实在11年就已经推出来了,只不过是在被谷歌认证为Android开发官方语言之

计算机网络基础——NWU_LK_NWU_LK的博客-程序员宝宝

一.计算机网络的概述计算机网络基本概念互连的,自治的计算机集合计算机网络主要功能数据通信资源共享分布式处理提高可靠性负载均衡计算机网络组成按照功能可以分为:通信子网、资源子网计算机网络分类按照分布范围:广域网(WAN)、城域网(MAN)、局域网(LAN)、个人区域网(PAN)按使用者分:公用网(移动、电信)、专用网(军用网等)按交换技术分:电路交换、报文交换、分组交换按拓扑结构分:总线型、星型、环形、网状型按传播技术分:广播式网络、点对点网络...

LeetCode---24. 两两交换链表中的节点_ZhiZDK的博客-程序员宝宝

题目:24. 两两交换链表中的节点给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } *