Linux你必须知道的小知识-15

63 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

2.44 说说什么是信号量,有什么作用?

参考回答

  1. 概念:信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

  2. 原理:由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),具体的行为如下:

    (1)P(sv)操作:如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行(信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位)。

    (2)V(sv)操作:如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1(若此时信号量的值为0,则进程进入挂起状态,直到信号量的值大于0,若进程被唤醒则返回至第一步)。

  3. 作用:用于多进程对共享数据对象的读取,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

2.45 进程、线程的中断切换的过程是怎样的?

参考回答

上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换。

  1. 进程上下文切换

    (1)保护被中断进程的处理器现场信息

    (2)修改被中断进程的进程控制块有关信息,如进程状态等

    (3)把被中断进程的进程控制块加入有关队列

    (4)选择下一个占有处理器运行的进程

    (5)根据被选中进程设置操作系统用到的地址转换和存储保护信息

            切换页目录以使用新的地址空间

            切换内核栈和硬件上下文(包括分配的内存,数据段,堆栈段等)

    (6)根据被选中进程恢复处理器现场

  2. 线程上下文切换

    (1)保护被中断线程的处理器现场信息

    (2)修改被中断线程的线程控制块有关信息,如线程状态等

    (3)把被中断线程的线程控制块加入有关队列

    (4)选择下一个占有处理器运行的线程

    (5)根据被选中线程设置操作系统用到的存储保护信息

            切换内核栈和硬件上下文(切换堆栈,以及各寄存器)

    (6)根据被选中线程恢复处理器现场

2.46 简述自旋锁和互斥锁的使用场景

参考回答

  1. 互斥锁用于临界区持锁时间比较长的操作,比如下面这些情况都可以考虑

(1)临界区有IO操作

(2)临界区代码复杂或者循环量大

(3)临界区竞争非常激烈

(4)单核处理器

  1. 自旋锁就主要用在临界区持锁时间非常短且CPU资源不紧张的情况下。

2.47 请你说说线程有哪些状态,相互之间怎么转换?

参考回答

类似进程,有以下五种状态:

  1. 新建状态(New)
  2. 就绪状态(Runnable)
  3. 运行状态(Running)
  4. 阻塞状态(Blocked)
  5. 死亡状态(Dead)

转换方式如下

创建状态 一个应用程序从系统上启动,首先就是进入创建状态,获取系统资源。

就绪状态 在创建状态完成之后,线程已经准备好,处于就绪状态,但是还未获得处理器资源,无法运行。

运行状态 获取处理器资源,被系统调度,当具有时间片开始进入运行状态。如果线程的时间片用完了就进入就绪状态

阻塞状态 在运行状态期间,如果进行了阻塞的操作,如耗时的I/O操作,此时线程暂时无法操作就进入到了阻塞状态,在这些操作完成后就进入就绪状态。等待再次获取处理器资源,被系统调度,当具有时间片就进入运行状态

终止状态 线程结束或者被系统终止,进入终止状态

相互转换如图: