操作系统杂项(八)

目录

一、简述互斥锁的机制,互斥锁与读写的区别

1、互斥锁机制

2、互斥锁和读写锁

二、简述信号量及其作用

1、概念

2、原理

3、作用

三、简述进程、线程的中断切换过程

1、进程上下文切换

2、线程上下文切换

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

1、互斥锁

2、自旋锁

五、简述线程的状态及其切换方式

1、创建状态

2、就绪状态

3、运行状态

4、阻塞状态

5、终止状态

六、简述多线程和单线程的区别,多线程编程、多线程加锁注意事项

1、区别

2、多线程编程注意事项

3、多线程加锁注意事项


一、简述互斥锁的机制,互斥锁与读写的区别

1、互斥锁机制

        mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。

2、互斥锁和读写锁

        (1)读写锁区分读者和写者,而互斥锁不区分;

        (2)互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写者,但是允许多个读者同时读对象。

        互斥锁其实就是一个bool变量,为true时表示锁可获取,为false时表示已上锁。这里说的是互斥锁,其实是泛指linux中所有的锁机制。

        我们采用互斥锁保护临界区,从而防止竞争条件。也就是说,一个线程在进入临界区时应得到锁,在退出临界区时释放锁。函数acquire()获取锁,而函数release()释放锁。如下所示:

do{
    获得锁
        关键区
    释放区
        剩余区
}while(true);

        每个互斥锁有一个布尔变量avaliable,它的值表示锁是否可用。如果锁是可用的,那么调用acquire()会成功,并且锁不再可用。当一个线程试图获取不可用的锁时,它会阻塞,直到锁被释放。按如下定义acquire():

acquire(){
    while (!avaliable);
    /*busy wait*/
    available = false;
}

        按如下定义release():

release(){
    avaliable = true;
}

二、简述信号量及其作用

1、概念

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

2、原理

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

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

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

3、作用

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

三、简述进程、线程的中断切换过程

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

1、进程上下文切换

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

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

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

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

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

        切换页目录以使用新的地址空间。切换内核栈和硬件上下文(包括分配的内存,数据段,堆栈段等)

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

2、线程上下文切换

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

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

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

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

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

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

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

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

1、互斥锁

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

        (1)临界区有IO操作;

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

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

        (4)单核处理器。

2、自旋锁

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

五、简述线程的状态及其切换方式

        类似进程,共有五种状态:新建就绪运行阻塞终止

        转换方式如下:

1、创建状态

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

2、就绪状态

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

3、运行状态

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

4、阻塞状态

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

5、终止状态

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

相互转换如图所示:

六、简述多线程和单线程的区别,多线程编程、多线程加锁注意事项

1、区别

        (1)多线程从属于一个进程,单线程也从属于一个进程;一个线程挂掉都会导致从属的进程挂掉;

        (2)一个进程里有多个线程,可以并发执行多个任务;一个进程里只有一个线程,就只能执行一个任务;

        (3)多线程并发执行多任务,需要切换内核栈与硬件上下文,有切换的开销;单线程不需要切换,没有切换开销;

        (4)多线程并发执行多任务,需要考虑同步的问题;单线程不需要考虑同步的问题。

2、多线程编程注意事项

        多线程编程需要考虑同步的问题。线程间的同步方式包括互斥锁信号量条件变量读写锁

3、多线程加锁注意事项

        主要需要注意死锁的问题。破坏死锁的必要条件从而避免死锁。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿何试Bug个踌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值