操作系统这部分,等面完下次面试再结合别人的博客进一步整理学习
先针对面试题补一下空。
基本抄的guide大佬的笔记,用作我自己看,后面会补充学习
1、什么是操作系统?
1、操作系统(Operating System,OS)本质上是一个运行在计算机上的软件程序,用于管理计算机硬件与软件资源,是计算机的基石。
2、操作系统的存在屏蔽了硬件层的复杂性,可以对硬件资源进行管理、分配、调度。
3、操作系统向用户提供操作界面。
4、操作系统是一种介于硬件和用户之间的特殊的软件。
5、操作系统的内核是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理及应用程序的管理。内核是连接应用程序和硬件的桥梁,决定着系统的性能和稳定性。
2、什么是系统调用?
根据进程访问资源的特点,把进程在系统上的运行分为:
1、用户态(user mode):用户态运行的进程或者可以直接读取用户程序的数据。
2、系统态(Kernel mode):系统态运行的进程或程序几乎可以直接访问计算机任何资源,不受限制。
在运行的用户程序(用户态)中,凡是与系统态级别的资源有关的操作,都必须通过系统调用方式向操作系统提出服务要求,并由操作系统代为完成。
系统调用按功能大致分为:
1、设备管理:完成设备的请求或释放,及设备启动等功能。
2、文件管理:完成文件的读、写、创建及删除等功能。
3、进程控制:完成进程的创建、撤销、阻塞及唤醒等功能。
4、进程通信:完成进程间消息传递或信号传递等功能。
5、内存管理:完成内存的分配、回收及获取占用内存区大小及地址等功能。
3、进程和线程的区别?
线程是进程划分成的更小的运行单位。
线程和进程最⼤的不同在于基本上各进程是独立的,⽽各线程则不⼀定,因为同⼀进程中的线程极有可能会相互影响。
从另⼀⻆度来说,进程属于操作系统的范畴,主要是同⼀段时间内,可以同时执行⼀个以上的程序,⽽线程则是在同⼀程序内几乎同时执行⼀个以上的程序段。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。
1、进程是运行中的程序,线程是进程的内部的一个执行序列
2、进程是资源分配的单元,线程是执行单元
3、进程间切换代价大,线程间切换代价小
4、进程拥有资源多,线程拥有资源少
5、多个线程共享进程的资源
4、进程有哪几种状态?
一般把进程大致分为5种状态:
1、创建状态(new):进程正被创建,尚未到就绪状态。
2、就绪状态(ready):进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。
3、运行状态(running):进程正在处理器上运行(单核CPU任意时刻下只有一个进程处于运行状态)。
4、等待状态(waiting):进程正在等待某一事件而暂停运行,如等待某资源可用或等待IO操作完成。即使处理器空闲,进程也不能运行。
5、结束状态(terminated):进程正在从系统中消失。可能是进程正常结束或者其它原因中断退出运行。
5、进程间的通信方式?
1、匿名管道(Pipes):用于具有亲缘关系的父子进程或者兄弟进程间的通信。
2、有名管道(Names Pipes):有名管道严格遵循先进先出(FIFO),克服了匿名管道只能亲缘进程通信的缺点。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
3、信号(Signal):信号是一种较复杂的通信方式,用于通知接收进程某个事件已经发生。
4、消息队列(Message Queuing):消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。匿名管道存放于内存中的文件,有名管道存在于实际的磁盘介质或文件系统,消息队列存放在内核中,只有在内核重启或显式地删除一个消息队列时才会被删除。消息队列可以实现消息的随机查询,消息不一定先进先出次序读取,也可以按消息的类型读取。消息队列克服了信号承载信息量少、管道只能承载无格式字节流及缓冲区大小受限等缺陷。
5、信号量(Semaphores):信号量是一个计数器,用于多线程对共享数据的访问,完成进程间同步。可以解决与同步相关的问题并避免竞争条件。
6、共享内存(Shared memory):多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠互斥锁、信号量等同步操作。最有效的进程间通信方式。
7、套接字(Sockets):主要用于客户端和服务器之间通过网络进行通信。套接字是支持TCP/IP 网络通信的基本操作单元,可以看作不同主机之间的进程进行双向通信的端点,用套接字中的相关函数完成通信过程。
6、线程间的同步方式?
当两个或多个共享关键资源的线程并发执行时,需要同步线程以避免关键资源使用冲突。
1、临界区(Critical Section):通过对多线程的串行化访问公共资源或一段代码,速度快,适合控制数据访问。
在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其它试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。它并不是核心对象,不是属于操作系统维护的,而是属于进程维护的。
2、互斥对象(Mutex):互斥量是内核对象。采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。互斥对象只有一个,可以保证公共资源不会被多个线程同时访问。Java中synchronized关键字和Lock都是这种机制。
3、信号量(Semaphores):信号量是内核对象。允许多个线程在同一时刻访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
4、事件(Event):事件也是内核对象。通过通知操作的方式保持多线程同步,实现多线程优先级的比较操作。
7、进程的调度算法?
为了确定首先执行哪个进程以及最后执行哪个进程实现最大的CPU利用率。
1、先到先服务(FCFS)调度算法:从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某时间而被阻塞放弃占用CPU时再重新调度。
2、短作业优先(SJF)调度算法:从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用CPU时再重新调度。
3、时间片轮转调度算法:时间片轮转调度是一种最古老、最简单、最公平且使用最广的算法,又称RR(Round Robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
4、多级反馈队列调度算法:既能使高优先级的作业得到响应又能使短作业迅速完成,被公认的一种较好的进程调度算法。
5、优先级调度算法:为每个流程分配优先级,首先执行具有最高优先级的进程。具有相同优先级的进程以FCFS方式执行。可以根据内存要求、时间要求或其它资源要求确定优先级。
8、操作系统的内存管理机制了解嘛?内存管理有哪几种方式?
简单分为连续分配管理方式和非连续分配管理方式两种。
连续分配管理方式指为一个用户程序分配一个连续的内存空间,常见的如块式管理。
非连续分配管理方式允许一个程序使用的内存分布在离散或者说不相邻的内存中,常见的如页式管理、段式管理。
**1、块式管理:**将内存分成几个固定大小的块,每个块中只包含一个进程。
如果程序运行需要内存的话,操作系统就分配给它⼀块,如果程序运行只需要很小的空间的话,分配的这块内存很⼤⼀部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎⽚。
**2、页式管理:**把内存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。
**3、段式管理:**段式管理将主存分成一段段的,每一段的空间又要比一页的空间小很多。且每段定义一组逻辑信息(主程序段MAIN、子程序段X、数据段D及栈段S)。段式管理通过段表对应逻辑地址和物理地址。
**4、段页式管理:**结合了段式管理和页式管理的优点。把主存先分成若干段,每个段又分成若干页,段页式管理机制中段与段之间及段的内部都是离散的。
9、分页机制和分段机制的共同点和区别?
共同点:
1、都是为了提高内存利用率,减少内存碎片。
2、页和段都是离散存储的,二者都是离散分配内存的方式。但是,每个页和段的内存是连续的。
区别:
1、页的大小是固定的,由操作系统决定;而段的大小不固定,取决于当前运行的程序。
2、分页仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单元。
10、什么是快表和多级页表?
为了提高内存的空间利用效率,页应该小,页小了页表就大了;页表很大,页表的放置是问题。
尝试一:只存放使用到的页,但是页表中页号不连续,查询不方便。
既要页表中页号连续又要让页表占用内存少,类似书的章目录和节目录,提出多级页表。
多级页表以时间换空间,时间效率严重降低,在CPU与内存访问之间加一层快表TLB(Translation Lookasider Buffer)—高速缓冲存储器,解决了虚拟地址到物理地址的转换速度。
TLB是一组寄存器,用来存放最近使用过的页对应的页框号;这样如果CPU需要访问某一页首先在TLB里面找,如果TLB里面有就不用访问内存了,因为TLB是寄存器,cpu访问寄存器的速度远大于对内存的访问速度。
为了提高内存的空间性能,提出了多级页表的概念;但是以浪费时间性能换取空间性能,为了补充损失的时间性能,提出了快表的概念(TLB),二者都利用到了程序的局部性原理。
11、CPU寻址了解吗?为什么需要虚拟地址空间?
现代处理器使用一种称为虚拟寻址的寻址方式。
使用虚拟寻址,CPU需要将虚拟地址翻译成物理地址,才能访问到真实的物理内存。
实际上CPU通过内存管理单元MMU完成地址转换。
如果没有虚拟地址空间,程序直接访问和操作物理内存,存在问题:
1、用户程序可以访问任意内存,寻址内存的每个字节,容易破坏操作系统。
2、难以同时运行多个程序。
通过虚拟地址访问内存的优势:
1、程序可以使用一系列相邻的虚拟内存地址访问物理内存中不相邻的大内存缓冲区。
2、程序可以使⽤⼀系列虚拟地址来访问大于可用物理内存的内存缓冲区。
3、不同进程使⽤的虚拟地址彼此隔离。⼀个进程中的代码⽆法更改正在由另⼀进程或操作系统使用的物理内存。
12、什么是虚拟内存?
虚拟内存是计算机系统内存管理的一种技术。
虚拟内存为每个进程提供了一个一致的、私有的地址空间,使得应用程序认为它拥有连续的可用的内存(⼀个连续完整的地址空间),⽽实际上,它通常是被分隔成多个物理内存碎⽚,还有部分暂时存储在外部磁盘存储器上,在需要时进⾏数据交换。
这样会更加有效地管理内存并减少出错。
13、局部性原理?
局部性原理是虚拟内存技术的基础,正是因为程序运⾏具有局部性原理,才可以只装入部分程序到内存就开始运⾏。
程序执行的局部性规律:在某个较短的时间段内,程序执行局限于某一小部分,程序访问的存储空间也局限于某个区域。
体现在:
1、时间局部性:如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产⽣时间局部性的典型原因,是由于在程序中存在着⼤量的循环操作。
**2、空间局部性:**一旦程序访问了某存储单元,在不久之后,其附近的存储单元也将被访问,即程序在⼀段时间内所访问的地址,可能集中在⼀定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也⼀般是以向量、数组、表等形式簇聚存储的。
时间局部性是通过将近来使⽤的指令和数据保存到⾼速缓存存储器中,并使⽤⾼速缓存的层次结构实现。
空间局部性通常是使⽤较大的高速缓存,并将预取机制集成到⾼速缓存控制逻辑中实现。
虚拟内存技术实际上就是建⽴了 “内存⼀外存”的两级存储器的结构,利⽤局部性原理实现髙速缓存。
14、页面置换算法:
1、OPT 页面置换算法(最佳页面置换算法):最佳(Optimal, OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于⼈们⽬前⽆法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。⼀般作为衡量其他置换算法的⽅法。
2、FIFO(First In First Out)页面置换算法(先进先出页面置换算法) : 总是淘汰最先进⼊内存的页面,即选择在内存中驻留时间最久的页面进⾏淘汰。
3、LRU (Least Currently Used)页面置换算法(最近最久未使用页面置换算法) : LRU算法赋予每个页面⼀个访问字段,⽤来记录⼀个页面自上次被访问以来所经历的时间 T,当须淘汰⼀个页面时,选择现有页面中其 T 值最⼤的,即最近最久未使⽤的页面予以淘汰。
3、LFU (Least Frequently Used)页面置换算法(最少使⽤页面置换算法) : 该置换算法选择在之前时期使⽤最少的页面作为淘汰页。