1、系统调用
👨💻**:你详细的介绍一下系统调用**
在了解系统调用之前,我们需要知道用户态和核心态这两个概念:
- 用户态: 用户态运行的进程可以直接读取用户程序的数据。
- 系统态:可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。
- 系统调用:就是其可以切换应用程序的运行级别。也就是说在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
2、进程和线程的区别
👨💻**:说一下进程和线程的区别呗**
- 根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
- 包含关系:一个进程最少由一条线程组成。
- 切换:线程上下文切换比进程上下文切换要快得多。
- 拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。
- 所处环境区别:在操作系统中能同时运行多个进程(程序);而在同一个进程中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)。
3、进程有哪几种状态?
👨💻**:那你知道进程有哪几种状态吗?**
- 创建状态 :进程正在被创建,尚未到就绪状态。
- 就绪状态:进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。
- 运行状态 :进程正在处理器上上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。
- 阻塞状态:又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操作完成。即使处理器空闲,该进程也不能运行。
- 结束状态:进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行。
4、进程间的通信方式有哪些?
👨💻**:那你说一下进程间的通信方式有哪些?**
- 管道/匿名管道 :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
- 有名管道 : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(FIFO)。可以实现本机任意两个进程通信。
- 信号 :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
- 消息队列:消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。
- 信号量 :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
- 共享内存 :多个进程可以访问的一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
- 套接字 : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
5、线程间的同步的方式
👨💻**:那线程间的同步的方式有哪些?**
- 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
- 信号量(Semphares) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 事件 :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
6、进程的调度算法
👨💻**:那你了解过进程的调度算法吗,说一说有哪些?**
- 先来先服务调度算法
- 短作业优先调度算法
- 时间片轮转调度算法
- 多级反馈队列调度算法
- 优先级调度算法
7、死锁是什么, 产生死锁的四个必要条件,如何处理死锁问题?
👨💻**:那你说一下什么是死锁, 产生死锁的四个必要条件,如何处理死锁问题?**
1)什么是死锁
在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。
2)产生死锁的四个必要条件
- 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。
- 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
- 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
- 循环等待:有一组等待进程
{P0, P1,..., Pn}
, P0
等待的资源被 P1
占有,P1
等待的资源被 P2
占有,…,Pn-1
等待的资源被 Pn
占有,Pn
等待的资源被 P0
占有。
3)死锁的预防
- 破坏互斥条件:使得资源是可以同时访问的,这是种简单的方法,磁盘就可以用这种方法管理,但是我们要知道,有很多资源 往往是不能同时访问的 ,所以这种做法在大多数的场合是行不通的。
- 静态分配策略:破除 “占有并等待” 条件,就是指一个进程必须在执行前就申请到它所需要的全部资源,并且知道它所要的资源都得到满足之后才开始执行。进程要么占有所有的资源然后开始执行,要么不占有资源,不会出现占有一些资源等待一些资源的情况。
- 破坏非抢占条件 :也就是说可以采用 剥夺式调度算法,但剥夺式调度方法目前一般仅适用于 主存资源 和 处理器资源 的分配,并不适用于所有的资源,会导致 资源利用率下降。
- 层次分配策略:破除 “循环等待” 条件,实行资源有序分配策略,对所有资源排序编号,按照顺序获取资源,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
4)死锁的解除
- 强制性地从系统中撤销一个或多个死锁的进程以断开循环等待链。
- 强制性抢占死锁进程正在争取的资源以解除死锁。
8、操作系统的内存管理机制了解过吗?有哪些?
👨💻**:操作系统的内存管理机制了解过吗?有哪些?**
- 连续分配管理方式:块式管理
- 非连续分配管理方式:页式管理、段式管理、段页式管理。
- 块式管理 : 远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。
- 页式管理 :把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。
- 段式管理 : 页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。 段式管理把主存分为一段段的,段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
- 段页式管理机制:段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存先分成若干段,每个段又分成若干页,也就是说 段页式管理机制 中段与段之间以及段的内部的都是离散的。
9、分页机制和分段机制的共同点和区别
👨💻**:简要说一下分页机制和分段机制的共同点和区别**
1)共同点
- 分页机制和分段机制都是为了提高内存利用率,减少内存碎片。
- 页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的。
2)区别
- 页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序。
- 分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要。
10、逻辑(虚拟)地址和物理地址
👨💻**:你来分别解释一下逻辑(虚拟)地址和物理地址这两个概念吧**
- 逻辑地址:在 C 语言中,指针里面存储的数值就可以理解成为内存里的一个地址,这个地址也就是我们说的逻辑地址,逻辑地址由操作系统决定。
- 物理地址:指的是真实物理内存中地址,更具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址。
11、CPU 寻址了解吗?为什么需要虚拟地址空间?
👨💻**:CPU 寻址了解吗?为什么需要虚拟地址空间?**
1)CPU寻址
现代处理器使用的是一种称为 虚拟寻址 的寻址方式。使用虚拟寻址,CPU 需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有一个被称为 内存管理单元(MMU) 的硬件。
2)为什么需要虚拟地址空间
- 可能对操作系统造成伤害。
- 同时可能会给运行多个程序造成困难。
12、什么是虚拟内存?
👨💻**:你来解释一下虚拟内存这个概念吧**
- 虚拟内存:
让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存
。虚拟内存使用部分加载的技术,让一个进程或者资源的某些页面加载进内存,从而能够加载更多的进程,甚至能加载比内存大的进程,这样看起来好像内存变大了,这部分内存其实包含了磁盘或者硬盘,并且就叫做虚拟内存。
13、虚拟内存的实现方式
👨💻**:你知道虚拟内存的实现方式有哪些吗?**
- 请求分页存储管理。
- 请求分段存储管理。
- 请求段页式存储管理。
14、页面置换算法
👨💻**:常见的页面置换算法有哪些吗?**
- OPT 页面置换算法(最佳页面置换算法) :最佳置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。由于种种原因,该算法无法实现。。
- FIFO页面置换算法(先进先出页面置换算法) : 总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。
- LRU 页面置换算法(最近最久未使用页面置换算法) :LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。
- LFU 页面置换算法(最少使用页面置换算法) : 该置换算法选择在之前时期使用最少的页面作为淘汰页。
15、讲一讲操作系统的I/O模型?什么是I/O多路复用?
👨💻**:讲一讲操作系统的I/O模型?什么是I/O多路复用?**
I/O请求有两个阶段:
- 等待资源阶段:I/O请求一般需要请求特殊的资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源。
- 使用资源阶段:真正进行数据接收和发送。
在等待数据阶段,I/O分为 阻塞I/O 模型 和 非阻塞I/O 模型:
- 阻塞I/O 模型: 资源不可用时,I/O请求一直阻塞,直到反馈结果(有数据或超时)。
- 非阻塞I/O 模型:资源不可用时,I/O请求不会被阻塞,直接返回数据标识资源不可用。但是进程会不停的去轮询检测资源是否可用。
在使用资源阶段,I/O分为 同步I/O 模型 和 异步I/O 模型。
- 同步I/O 模型:应用阻塞在发送或接收数据的状态,直到数据成功传输或返回失败结果。
- 异步I/O 模型:应用发送或接收数据后立刻返回,数据写入操作系统缓存,由操作系统完成数据发送或接收,并返回成功或失败的信息给应用。
I/O多路复用(I/O复用模型):
- I/O 多路复用可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写。
正因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个I/O操作,所以才叫做多路复用。