大家好,我是大白。在开始这篇文章之前,我想说一件事。最近在知乎上看到有人问,操作系统是不是延迟了他的CRUD?本来想马上反驳他的,可是仔细一想,似乎也没有耽搁什么了!但是由于近几年互联网行业体量越来越大,虽然大部分程序员的实际工作都是在CRUD,但是现在只知道CRUD也不好。目前互联网行业追求的高并发、高可用、高性能的场景,还是需要你有很好的操作系统基础。比如在开发高性能服务器时,经常会用到内存、进程、线程、IO相关的知识;再比如做SRE也需要对操作系统有很好的了解,才能找出问题出在哪里。如果你偏爱内核,那更是形影不离。所以,想要在程序员的道路上走得更远,还是建议好好学习一下!另外重点是,如果不想自己做的系统像西安一马通那样访问量一上去就崩溃,建议还是打好基础。Part1操作系统能做什么?好吧,让我们言归正传。本文是操作系统课程预备知识的第二部分。这篇文章讲述了操作系统的作用!会头晕。不知道大家是否还记得上一篇文章中的一些细节。计算机是如何工作的1、CPU一次只能执行一个进程(好吧,我之前没说这个)2、为了加快运行速度,会加载硬盘上可能用到的数据进入记忆。3、计算机上的信息都是以二进制文件的形式存储在硬盘上的。这几个细节实际上暗示了操作系统主要做什么。让我们一一看看。CPU一次只能执行一个进程。CPU是计算机最重要的资源,其计算速度非常快,但CPU再快,一次也只能执行一个进程。但是我们知道,目前的单进程计算机已经很难满足我们对计算机使用的要求。比如你在电脑上用直播软件看CBA,同时在微信上和人聊天,很多软件同时在后台运行。为了满足并发的要求,操作系统将每个程序的运行虚拟化为一个进程。CPU在一个进程上运行几十毫秒后迅速切换到另一个进程,一两秒内运行完所有进程。这会将一个CPU变成多个虚拟CPU。请注意,虚拟化是操作系统的主要功能。操作系统在很多方面都用到了这个特性,过一段时间在内存管理部分也会用到。对于虚拟化,CPU需要在不同进程之间快速切换。因此,在这个环节中,操作系统必须在后续操作中创建进程和线程,管理进程和线程,管理进程间通信。此外,还应注意进程间的同步和互斥。同步和互斥引起的死锁也由操作系统来解决。几乎每时每刻都有多个进程或线程同时竞争CPU,CPU也必须协调。为了加快运行速度,会将硬盘上可能用到的数据加载到内存中。上一篇文章提到过,为了加快电脑的运行速度,硬盘上可能用到的数据都会被加载到内存中。内存虽然读写快,但是成本高,所以内存空间很小,4G或者8G的内存条也不便宜。我们自然要想办法利用好内存。因此,在内存管理方面,我们要尽量做好以下几件事。要扩充内存,我们先来看看下一个应用程序是如何放置在内存中的。目前,应用程序的编译、链接和加载分三步进行。大家在编程的时候都是给变量或者地址赋值,而编译器在编译你的代码时并不知道实际的物理地址,只能从0开始对逻辑地址进行编号。链接之后,加载器将编译后的逻辑地址映射到内存的实际物理地址。但这很麻烦。总的内存空间只有几个G,这算是高配置了,一些大作业根本加载不出来。所以操作系统采用虚拟内存技术,把程序的一部分加载到内存中,而其余的还在磁盘上,等到要用的时候再加载程序,从逻辑上扩大了内存的大小。上面在地址转换中提到,所有的逻辑地址都是在编译阶段生成的。逻辑地址还允许每个程序从自己的角度来看都有一个完整的空间。这大大简化了程序员的工作量。当然,逻辑地址和物理地址转换过程中的一系列操作都会给操作系统带来麻烦。内存分配与回收这里所说的内存分配与回收与C语言中使用malloc申请空间然后释放是不一样的。这是关于作业的内存分配。说到内存分配,总会有碎片问题,这也是操作系统解决的。在这里,操作系统会用到段表、页表等技术。计算机上的信息都是以二进制文件的形式存储在硬盘上的,这里解释一下文件的定义。文件是具有文件名的相关元素的集合。所以,电脑上的一些应用程序(微信、QQ等),或者一些word、excel表格,都可以看成是文件。为了管理文件,操作系统还需要做以下事情。文件存储空间管理由于文件要存储在硬盘上,所以必须顺序存储,否则存储杂乱会造成大量空间碎片,其次,想取回数据时取不回。这时候操作系统就需要找到可用的空间,然后使用合适的分配方式来保存文件。目录管理既然我们保存了文件,那么我们当然希望在需要的时候能够快速的取出文件。所以我们必须将这些文件以某种形式组织起来,而最有效的方式自然是创建一个目录。在创建目录的时候,你要考虑是用单级目录结构,还是二级目录结构,还是树形目录结构。或图形目录结构。共享文件系统中的文件很可能被不同的用户使用。我们当然不能为每个用户准备相同的独立数据,这样太耗空间,自然需要文件共享。那么我们就要考虑如何实现文件共享了。我们应该使用硬链接还是软链接?文件保护由于文件可以被不同的用户访问,一些用户可能不太擅长。如果你不小心删除了你的重要文件,那就是BarbieQ。所以你必须给他限制权限,比如只能读不能写。以上对操作系统最重要的三个部分做了一个科普。讲的比较通俗,主要是让大家了解一下操作系统是干什么的。后续会对这三大部分进行详细的讲解。操作系统的设计非常巧妙,一起来学习吧。最后,我按照极客时间的《趣谈 Linux 操作系统》风格画了一张Linux操作系统的总体架构图。顺便说一句,我最近也学习了这门课程。我的感觉是,如果你的操作系统基础不是很好,建议先向我学习。如果基础不错的话,强烈推荐看看这门课程!
