关于操作系统可能考察的知识点
操作系统基本原理
什么是操作系统?
操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和它软件方便的接口和环境,是计算机系统中最基本的系统软件,总结一下就是:
- 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基⽯,是计算机系统资源的总管理者:处理器管理【进程管理】、存储器管理【内存管理】、文件管理、设备管理【IO管理】
- 操作系统本质上是运⾏在计算机上的软件程序 ;
- 操作系统为⽤户提供⼀个与系统交互的操作界⾯ ,向上层提供方便易用的服务
- 操作系统分内核与外壳(我们可以把外壳理解成围绕着内核的应⽤程序,⽽内核就是能操作硬件的程序)
内核负责管理系统的进程、内存、设备驱动程序、⽂件和⽹络系统等等,决定着系统的性能和稳定性。是连接应⽤程序和硬件的桥梁。 内核就是操作系统背后⿊盒的核⼼
操作系统的四大特性
操作系统的四大特性是:并发、共享、虚拟、异步
串行、并发和并行的区别是什么
并发是指两个或多个事件在同一时间间隔内发生,在多道程序环境下,一段时间内宏观上有多个程序在同时执行,而在同一时刻,单处理器环境下实际上只有一个程序在执行,故微观上这些程序还是在分时的交替进行。操作系统的并发是通过分时得以实现的,和串行以及并行的概念区别
- 串行:顺序做不同事的能力:先洗衣服,洗完后做饭。弱鸡。
- 并发:交替做不同事的能力:一会儿洗衣服,一会儿做饭,交替执行,但快如闪电。洗衣服的是一个(cpu)做饭的是一个(cpu),所以多核的情况下会非常快,在同一个时间段内每个cpu各司其职团战。并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
- 并行:同时做不同事的能力:左手洗衣服右手做饭,在同一时刻同时做两件事。单兵王。并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
核心区别:并发关注的是资源充分利用(也就是不让cpu闲下来),并行关注的是一个任务被分解给多个执行者同时做,缩短这个任务的完成时间(也就是尽快做完这件事),操作系统的并发性是指计算机系统中同时存在多个运行着的程序,因此它具有处理和调度多个程序同时执行的能力。在操作系统中,引入进程的目的是使程序能并发执行。并行则是同时间同时刻有几个程序同时运行,有几核就就几个程序在并行。单核CPU只能并发多个程序,多核CPU可以并发也可以并行【4核CPU可以并行4个程序,程序大于核心时就需要用到并发性】
什么是用户态和核心态
根据进程访问资源的特点,我们可以把进程在系统上的运⾏分为两个级别:
- ⽤户态(user mode) : ⽤户态运⾏的进程或可以直接读取⽤户程序的数据。
- 核心态(kernel mode):可以简单的理解核心态运⾏的进程或程序⼏乎可以访问计算机的任何资源,不受限制
用户态和核心态的调用切换是需要CPU切换的,是会消耗资源的
什么是系统调用,系统调用流程
我们运⾏的程序基本都是运⾏在⽤户态,如果我们调⽤操作系统提供的核心态级别的⼦功能,就需要系统调⽤了
在我们运⾏的⽤户程序中,凡是与共享资源有关的操作(如⽂件管理、进程控制、内存管理、文件管理等),都必须通过系统调⽤⽅式向操作系统提出服务请求,并由操作系统代为完成。这些系统调⽤按功能⼤致可分为如下⼏类:
- 设备管理。完成设备的请求或释放,以及设备启动等功能。
- ⽂件管理。完成⽂件的读、写、创建及删除等功能。
- 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
- 进程通信。完成进程之间的消息传递或信号传递等功能。
- 内存管理。完成内存的分配、回收以及获取作业占⽤内存区⼤⼩及地址等功能。
这样可以保证系统的稳定性和安全性。系统调用有以下流程:
- 执行传参指令,将系统调用需要参数传递,发现特权指令
- 执行陷入指令,引发内中断,因此转入内中断相应处理程序,也就是系统调用入口
- CPU切换到核心态
- 依据参数执行系统调用,执行特权指令,执行完成
- CPU转回用户态
系统调用结束,可以看的出,这里用到了内中断。
操作系统进程管理
进程和线程的区别是什么
进程和线程的主要概念如下:
- 进程,每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。进程是操作系统进行资源分配的单位,多进程是指操作系统能同时运行多个任务(程序)。
- 线程,同一类线程共享代码和数据空间【堆和方法区】,每个线程有独立的运行栈【本地方法栈、虚拟机栈】和程序计数器(PC),线程切换开销小。进程中独立操作的执行单元。多线程是指在同一程序中有多个顺序流在并发执行
- 在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
详细区别和相同点归纳如下
- 在状态变化上:线程和进程一样分为五个阶段,创建、就绪、运行、阻塞、终止。
- 地址空间和其它资源:进程间相互独立,同一进程的各线程间共享,某进程内的线程在其它进程不可见。
- 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
- 在多线程操作系统中,进程不是一个可执行的实体,只是作为分配资源的基本单位,线程作为独立运行和独立调度的基本单位
线程和进程最⼤的不同在于基本上各进程是独⽴的,⽽各线程则不⼀定,因为同⼀进程中的线程极有可能会相互影响
进程有哪几种状态,状态如何转换
进程有五种状态:创建、就绪、运行、阻塞、终止。
- 创建状态(new) :进程正在被创建,尚未到就绪状态。
- 就绪状态(ready) :进程已处于准备运⾏状态,即进程获得了除了处理器之外的⼀切所需资源,⼀旦得到处理器资源(处理器分配的时间⽚)即可运⾏。
- 运⾏状态(running) :进程正在处理器上上运⾏(单核 CPU 下任意时刻只有⼀个进程处于运⾏状态)。
- 阻塞状态(waiting) :⼜称为等待状态,进程正在等待某⼀事件⽽暂停运⾏如等待某资源为可⽤或等待 IO 操作完成。即使处理器空闲,该进程也不能运⾏。
- 结束状态(terminated) :进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运⾏
进程间的通信方式
进程间通信的IPC方式分为如下7种:
- 管道/匿名管道(Pipes) :⽤于具有亲缘关系的⽗⼦进程间或者兄弟进程之间的通信。
- 有名管道(Names Pipes) : 匿名管道由于没有名字,只能⽤于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出FIFO。有名管道以磁盘⽂件的⽅式存在,可以实现本机任意两个进程通信。
- 信号(Signal) :信号是⼀种⽐较复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣
- 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(⽆名管道:只存在于内存中的⽂件;有名管道:存在于实际的磁盘介质或者⽂件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除⼀个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不⼀定要以先进先出的次序读取,也可以按消息的类型读取.⽐ FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载⽆格式字节流以及缓冲区大小受限等缺点
- 信号量(Semaphores) :信号量是⼀个计数器,⽤于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信⽅式主要⽤于解决与同步相关的问题并避免竞争条件。
- 共享内存(Shared memory) :使得多个进程可以访问同⼀块内存空间,不同进程可以及时看到对⽅进程中对共享内存中数据的更新。这种⽅式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有⽤的进程间通信⽅式。
- 套接字(Sockets) : 此⽅法主要⽤于在客户端和服务器之间通过⽹络进⾏通信。套接字是⽀持TCP/IP 的⽹络通信的基本操作单元,可以看做是不同主机之间的进程进⾏双向通信的端点,简单的说就是通信的两⽅的⼀种约定,⽤套接字中的相关函数来完成通信过程
操作系统中进程的调度算法有哪些
为了确定⾸先执⾏哪个进程以及最后执⾏哪个进程以实现最⼤ CPU 利⽤率,计算机科学家已经定义了⼀些算法,它们是:
- 先到先服务(FCFS)调度算法 : 从就绪队列中选择⼀个最先进⼊该队列的进程为之分配资源,使它⽴即执⾏并⼀直执⾏到完成或发⽣某事件⽽被阻塞放弃占⽤ CPU 时再重新调度。
- 短作业优先(SJF)的调度算法 : 从就绪队列中选出⼀个估计运⾏时间最短的进程为之分配资源,使它⽴即执⾏并⼀直执⾏到完成或发⽣某事件⽽被阻塞放弃占⽤ CPU 时再重新调度。
- 时间⽚轮转调度算法 : 时间⽚轮转调度是⼀种最古⽼,最简单,最公平且使⽤最⼴的算法,⼜称 RR(Round robin)调度。每个进程被分配⼀个时间段,称作它的时间⽚,即该进程允许运⾏的时间。
多级反馈队列调度算法 :前⾯介绍的⼏种进程调度的算法都有⼀定的局限性。如短进程优先的调度算法,仅照顾了短进程⽽忽略了⻓进程 。多级反馈队列调度算法既能使⾼优先级的作业得到响应⼜能使短作业(进程)迅速完成。因⽽它是⽬前被公认的⼀种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。
优先级调度 : 为每个流程分配优先级,⾸先执⾏具有最⾼优先级的进程,依此类推。具有相同优先级的进程以 FCFS ⽅式执⾏。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
线程间的同步方式有哪些
线程同步是两个或多个共享关键资源的线程的并发执⾏。应该同步线程以避免关键的资源使⽤冲突。操作系统⼀般有下⾯三种线程同步的⽅式:
- 互斥量(Mutex):采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。⽐如 Java 中的synchronized 关键词和各种 Lock 都是这种机制。
- 信号量(Semphares) :它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量、
- 事件(Event) :Wait/Notify:通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级的⽐较操作
操作系统存储管理
分⻚机制和分段机制有哪些共同点和区别呢?
分⻚机制和分段机制的共同点 :
- 分⻚机制和分段机制都是为了提⾼内存利⽤率,减少内存碎⽚。
- ⻚和段都是离散存储的,所以两者都是离散分配内存的⽅式。但是,每个⻚和段中的内存是连续的。
分⻚机制和分段机制的区别:
- ⻚的⼤⼩是固定的,由操作系统决定;⽽段的⼤⼩不固定,取决于我们当前运⾏的程序。
- 分⻚仅仅是为了满⾜操作系统内存管理的需求,⽽段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满⾜⽤户的需要。