现在连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开始,讲到内存、硬盘、线程、进程,每篇文章都是用故事化的文字介绍这些计算机里最硬核的观念,可以说是四两拨千斤了。
看完这个系列的操作系统文章之后,我对于操作系统中的一些疑惑基本上也都消除了,再回去看一看那些面试题,觉得也没那么复杂了。
当然了,对于面试题我们还是要认真准备的,该翻的面经要翻,该搞懂的面试题一个也不能放过,有了之前的基础之后,再去搞懂这些面试题就简单很多了,至此,我对于操作系统的学习也算是告一段落。
推荐资源
书籍
《深入理解计算机系统》
《操作系统导论》
总结
关于操作系统的学习,我们就讲到这里了,如果还有什么疑问也可以到我公众号里找我探讨。
对了,你想问我文章里提到的书籍和视频去哪找?我已经给你准备好了
以上资源都可以免费领取,在我的公众号【程序员黄小斜】回复“操作系统”即可领取对应的资源。
现在连Linux都搞不懂,当初我要是这么学习操作系统就好了!的更多相关文章
- Windows和Linux都有的Copy-on-write技术
Windows和Linux都有的Copy-on-write技术 MySQL技术内幕Innodb存储引擎第2版 P375 SQL Server2008 实现与维护(MCTS教程)P199 LVM快照技术 ...
- 相机拍的图,电脑上画的图,word里的文字,电脑屏幕,手机屏幕,相机屏幕显示大小一切的一切都搞明白了!
相机拍的图,电脑上画的图,word里的文字,电脑屏幕,手机屏幕,相机屏幕显示大小一切的一切都搞明白了! 先说图片X×dpi=点数dotX是图片实际尺寸,简单点,我们只算图片的高吧,比如说拍了张图片14 ...
- Linux新手必看:浅谈如何学习linux
本文在Creative Commons许可证下发布 一.起步 首先,应该为自己创造一个学习linux的环境--在电脑上装一个linux或unix问题1:版本的选择 北美用redhat,欧洲用SuSE, ...
- Linux的几个概念,常用命令学习
Linux的几个概念,常用命令学习---------------------------------设备名装载点// 通过装载点访问设备-------------------------------- ...
- linux自学(九)之开始centos学习,安装数据库MariaDB
上一篇:linux自学(八)之开始centos学习,安装tomcat 数据库我们不安装mysql,我网上看了好多资料发现mysql安装比较麻烦,我们这里安装同一个父亲的产品MariaDB.驱动,端口等 ...
- linux自学(七)之开始ccentos学习,安装jdk
上一篇:linux自学(六)之开始centos学习,更换yum源 如果你认真跟着前面操作那么一定都完成相关配置及下载,我们的目的是部署Javaweb项目,需要jdk,mysql,tomcat.那么接下 ...
- linux自学(五)之开始centos学习,Xshell远程连接
上一篇:linux自学(四)之开始centos学习,网络配置 前面操作都是在电脑中的虚拟机上操作的,比较麻烦,需要来回切换.下面我将使用远程连接工具Xshell进行操作,Xshell直接百度下载即可. ...
- 20179223《Linux内核原理与分析》第九周学习笔记
视频学习 进程调度与进程调度的时机分析 不同类型的进程有不同的调度需求 第一种分类: --I/O-bound:1.频繁的进行I/O:2.通常会花费很多时间等待I/O操作的完成 --CPU-bound: ...
- 免考final linux提权与渗透入门——Exploit-Exercise Nebula学习与实践
免考final linux提权与渗透入门--Exploit-Exercise Nebula学习与实践 0x0 前言 Exploit-Exercise是一系列学习linux下渗透的虚拟环境,官网是htt ...
随机推荐
- 在eclipse里用jdbc连接MySQL
进入MySQL控制台, 输入密码, 新建数据库test1并给用户授权,用户名“jaovo”, 创建表,id主键自增, 下载jdbc驱动包(jar文件) 把它放进tomcat的安装目录lib文件夹下(我 ...
- Quantitative Trading with R(一):两个简单的策略
下面是两个使用R中的Quantstrat包进行策略构建的例子,都是对600550.ss.600192.ss.600152.ss.600644.ss.600885.ss.600151.ss六只股票进行投 ...
- Python3实现发送邮件和发送短信验证码
Python3实现发送邮件和发送短信验证码 Python3实现发送邮件: import smtplib from email.mime.text import MIMEText from email. ...
- 前端 network
控制台 :https://blog.csdn.net/m0_37724356/article/details/79884006 原文链接:https://segmentfault.com/a/1190 ...
- Spring AnnotationConfigApplicationContext
Spring AnnotationConfigApplicationContext 概述 通常Spring XML文件用来作为ClassPathXmlApplicationContext 的初始化.@ ...
- SASS用法入门
本文参考了 阮一峰 老师对 SASS 用法的讲解. 学过 CSS 的人都知道,它不是一种编程语言,在日常的开发中,经常要写大量的 css 代码,有很多的重复代码,效率很低.Sass 是一个 CSS 的 ...
- VUE报表开发
因为在项目中经常开发一些报表,并且业务.逻辑其实都有大部分的重复部分. 所以将这些常用的模块抽象出来.并且可视化操作.封装成一款报表开发工具. 先看一下项目的一些效果:数据单项绑定 可视化操作: 数据 ...
- LeetCode.509——斐波那契数
问题描述: 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) ...
- Java集合XMind与注意事项
Java中集合使用时的几个注意事项: 1.ArrayList和HashMap都具有扩容 ArrayList初始化数组长度为10,扩容后的容量为原来的1.5倍. HashMap初始化的数组长度为16,扩 ...
- Java使用反射实现根据字符串类名及参数创建对象
要根据字符串创建对象,可以使用 Class.forName(String) 方法: 而要新建一个可以指定初始值参数的对象,就必须得使用 getConstructor(Class<T>... ...