• 现在连Linux都搞不懂,当初我要是这么学习操作系统就好了!


    原创声明

    本文首发于微信公众号【程序员黄小斜】

    本文作者:黄小斜

    转载请务必在文章开头注明出处和作者。

    本文思维导图

    在这里插入图片描述

    简介

    学习编程,操作系统是你必须要掌握的基础知识,那么操作系统到底是什么呢?

    这还用说么,操作系统不就是Windows、Linux、Mac、IOS、Android、IOS这类我们天天都在用的东西么?

    此话不假,但是操作系统作为计算机科学里的一门基础学科,肯定不能这么接地气对不对,总的来点高大上的概念,震慑一下你们吧。

    根据百度百科的介绍,操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

    这个介绍足够高大上了吧,那么到底啥是操作系统呢,简单来说,操作系统就是管理计算机硬件和软件资源的一种软件,计算机里的硬盘、鼠标键盘、显示器等设备,都要由它来管理,你打开游戏、打开浏览器或者是看电影,也都要通过操作系统来执行。

    没有了操作系统,电脑就失去了灵魂,只是一堆硬件而已。

    为什么要学操作系统

    了解了操作系统的基本概念之后,接下来我们再来看看,为什么我们要学习操作系统呢?

    首先,当然是因为面试要考啦。

    其次,无论你学习什么编程语言,和都避免不了和操作系统打交道,比如你学习Java,用到多线程技术,实际上操作系统才是负责管理进程和线程的,所以Java里的线程常常要和操作系统的线程或者进程一一对应。

    此外,你会学习到内存分配的知识,比如c++里可以直接分配一段内存,此时实际上是调用操作系统提供的API进行内存分配。

    操作系统不仅负责管理进程和线程的调度、内存的分配和管理,以及设备和IO的处理,还要负责管理文件系统和网络。

    最重要的是,操作系统要负责把代码从硬盘加载到内存,再告诉cpu去读取内存代码,这是一切计算机运行的基础。

    如果不懂操作系统,你在未来学习编程语言的高级特效,涉及到线程进程调度,内存分配,或者是学习Linux相关的知识时,都会一头雾水,所以,只有学会了操作系统,我么才能够更好地学习其他语言和技术。

    如何学习操作系统

    第一次接触

    第一次接触操作系统同样是在我研究生的时候,当时自学计算机网络已经受到了惊吓(被大部头教科书劝退),于是学习操作系统时也更加的小心翼翼,当时我找了一本体量稍微小一点的《操作系统》教科书来学习。

    用了大概一周左右的时间,我把这本书翻了一遍,隐隐约约还记得一些概念,进程和线程,进程调度算法、内存管理的分页和分段,页面置换算法,但其实当时压根没有理解这些东西,再过了一周之后也就忘得差不多了。

    由于我当时找的多是Java方面的实习,很多公司对于操作系统的考察并不多,偶尔就问问线程和进程的区别,

    于是对于操作系统的学习我当时并没有多大的重视,毕竟还有一堆Java的书要啃呢,先都啃到位再说。

    入门学习阶段

    就这样,我一直保留着只看过一本教科书的操作系统水平,全情投入到复习Java的伟业中了,然而当我学到Java并发编程和JVM的时候,总感觉有哪里不对劲:Java中的线程和操作系统的线程是什么关系,JVM的内存管理和操作系统的内存管理又是什么关系。

    我抱着这个疑问学完了Java并发原理和JVM,当然也是一知半解的那种。事后证明,在没有操作系统基础的情况下,越往上层学,摔得越惨,勿用浮沙筑高台,说的便是这个道理,底子打好了,才能往上爬,否则都是浮云。

    我在百度实习的那段时间里,再次意识到了操作系统这门课程的重要性,于是我找来了某乎强烈推荐的《深入理解计算机系统》这本史诗级大部头,这本书其实并不是一本纯粹的操作系统书籍,而是结合了计算机组成原理和操作系统两方面的内容,基本上把计算机内部工作的那些原理都给讲清楚了。

    第一次看这本书的时候,我坚持了不到三天就放弃了,于是第二次看这本书,我在公司花了快一个月的时间才总算看得差不多。

    在以前,我连什么是x64什么x86都搞不清楚,看完这本书之后,我好歹对CPU、内存、硬盘的工作方式,以及处理器的工作方式等内容有了一些理解,不得不说,这个时候我才算是对操作系统入了门。

    强化学习阶段

    光看书还不足以应对大厂的面试,大公司对操作系统的考察是很严格的,比如百度、腾讯和头条,对于操作系统的要求还是比较高的。

    除了进程和线程区别这种最简单的面试题之外,还会有一些比较复杂的问题,比如”进程调度算法有哪些,讲一下FIFO和LRU算法“、”内存中的分页和分段有什么区别,分页里的页面置换算法有哪些,LRU是怎么实现的“、”产生死锁的必要条件,解决死锁的办法“、”线程间通信和进程间通信的方法都有哪些,具体怎么使用“

    此类问题,也算是比较常见的操作系统面试题,但是要回答清楚的话还是需要一定功力的。

    当时我应对这类问题,基本上就是通过刷面经和背答案,对于很多原理性的东西理解得并不深刻,但是也没有找到什么解决办法。

    冲刺阶段

    既然自己学了半天效果都不佳,那不如直接向大佬学习吧,于是我辗转各大博客,技术社区,技术公众号,看了很多关于操作系统的文章,发现确实有很多讲的不错的内容,看起来比自己死记硬背要靠谱的多了。

    最早看的优质内容是《码农翻身》作者刘欣老师的文章,真的是相见恨晚,他有十几篇文章是专门讲解操作系统的,从CPU开始,讲到内存、硬盘、线程、进程,每篇文章都是用故事化的文字介绍这些计算机里最硬核的观念,可以说是四两拨千斤了。

    看完这个系列的操作系统文章之后,我对于操作系统中的一些疑惑基本上也都消除了,再回去看一看那些面试题,觉得也没那么复杂了。

    当然了,对于面试题我们还是要认真准备的,该翻的面经要翻,该搞懂的面试题一个也不能放过,有了之前的基础之后,再去搞懂这些面试题就简单很多了,至此,我对于操作系统的学习也算是告一段落。

    推荐资源

    书籍

    《深入理解计算机系统》
    《操作系统导论》

    总结

    关于操作系统的学习,我们就讲到这里了,如果还有什么疑问也可以到我公众号里找我探讨。

    对了,你想问我文章里提到的书籍和视频去哪找?我已经给你准备好了

    以上资源都可以免费领取,在我的公众号【程序员黄小斜】回复“操作系统”即可领取对应的资源。

    image

  • 相关阅读:
    imx6------watchdog导致不进系统
    嵌入式 Linux 如何操作 GPIO ?
    Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
    一张图看懂AI、机器学习和深度学习的区别
    男生拍照姿势大全,这样拍才帅
    OpenCV/OpenCL/OpenGL区别
    设计简单算法体验Vivado HLS的使用
    FMC简介
    Android 开机Process xxx (pid xxxx) has died问题分析
    g711u与g729比较编码格式
  • 原文地址:https://www.cnblogs.com/xll1025/p/12364377.html
Copyright © 2020-2023  润新知