1、Linux 中主要有哪几种内核锁?它们各自的特点和适用场景是什么?
自旋锁
自旋锁是一种忙等待锁,当一个线程试图获取一个被占用的自旋锁时,他会一直循环在那里,不断地检查锁是否可用,而不会进入睡眠状态。
自旋锁的优点这是在锁被持有的时间很短的情况下,性能非常高,因为他避免了线程切换的开销。但是,如果锁被出油的时间较长,自旋锁会浪费大量的CPU时间,因为等待的线程会一直占用CPU 资源进行进行忙等待。
适用场景:适用于锁被持有的时间很短,并且对性能要求非常高的场景。例如,在中断处理程序中,由于中断处理应该尽可能快地完成,不希望进入睡眠状态,所以可以使用自旋锁。在多处理器系统中,如果一个处理器上的线程在等待自旋锁时,其他处理器上的线程可能会释放锁,这样等待的线程可以很快地获得锁,因此自旋锁在多处理器系统中也有较好的性能。
互斥锁
互斥锁是一种睡眠锁,当一个线程试图获取一个被占用的互斥锁时,它会进入睡眠状态,直到锁被释放后被唤醒。
互斥锁的优点是在锁被持有的时间较长的情况下,不会浪费CPU资源,因为等待的线程进入睡眠状态,让出CPU给其他线程执行。但是,互斥锁的开销相对较大,因为涉及到线程的睡眠和唤醒,以及内核的调度操作。
适用场景:适用于锁被持有的时间较长,或者对 CPU 资源的利用效率要求较高的场景。例如,在用户空间程序与内核空间交互的场景中,可能需要较长时间的锁定,这时使用互斥锁比较合适。
读写锁
读写锁允许多个线程同时进行读操作,但在写操作时必须独占锁,读锁和写锁是互斥的,即当一个线程持有写锁时,其他线程不能获取读锁或写锁,当有线程持有读锁时,其他线程可以获取读锁,但不能获取写锁。
适用场景