操作系统的八股文自述(持续更新)

操作系统的八股文自述

1.1 虚拟内存

虚拟内存是计算机系统内存管理的⼀种技术,我们可以⼿动设置⾃⼰电脑的虚拟内存。

虚拟内存为每个进程提供了⼀个⼀致的、私有的地址空间,**它让每个进程产⽣了⼀种⾃⼰在独享主存的错觉(每个进程拥有⼀⽚连续完整的内存空间)。**这样会更加有效地管理内存并减少出错。

虚拟内存的重要意义是它定义了⼀个连续的虚拟地址空间,并且 把内存扩展到硬盘空间。

虚拟内存 使得应⽤程序认为它拥有连续的可⽤的内存(⼀个连续完整的地址空间),⽽实际上,它通常是被分隔成多个物理内存碎⽚,还有部分暂时存储在外部磁盘存储器上,在需要时进⾏数据交换。

**优势:**可以弥补物理内存大小的不足;一定程度的提高反映速度;减少对物理内存的读取从而保护内存,延长内存使用寿命。

**缺点:**占用一定的物理硬盘空间;加大了对硬盘的读写;设置不得当会影响整机稳定性与速度

局部性原理:

局部性原理表现在以下两个⽅⾯:

**1. 时间局部性 :**如果程序中的某条指令⼀旦执⾏,不久以后该指令可能再次执⾏;如果某数据被访问过,不久以后该数据可能再次被访问。产⽣时间局部性的典型原因,是由于在程序中存在着⼤量的循环操作。

**2. 空间局部性 :**⼀旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在⼀段时间内所访问的地址,可能集中在⼀定的范围之内,这是因为指令通常是顺序存放、顺序执⾏的,数据也⼀般是以向量、数组、表等形式簇聚存储的。

虚拟内存技术实际上就是建⽴了**“内存⼀外存”的两级存储器的结构,利⽤局部性原理**实现髙速缓存。

1.2 对缓存了解吗?

1、什么是缓存 [ Cache ]?

  • 存在内存中的临时数据。
  • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

2、为什么使用缓存?

  • 减少和数据库的交互次数,减少系统开销,提高系统效率。

3、什么样的数据能使用缓存?

  • 经常查询并且不经常改变的数据。

缓存是一种提高数据的读取性能的技术,在硬件设计、软件开发上都应用非常广泛,比如有常见的CPU缓存,数据库缓存,浏览器缓存,DNS缓存等等。缓存只要是通过内存存储被访问过的数据供后续访问时使用,以此来达到提速的目的。它首先是通过预读取的方式读取将要载入的数据加载到内存中,然后对外提供服务;以及通过延迟写的方式,将需要写入到磁盘或者数据库中的数据,暂时先写到内存中,然后就返回成功,再定时将内存中的数据批量写入到磁盘中缓存一般会在加在热点数据上,就是那种被高频访问的数据上

但是,缓存并不是银弹,加上缓存就也会带来一些问题,比如缓存雪崩以及缓存穿透缓存雪崩是指,当有大量的请求并发进入时,由于某些原因未起到预期的缓冲效果,导致大量的请求直接打在数据库上,造成数据库的压力过重,导致系统性能急剧下降的情况。缓存穿透是指缓存没有发挥作用,业务系统虽然去缓存中查询数据,但是缓存中没有数据,业务系统需要再次去存储系统中查询数据。

同样的,在MySQL 8.0 版本之前是有一个查询缓存,但是在 8.0 版本就把直接把查询缓存这项功能直接删掉了,彻底就没有这个功能了。**放弃这个查询缓存的原因是:**查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。

缓存淘汰策略:

① 先进先出策略FIFO;

② 最少使用策略LFU;

③ 最近最少使用策略LRU。

1.3 拥塞控制和流量控制的区别:

拥塞控制防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。

流量控制:指点对点通信量的控制,是端到端中的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

1.4 父进程创建一个子进程是怎么实现的呢?(其实是fork调用就行)

参考博客:linux创建子进程–fork()方法

(1)fork()的实质过程

父进程中在调用**fork()派生新进程,实际上相当于创建了进程的一个拷贝;即在fork()之前的进程拥有的资源会被复制到新的进程中去。网络服务器在处理并发请求时,也可以采取这种派生新进程的方式: 父进程调用accept()后调用fork()**来处理每一个连接。那么,所接受的已连接的套接口随后就在父子进程中共享。通常来说,子进程会在这连接套接口中读和写操作,父进程则关闭这个已连的套接口(可以参考:http://blog.csdn.net/moxiaomomo/article/details/6791763)

(2)fork()的用法

fork()有两个典型用法:**(1)**一个进程进行自身的复制,这样每个副本可以独立的完成具体的操作,在多核处理器中可以并行处理数据。这也是网络服务器的其中一个典型用途,多进程处理多连接请求。 **(2)**一个进程想执行另一个程序。比如一个软件包含了两个程序,主程序想调起另一个程序的话,它就可以先调用fork来创建一个自身的拷贝,然后通过exec函数来替换成将要运行的新程序。

1.5 父子进程之间共享了哪些信息?(不是很了解)

参考博客:父子进程共享内容

操作系统的八股文自述(持续更新)_第1张图片

1.6 probuf你了解多少呢?(这是根据我项目问的)

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。 Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单

操作系统的八股文自述(持续更新)_第2张图片

1.7 Linux操作copy on write 是什么意思呢?(写时复制)

参考博客:Linux写时拷贝技术(copy-on-write)

写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。在页根本不会被写入的情况下—举例来说,fork()后立即调用exec()—它们就无需复制了。fork()的实际开销就是复制父进程的页表以及给子进程创建惟一的进程描述符。在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间里常常包含数十兆的数据)。

1.8 线程与进程之间的区别? 多进程与多线程的优缺点以及多进程与多线程的使用场景?

进程、线程、多进程、多线程的优缺点

图文并茂-带你搞懂多线程和多进程

教科书上有句非常经典的话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。

(1)线程与进程的区别:

线程是进程划分成的更⼩的运⾏单位,⼀个进程在其执⾏的过程中可以产⽣多个线程。线程和进程最⼤的不同在于基本上各进程是独⽴的,⽽各线程则不⼀定,因为同⼀进程中的线程极有可能会相互影响。线程执⾏开销⼩,但不利于资源的管理和保护;⽽进程正相反。

进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发

线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发

一个程序至少有一个进程,一个进程至少有一个线程,线程依赖于进程而存在;

进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。

(2)多线程与多进程的优缺点:

操作系统的八股文自述(持续更新)_第3张图片

操作系统的八股文自述(持续更新)_第4张图片

(3)使用的场景:

多线程和多进程 及其应用场景

操作系统的八股文自述(持续更新)_第5张图片

操作系统的八股文自述(持续更新)_第6张图片

操作系统的八股文自述(持续更新)_第7张图片

总结:

假设我现在去解析一百个文件,而且这里文件切换的耗时比文件分析的耗时小的时候,所以就应该选用多进程。因为采用多进程,一个文件的分析崩溃不会影响到其他文件的分析,100个文件之间保持相互之间的隔离,保证安全。

你可能感兴趣的:(面经,面试)