当前位置: 技术问答>linux和unix
Linux: 内核会不会在系统函数运行过程中临时挂起进程
来源: 互联网 发布时间:2016-07-04
本文导语: 如: read(STDIN_FILENO,buf,1000) 内核会不会在read执行过程中将进程挂起? 呵呵,分不多,多多包涵 | 这个试情况而定。 比如read, a. 如果要读的数据不在内存里,就会挂起调用进程,启动磁盘IO...
如: read(STDIN_FILENO,buf,1000)
内核会不会在read执行过程中将进程挂起?
呵呵,分不多,多多包涵
内核会不会在read执行过程中将进程挂起?
呵呵,分不多,多多包涵
|
这个试情况而定。
比如read,
a. 如果要读的数据不在内存里,就会挂起调用进程,启动磁盘IO例程,然后从内核返回;切换到可运行的进程,如果没有可以运行的进程,就运行idle;而后某时刻,磁盘IO完成产生中断,内核就会唤醒等待的进程。
b. 如果数据已经在内存里,就拷贝数据到进程的地址空间;这期间可能有各种中断,但是处理完中断后还是会回到原来的断点,拷贝完成之后,read返回;这时候才可能发生进程切换。
其实如果理解了进程切换的3时机,就明白了
1. 时钟中断,设置RUNRUN标志,然会在中断或陷入处理末尾进程进程调度
2. 进程执行了wait、exit及sleep等系统调用后要放弃处理机
3. 进程执行完系统调用功能而从核心态返回到用户态时
需要说明的是情况1,如果被中断的是正在核心态运行的进程,那么中断返回后,一定会到被中断的进程继续运行,而不会发生进程切换。
比如read,
a. 如果要读的数据不在内存里,就会挂起调用进程,启动磁盘IO例程,然后从内核返回;切换到可运行的进程,如果没有可以运行的进程,就运行idle;而后某时刻,磁盘IO完成产生中断,内核就会唤醒等待的进程。
b. 如果数据已经在内存里,就拷贝数据到进程的地址空间;这期间可能有各种中断,但是处理完中断后还是会回到原来的断点,拷贝完成之后,read返回;这时候才可能发生进程切换。
其实如果理解了进程切换的3时机,就明白了
1. 时钟中断,设置RUNRUN标志,然会在中断或陷入处理末尾进程进程调度
2. 进程执行了wait、exit及sleep等系统调用后要放弃处理机
3. 进程执行完系统调用功能而从核心态返回到用户态时
需要说明的是情况1,如果被中断的是正在核心态运行的进程,那么中断返回后,一定会到被中断的进程继续运行,而不会发生进程切换。