Linux0.11内核中的wait_on_buffer和wait_on_inode函数是非常有代表性的延迟性函数处理过程
Linux0.11版函数定义:
static inline void wait_on_buffer(struct buffer_head * bh)
{
cli();
while (bh->b_lock)
sleep_on(&bh->b_wait);
sti();
}
分析如下:
1. 首先可以明确,wait_on_buffer是工作在内核态的函数。更进一步应当理解为两种可能性:
或者是当前某个用户态的进程请求数据进而引发的,那么可以认为是当前进程进入了内核态;又或者是内核本身的某个任务
引发的操作。不管怎样wait_on_buffer背后是代表这某个进程或者任务的。
2. wait_on_buffer中通过cli和sti起到一个保护临界区的作用,为什么这么说?
原因首先还在于wait_on_buffer是工作在内核态的环境下,此时cli就意味着关闭了所有的可屏蔽中断,如时钟中断和硬盘
处理中断等等,这也就意味着:
1)当前工作在用户态的进程不会因为时间片到了有可能被轮转出去,切换成其他的进程,从而保证while(bh->b_lock)形成的
若干条指令中间不会被打断,造成可能有别的进程修改了bh->b_lock的值,造成错误;
2)不会造成硬盘中断的到来引发的其他进程对bh->b_lock的操作,进而造成错误。
因此,通过关闭中断,可以达到while (bh->b_lock)语句在执行期间被他人修改,从而实现临界区的效果。
关于这一点,第3版的《Understanding the Linux Kernel》在第五章(内核同步)里明确也提到,确保一组内核语句被当作
一个临界区处理的主要机制之一就是中断禁止,可惜本人在上学时学的OS教材是理论性较强的那种,只关注了各种各样的临界操
作模型,没有提到实现机制,导致很长时间都觉得临界区的概念很虚,不好掌握。
3. 还有一个重要的问题就是如果关闭了中断,那别的用户进程怎么办?是不是整个系统在这段时间内都不能收到相关的中断信号
了?这个问题也有很多人问,答案当然是不会影响其他的用户进程,原因在于sleep_on在将当前进程挂起后,会执行一次进程调
度操作,即schedule(),而一旦选择了新进程进行切换时,会将新进程的EFLAGS寄存器内容也加载到相应的寄存器的,而这里当
然包含了IF(Interrupt Flag)位,也就是说如果此时切换过来的进程是使用自己原先的中断开关状态的,原来的开就开,原来的关
就关,和之前的进程无关。因此,wait_on_buffer里对中断的操作,只影响当时的进程,故这个中断也被称为“本地中断”,这
个称呼更能反映其实质吧。
相关推荐
通过这种方式,wake_up函数实现了基于等待队列的进程唤醒机制,确保了进程的有序执行和资源的合理分配。 ### 进程调度的多米诺骨牌效应 Linux进程调度机制的“多米诺骨牌效应”指的是当某个进程被唤醒后,它将依次...
"Linux-system-functions.rar"这个压缩包文件显然包含了关于Linux系统函数的详细信息,这对于理解和使用Linux系统服务进行C++编程至关重要。以下是根据标题、描述以及可能包含的文件内容提炼出的一些关键知识点: 1...
在 TCP 连接中,客户端和服务器端都可以处于不同的状态,例如 ESTABLISHED、CLOSE_WAIT、FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT 等 trạng thái。 CLOSE_WAIT 状态是 TCP 连接中的一种状态,它表示服务器端已经收到了...
在Linux系统中,进行网络编程时,TCP连接的TIME_WAIT状态是至关重要的一个环节。TIME_WAIT状态是TCP连接生命周期中的最后一个阶段,对于理解和优化网络应用性能有着直接的影响。本资源"TIME_WAIT.rar"包含了关于这个...
文件"close_wait_0306.chm"和"close_wait_0306"可能是关于这个问题的文档或日志文件,它们可能包含了更详细的错误信息、堆栈跟踪或连接状态的历史记录。CHM文件是Microsoft的帮助文件格式,通常包含软件的文档或技术...
”,然后使用`rt_task_wait_period`函数等待下一个周期。 #### 五、注意事项 - 在编写实时程序时,需要注意避免使用可能导致进程阻塞的系统调用,以免破坏实时性。 - 需要确保所有必要的RTAI-LXRT内核模块都已正确...
在给定的文件中,主要讨论的是Linux内核中的`wait_event_interruptible()`和`wake_up()`这两个函数,它们是实现同步的一种方式,特别是在等待队列锁资源的保护下。 1. `wait_event_interruptible()`函数: 这个...
这可以通过在MySQL配置文件(如my.cnf)中修改或在运行时使用`SET GLOBAL wait_timeout = 新的超时值`命令来实现。 2. **定期发送心跳请求**:应用程序可以在连接空闲时定期发送简单的查询(如`SELECT 1`)来保持...
- `wait_queue_func_t func`: 唤醒方法,即当资源可用时执行的回调函数。 - `struct list_head task_list`: 用于链接其他等待队列节点的双向链表结构。 #### 四、等待队列操作 等待队列的操作主要包括初始化、...
Linux的进程管理API包括`fork`, `exec`, `wait`, `exit`, `signal`等函数。`fork`创建新的进程,`exec`系列函数(如`execl`, `execv`, `execle`, `execvp`等)用于替换当前进程空间执行新程序,`wait`等待子进程结束...
extern inline long sleep_on_timeout(wait_queue_head_t *q, signed long timeout) { signed long early = 0; current->timeout = jiffies + timeout; sleep_on(q); if (current->timeout > 0) { early = ...
`pthread_cond_wait()` 是 POSIX 线程库中的一个关键函数,用于线程同步。它与互斥锁(mutex)一起工作,允许线程在特定条件满足时挂起执行,等待其他线程发出信号。在深入分析 `pthread_cond_wait()` 的用法之前,...
在执行 schedule() 函数后,可以调用 finish_wait 函数来清除作业,void finish_wait(wait_queue_head_t *queue, wait_queue_t *wait);finish_wait 函数将等待队列 entry 从等待队列中删除,并恢复进程的状态。 ...
Linux_c_lib.chm 是一本关于Linux环境下C语言编程的中文参考手册,主要涵盖了在Linux操作系统中使用C语言进行系统级编程的各种函数和概念。这个压缩文件以.chm(Compiled HTML Help)格式提供,这是一种Windows平台...
- **wait_event_interruptible_timeout()**:允许线程被信号中断的版本,同时包含超时机制。 **5. 基于等待队列的Semaphore** Semaphore是一种更高级的同步机制,它可以看作是对等待队列的封装。信号量用于限制对某...
2. **进程管理**:fork()用于创建新进程,exec()系列函数用于替换当前进程的执行体,wait()和waitpid()用于等待子进程结束。此外,还有kill()用于发送信号,signal()或sigaction()用于处理信号。 3. **线程操作**:...
这份"linux_c函数手册"是开发者和学习者的重要参考资料,它涵盖了Linux环境下C语言的各种函数,帮助程序员理解和使用这些函数进行高效编程。下面将详细讨论一些重要的C函数及其在Linux环境中的应用。 1. 输入/输出...
在Linux操作系统中,C语言是基础且至关重要的编程语言,特别是在系统级编程和命令行工具开发方面。Linux_C函数参考手册是一份详细列举了Linux环境下常用C函数的资源,对于开发者来说是不可或缺的工具。这份手册包含...
Linux C 函数全集是开发者们不可或缺的参考资料,它涵盖了C语言在Linux环境下的众多核心函数,帮助程序员理解和使用这些功能强大的工具。 Linux C 函数全集中,我们可以找到以下主要的知识点: 1. **标准输入/输出...
创建和管理进程是通过fork()、exec()、wait()等系统调用来实现的。进程间关系可以是父子关系,父进程可以等待子进程结束(wait()),或者通过信号进行通信。同时,进程还有状态的概念,如运行、就绪、等待等。 3. *...