【你好面试官】006 操作系统之并发机制详解

微信公众号:你好面试官
这里没有碎片化的知识,只有完整的知识体系。
专注于系统全面的面试题目讲解,问题或建议,请公众号留言;
如果你觉得文章对你有帮助,欢迎关注、分享、赞赏

前言

二蛋几天没有收到面试通知,以为自己已经凉凉,没想到此时再次接到了面试邀请,于是在一个风和日丽的下午,二蛋如约坐在了面试官对面,开始了今天的面试。

面试官:小伙子,咱也不用继续介绍了,你也来了几次了,这次咱就开门见山吧。

正文

UNIX进程间通信有哪些机制?

通信方式有:管道消息共享内存信号量信号
这里主要介绍前三种:

  • 管道
    UNIX管道是一个环形缓冲区,它允许两个进程以生产者/消费者的模型进行通信,因此是一个先进先出的队列,由一个进程写,另一个进程读。
    管道在创建时获得-一个固定大小的字节数。当一个进程试图往管道中写时,如果有足够的空间,则立即执行写请求;否则该进程被阻塞。类似地,一个读进程试图读取的字节数多于当前管道中的字节数时,它也被阻塞;否则立即执行读请求。操作系统强制实施互斥,即一次只能有一个进程可以访问管道。

  • 消息
    消息是有类型的一段文本。每个进程都有一个与之相关联的消息队列,其功能类似于信箱。
    消息发送者指定每个发送的消息的类型,类型可被接收者用做选择的依据。接收者可按先进先出的顺序接收信息,或按类型接收信息。当进程试图给一-个满队列发送信息时,它会被阻塞;当进程试图从一个空队列读取消息时也会被阻塞;若一个进程试图读取某-特定类型的消息,但由于现在还没有这种类型的消息而失败时,则该进程不会被阻塞。

  • 共享内存
    共享内存是UNIX所提供的进程间通信手段中速度最快的一种。这是虚存中由多个进程共享的一个公共内存块。进程读写共享内存所用的机器指令,与读写虛存空间的其他部分所用的指令相同。每个进程有一个只读或读写的权限。互斥约束不属于共享内存机制的一部分,但必须由使用共享内存的进程提供。

介绍下Linux的原子操作

Linux提供了一组操作来保证对变量的原子操作。这些操作可用来避免简单的竞争条件。原子操作执行时不会被打断或千扰。在单处理器上,线程一旦启动原子操作,则从操作开始到结束的这段时间内,不能中断线程。此外,在多处理器系统中,原子操作所针对的变量被锁住,以免被其他进程访问,直到原子操作执行完毕。

介绍一下自旋锁

在Linux中保护临界区的常用技术是自旋锁(spinlock)。 在同一时刻,只有一个线程能获得自旋锁。其他任何试图获得自旋锁的线程将一直进行尝试(即自旋),直到获得了该锁。本质上,自旋锁建立在内存区中的一个整数上,任何线程进入临界区前都必须检查该整数。若该值为0,则线程将该值设置为1,然后进入临界区。若该值非0,则该线程继续检查该值,直到它为0。自旋锁很容易实现,但有一个缺点,即锁外面的线程会以忙等待的方式继续执行。因此,自旋锁在获得锁所需的等待时间较短时,即等待时间少于两次上下文切换时间时,会很高效。

自旋锁在单处理器系统和多处理器系统中的实现是不同的。对于单处理器系统,必须考虑如下因素:是否关闭内核抢占(kernel preemption)功能。若关闭内核抢占功能,此时线程在内核模式下的运行不会被打断,则锁会因为没有必要使用而在编译时删除。若启用内核抢占,即允许打断内核模式线程,则自旋锁仍会在编译时删除(即不用测试自旋锁内存区是否发生变化),并简单地实现为启用中断/禁用中断。在多处理器的情况下,自旋锁的实现(测试自旋锁的内存区的变化)会编译到内核代码中。在程序中使用自旋锁机制时,可不考虑是在单处理器上运行还是在多处理器上运行。

说一下什么是内存屏障?

在有些体系结构中,编译器或处理器硬件为了优化性能,可能会对源代码中的内存访问重新排序。重新排序的目的是优化对处理器指令流水线的使用。重新排序的算法包含相应的检查,以便保证不违反数据依赖性(data dependence)。例如,代码

1a=1;
2b=1;

可被重新排序,以便内存地址b在内存地址a更新之前更新。

下面情况:

1a=1;
2b=a;

不能重新排序。即使如此,在某些情况下,读操作和写操作以指定的顺序执行也相当重要,因为这些信息会被其他线程或硬件设备使用。

内存屏障就是在某一段代码前后插入特殊的机器指令,保证代码的执行顺序不变,避免因为优化改变顺序导致最终结果不符合预期。

面试官:嗯,今天的面试就到这里吧,回去好好准备下一次面试吧。



这里没有碎片化的知识,只有完整的知识体系。
专注于系统全面的面试题目讲解,问题或建议,请公众号留言;
如果你觉得文章对你有帮助,欢迎 关注、分享、赞赏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值