本博文主要介绍在面试过程中有关于操作系统相关问题,帮助大家在面试过程中的更好的回答问题,同时展示大家对于计算机基础知识的良好功底。
一、操作系统基础问题 二、进程与线程问题进程的通信方式?
- 消息传递︰消息传递是进程间实现通信和同步等待的机制,使用消息传递,进程间的交流不需要共享变量,直接就可以进行通信﹔消息传递分为发送方和接收方
- 先进先出队列︰先进先出队列指的是两个不相关联进程间的通信,两个进程之间可以彼此相互进程通信,这是一种全双工通信方式
- 管道︰管道用于两个相关进程之间的通信,这是一种半双工的通信方式,如果需要全双工,需要另外一个管道。
- 直接通信︰在这种进程通信的方式中,进程与进程之间只存在一条链接,进程间要明确通信双方的命名。
- 间接通信︰间接通信是通信双方不会直接建立连接,而是找到一个中介者,这个中介者可能是个对象等等,进程可以在其中放置消息,并且可以从中删除消息,以此达到进程间通信的目的。消息队列︰消息队列是内核中存储消息的链表,它由消息队列标识符进行标识,这种方式能够在不同的进程之间提供全双工的通信连接。
- 共享内存︰共享内存是使用所有进程之间的内存来建立连接,这种类型需要同步进程访问来相互保护。
什么是操作系统?
操作系统是运行在计算机上最重要的一种软件,它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层。通常情况下,计算机上会运行着许多应用程序,它们都需要对内存和 CPU进行交互,操作系统的目的就是为了保证这些访问和交互能够准确无误的进行。
操作系统是一种软件,它的主要目的有三种
- 管理计算机资源,这些资源包括CPU、内存、磁盘驱动器、打印机等。
- 提供一种图形界面,就像我们前面描述的那样,它提供了用户和计算机之间的桥梁。
- 为其他软件提供服务,操作系统与软件进行交互,以便为其分配运行所需的任何必要资源。
在操作系统中,进程是以页为单位加载到内存中的,按需分页是一种虚拟内存的管理方式。在使用请求分页的系统中,只有在尝试访问页面所在的磁盘并且该页面尚未在内存中时,也就发生了缺页异常,操作系统才会将磁盘页面复制到内存中。
什么是内核?在计算机中,内核是一个计算机程序,它是操作系统的核心,可以控制操作系统中所有的内容。内核通常是在boot loader装载程序之前加载的第一个程序。这里还需要了解一下什么是boot loader boot loader 又被称为引导加载程序,它是一个程序,能够将计算机的操作系统放入内存中。在电源通电或者计算机重启时,BIOS 会执行一些初始测试,然后将控制权转移到引导加载程序所在的主引导记录(MBR)。
什么是虚拟内存?虚拟内存是一种内存分配方案,是一项可以用来辅助内存分配的机制,我们知道,应用程序是按页装,载进内存中的。但并不是所有的页都会装载到内存中,计算机中的硬件和软件会将数据从RAM临时传输到磁盘中来弥补内存的不足!如果没有虚拟内存的话,一旦你将计算机内存填满后,计算机会对你说,呃,不,对不起,您无法再加载任何应用程序,请关闭另一个应用程序以加载新的应用程序。对于虚拟内存,计算机可以执行操作是查看内存中最近未使用过的区域然后将其复制到硬盘上显拟内存通过复制技术实现复制是自动进行的,你无法感知到它的存在。
什么是进程和进程表进程就是正在执行程序的实例,比如说Web程序就是一个进程,shell也是一个进程,文章编辑器typora 也是一个进程。 操作系统负责管理所有正在运行的进程,操作系统会为每个进程分配特定的时间来占用CPU,操作系统还会为每个进程分配特定的资源。 操作系统为了跟踪每个进程的活动状态.维护了一个进程表。在进程表的内部、列出了每个讲程的状态以及每个进程使用的资源等。
导致系统出现死锁的情况死锁的出现需要同时满足下面四个条件
- 互斥(Mutual Exclusion)∶一次只能有一个进程使用资源。如果另一个进程请求该资源,则必须延迟请求进程,直到释放该资源为止。
- 保持并等待(Hold and Wait)︰必须存在一个进程,该进程至少持有一个资源,并且正在等待获取其他进程当前所持有的资源。
- 无抢占(No Preemption)︰资源不能被抢占,也就是说,在进程完成其任务之后,只能由拥有它的进程自动释放资源。
- 循环等待(Circular Wait)︰必须存在一组{p0,p1,.....pn}的等待进程,使p0等待p1持有的资源,p1等待由p2持有的资源, pn-1正在等待由pn持有的资源,而pn 正在等待由p0持有的资源。
最优算法在当前页面中置换最后要访问的页面。不幸的是,没有办法来判定哪个页面是最后一个要访问的,因此实际上该算法不能使用。然而,它可以作为衡量其他算法的标准。 NRU算法根据R位和M位的状态将页面氛围四类。从编号最小的类别中随机选择一个页面。NRU算法易于实现,但是性能不是很好。存在更好的算法。 FIFO会跟踪页面加载进入内存中的顺序,并把页面放入一个链表中。有可能删除存在时间最长但是还在使用的页面,因此这个算法也不是一个很好的选择。 第二次机会算法是对FIFO的一个修改,它会在删除页面之前检查这个页面是否仍在使用。如果页面正在使用,就会进行保留。这个改进大大提高了性能。 时钟算法是第二次机会算法的另外一种实现形式,时钟算法和第二次算法的性能差不多,但是会花费更少的时间来执行算法。 LRU算法是一个非常优秀的算法,但是没有特殊的硬件(TLB)很难实现。如果没有硬件,就不能使用LRU算法。 NFU算法是一种近似于LRU的算法,它的性能不是非常好。 老化算法是一种更接近LRU算法的实现,并且可以更好的实现,因此是一个很好的选择最后两种算法都使用了工作集算法。工作集算法提供了合理的性能开销,但是它的实现比较复杂。WSClock是另外一种变体,它不仅能够提供良好的性能,而且可以高效地实现。
操作系统的内存管理机制了解吗?内存管理有哪几种方式?简单分为连续分配管理方式和非连续分配管理方式这两种。连续分配管理方式是指为一个用户程序分配一个连续的内存空间,常见的如 块式管理 。同样地,非连续分配管理方式允许一个程序使用的内存分布在离散或者说不相邻的内存中,常见的如页式管理 和 段式管理。
- 块式管理 : 远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。
- 页式管理 :把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。
- 段式管理 : 页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。 段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多 。但是,最重要的是段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
- 段页式管理机制 。段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存先分成若干段,每个段又分成若干页,也就是说 段页式管理机制 中段与段之间以及段的内部的都是离散的。
为了提高内存的空间性能,提出了多级页表的概念;但是提到空间性能是以浪费时间性能为基础的,因此为了补充损失的时间性能,提出了快表(即 TLB)的概念。 不论是快表还是多级页表实际上都利用到了程序的局部性原理。
在分页内存管理中,很重要的两点是:
- 虚拟地址到物理地址的转换要快。
- 解决虚拟地址空间大,页表也会很大的问题。
块表:为了解决虚拟地址到物理地址的转换速度,操作系统在 页表方案 基础之上引入了 快表 来加速虚拟地址到物理地址的转换。我们可以把快表理解为一种特殊的高速缓冲存储器(Cache),其中的内容是页表的一部分或者全部内容。作为页表的 Cache,它的作用与页表相似,但是提高了访问速率。由于采用页表做地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高指令执行速度。
使用快表之后的地址转换流程是这样的:
- 根据虚拟地址中的页号查快表;
- 如果该页在快表中,直接从快表中读取相应的物理地址;
- 如果该页不在快表中,就访问内存中的页表,再从页表中得到物理地址,同时将页表中的该映射表项添加到快表中;
- 当快表填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页。
看完了之后你会发现快表和我们平时经常在我们开发的系统使用的缓存(比如 Redis)很像,的确是这样的,操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。
多级页表:引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型场景,具体可以查看下面这篇文章
分页机制和分段机制有哪些共同点和区别呢?- 共同点 :
- 分页机制和分段机制都是为了提高内存利用率,较少内存碎片。
- 页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的。
- 区别 :
- 页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序。
- 分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要。
我们编程一般只有可能和逻辑地址打交道,比如在 C 语言中,指针里面存储的数值就可以理解成为内存里的一个地址,这个地址也就是我们说的逻辑地址,逻辑地址由操作系统决定。物理地址指的是真实物理内存中地址,更具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。
博文参考