【操作系统】03.进程同步、互斥、死锁
【嵌入式八股】一、语言篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
进程线程同步、互斥
结合【嵌入式Linux中的Linux内核部分】学习
33.进程同步的方法
结合嵌入式Linux部分Linux内核中的进程同步方式一起学
同步是指在多个进程之间共享资源时,需要协调它们的执行顺序,以避免出现竞态条件等问题。以下是一些常用的进程同步方法:
临界区
临界区是指一段代码,在同一时刻只能被一个进程执行。为了保证多个进程在访问共享资源时不会产生冲突,可以使用临界区机制对共享资源进行保护。进程需要先获得对应的锁或信号量,才能进入临界区执行代码,执行完后再释放锁或信号量。
互斥锁(Mutex)
互斥锁用于保护共享资源,同一时间只允许一个进程访问共享资源。当进程需要访问共享资源时,它需要先获取互斥锁,如果互斥锁已经被其他进程获取了,那么进程就会被阻塞,直到互斥锁被释放为止。当进程完成对共享资源的访问时,它需要释放互斥锁,这样其他进程就可以访问共享资源了。
信号(Signal)
信号是一种进程间通信机制,用于在多个进程之间传递异步事件。当一个进程需要发送信号时,它可以调用发送函数,这样目标进程就会收到信号,并执行相应的处理函数。信号可以用于中断进程的执行,或者触发进程的某些行为。
信号量(Semaphore)
信号量是一种计数器,它用于保护共享资源。当进程需要访问共享资源时,它需要先获取信号量,如果信号量的值为正数,那么进程可以继续执行,同时信号量的值会减一;如果信号量的值为零,那么进程就会被阻塞,直到信号量的值大于零为止。当进程完成对共享资源的访问时,它需要释放信号量,同时信号量的值会加一,这样其他进程就可以访问共享资源了。
事件(Event)
事件是一种进程同步机制,用于在多个进程之间传递信号。当一个进程需要等待某个事件发生时,它可以调用事件的等待函数,这样进程就会被阻塞,直到事件发生为止。当另一个进程触发了事件后,它可以调用事件的通知函数,这样等待事件的进程就会被唤醒,继续执行。
条件变量(Condition Variable)
条件变量用于在多个进程之间传递信息,以协调它们的执行顺序。当一个进程需要等待某个条件成立时,它可以调用条件变量的等待函数,这样进程就会被阻塞,直到条件成立为止。当另一个进程满足了条件后,它可以调用条件变量的通知函数,这样等待条件的进程就会被唤醒,继续执行。
读写锁(Read-Write Lock)
读写锁用于保护共享资源,允许多个进程同时读取共享资源,但只允许一个进程写入共享资源。当一个进程需要读取共享资源时,它需要先获取读锁,如果没有其他进程持有写锁,那么进程可以获取读锁,同时其他进程也可以获取读锁;如果有进程持有写锁,那么进程就会被阻塞,直到写锁被释放为止。当一个进程需要写入共享资源时,它需要先获取写锁,如果没有其他进程持有读锁或写锁,那么进程可以获取写锁;否则进程就会被阻塞,直到读锁和写锁都被释放为止。
交换(Exchange)
交换是一种进程同步机制,用于在多个进程之间交换数据。当一个进程需要交换数据时,它可以调用交换函数,这样它就会被阻塞,直到另一个进程也调用了交换函数为止。当另一个进程调用了交换函数后,两个进程就会交换数据,并继续执行。
屏障(Barrier)
屏障用于协调多个进程的执行顺序,保证它们在某个点上同时开始执行或同时结束执行。当一个进程到达屏障时,它会被阻塞,直到所有进程都到达屏障为止。当最后一个进程到达屏障时,所有进程都会被唤醒,继续执行。
管程
管程是一种高级的同步机制,是一种抽象数据类型,提供了一组共享变量和一组操作共享变量的过程,保证多个进程在访问共享资源时的互斥和同步。管程封装了共享资源的访问方法,使得进程只能通过管程提供的接口访问共享资源,从而保证了共享资源的访问顺序和互斥性。管程可以使用条件变量等机制实现进程之间的同步和互斥。
两信互临,读事件,换屏管。
34.线程间同步方法有哪些?
线程安全是如何保证的
现在流行的进程线程同步互斥的控制机制,其实是由最基本的4种方法(临界区、互斥量、信号量和事件)实现的。 其他高级同步机制,例如屏障和管程,通常是基于这些基本方法实现的。
-
临界区是指一段代码,只能由一个线程在同一时刻执行。当一个线程进入临界区时,其他线程必须等待。通过使用互斥锁(Mutex)来实现临界区的同步。
-
互斥锁是一种线程同步的机制,用于保护临界区,确保同一时刻只有一个线程可以访问临界区。一个线程在进入临界区之前需要先获得互斥锁,执行完临界区的代码后再释放互斥锁,其他线程才能获得锁进入临界区。
-
信号量是一种用于进程或线程之间同步的机制,可以控制同时访问某个资源的进程或线程数量。通过对信号量进行P操作(减1)和V操作(加1),可以实现线程间的同步和互斥。
-
**事件(或条件变量)**是一种同步机制,用于实现线程间的等待和通知。当一个线程在等待某个事件时,它会进入睡眠状态,等待其他线程通过通知唤醒它;当事件发生时,另一个线程会发送通知,唤醒等待的线程,让它继续执行。
35.进程互斥的软件实现
进程互斥是指在多个进程并发执行时,为了保证它们之间不会相互干扰、不会发生数据冲突等问题,需要采取一些方法来协调它们之间的访问和执行。下面介绍几种常见的进程互斥的软件实现方法:
- 单标志法:该方法通过设置一个公共的标志来实现进程互斥。当一个进程需要访问共享资源时,先检查标志是否被占用,如果未被占用,则将标志设置为占用状态,并进入临界区;如果已被占用,则等待其他进程释放标志。在离开临界区时,清除标志,其他进程才能获取标志。
- 双标志先检查法:该方法在单标志法的基础上,增加了一个等待标志。当一个进程需要访问共享资源时,先检查等待标志是否已被占用,如果未被占用,则将等待标志设置为占用状态,并检查标志是否被占用,如果未被占用,则将标志设置为占用状态,并进入临界区;如果已被占用,则释放等待标志并等待其他进程释放标志和等待标志。在离开临界区时,清除标志和等待标志,其他进程才能获取标志和等待标志。
- 双标志后检查法:该方法与双标志先检查法类似,但是是先进入临界区后检查等待标志,如果等待标志已被占用,则释放标志并等待其他进程释放等待标志和标志。该方法相比双标志先检查法,可以减少不必要的等待,但也可能会导致优先级反转的问题。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础【本专栏】 3.硬件篇 4.嵌入式Linux (建议PC端查看)