sixroom 发表于 2005-1-11 21:26
中断丢失问题请问在系统关中断期间,如果来了时间中断,是不是就丢失了,那时间是不是就不准了?
谢谢!sixroom 发表于 2005-1-12 10:22
中断丢失问题时钟不就是外部中断吗,从IRQ0传来的吗redgrid 发表于 2005-1-12 14:48
中断丢失问题每十毫秒发出一个时钟中断,没有程序需要关闭这么长时间。若是则会影响时间计数。中断关闭是针对一个进程而言。当切换到了其他程序就没有关闭中断。起码task0不会关闭中断。
sixroom 发表于 2005-1-13 12:53
中断丢失问题哦,时间中断丢失的几率比较小,谢谢
但是关中断就是为了进行原子性操作,不能发生任务切换吧
关中断一般在内核态,没机会切换gotop167 发表于 2005-1-13 13:05
中断丢失问题可以发生任务切换!
比如在等待一个高速缓冲时,会调用slepp_on使自己进入睡眠状态,从而放弃CPU,调用schedule来执行其他进程caolingzi 发表于 2005-1-13 13:42
中断丢失问题我觉的不会发生的,因为在进入一个中断程序的时候,保存当前进程的堆栈等,关中断,即使是又来了一个不可屏蔽中断,出现中断套嵌等情况,出中断时,返回进程堆栈,OR再调度,如果还未出中断,就又sleep_on了,再调度,那当前保存的进程堆栈信息,怎样处理呢?gotop167 发表于 2005-1-13 14:35
中断丢失问题[quote][b]下面引用由[u]caolingzi[/u]在 [i]2005/01/13 01:42pm[/i] 发表的内容:[/b]
我觉的不会发生的,因为在进入一个中断程序的时候,保存当前进程的堆栈等,关中断,即使是又来了一个不可屏蔽中断,出现中断套嵌等情况,出中断时,返回进程堆栈,OR再调度,如果还未出中断,就又sleep_on了,再 ...
[/quote]
我觉的好难理解你的话!请说清楚可以吗!
是可以发生任务切换的,每个任务都有自己的PCB表项(也意味着有自己的寄存器值)!
请看下面的代码
static inline void wait_on_buffer(struct buffer_head * bh)
{
cli(); //这里关中断
while (bh->b_lock) //假设条件成立
sleep_on(&bh->b_wait); //接下来执行它
sti();
}
在看代码
void sleep_on(struct task_struct **p)
{
struct task_struct *tmp;
if (!p)
return;
if (current == &(init_task.task))
panic("task[0] trying to sleep");
tmp = *p;
*p = current; //将等待高速缓冲的进程加入等待队列
current->state = TASK_UNINTERRUPTIBLE;//置TASK_UNINTERRUPTIBLE状态
schedule(); //注意这里调用schedule,来在PCB中找到个最符合
//运行条件的进程运行,
//(这次可以找到进程肯定不会是自己的,自己只有其他进程可以唤醒它)
if (tmp) //如果到这里的话,说明等待进程已经返回了,
tmp->state=0;
}
sixroom 发表于 2005-1-13 16:07
中断丢失问题进程主动放弃cpu
谢谢
wykr3879 发表于 2005-1-14 09:15
中断丢失问题[quote][b]下面引用由[u]redgrid[/u]在 [i]2005/01/12 02:48pm[/i] 发表的内容:[/b]
每十毫秒发出一个时钟中断,没有程序需要关闭这么长时间。若是则会影响时间计数。中断关闭是针对一个进程而言。当切换到了其他程序就没有关闭中断。起码task0不会关闭中断。
[/quote]
这个问题挺有意思。
Linux号称可以运行N年,那在这么长的时间内,什么事情都可能发生的。我们不妨考虑一个极端的情况:
时间中断恰好发生在关闭中断却尚未打开时,那么这个滴答肯定会丢掉,但这个几率又有多大呢?
从关闭中断到打开中断这段时间大概只是几个时钟周期,相对10毫秒来说确实是微乎其微,如果只是开机几个小时,那么发生这种情况的概率就更小了。但这个问题对于常年打开的服务器来说却是另外一种情况了。但即便如此,丢失的时间也是微乎其微的。类似的问题在历法的发展中不是也有发生吗,过了许多年发现突然少了几天,历法便改革了:-)yyzzbb-yang 发表于 2005-1-14 11:22
中断丢失问题 哈哈,别当心,Linux不会把你的时间给高错的,如果这个问题都不能解决,还有人用吗?
其实在Linux中还有一个全局变量用于修正jieffis的值。
一般在一个计算机系统中存在三个时间发生器,一个用于记录日期时间的,它就是利用电池进行供电的一个单独芯片——RTC,第二个是PIT(可编程间隔定时器),第三个是TSC时间戳计数器。
而PIT就是产生IRQ0的定时器芯片。而进行校正的就是利用TSC计数器,它在每个clock-cycle就会自动加一,不需要CPU操作,所以每个时钟中断产生时都可以利用一个全局变量记录下TSC的值,在下次时钟中断时再用这个全局变量校正jieffis的值,这样就可以记录精准的时间。(TSC计数器是纳秒级的。)wykr3879 发表于 2005-1-14 14:24
中断丢失问题原来如此。sixroom 发表于 2005-1-14 21:59
中断丢失问题yyzzbb-yang
正解
再问一下,在其他类型的cpu上有类似的可以矫正时间的精准计时装置吗
yyzzbb-yang 发表于 2005-1-17 10:04
中断丢失问题大部分现代CPU都有TSC(也可能是用其它的名称),但是也有些比较老的CPU是没有的,我也不知道它是用什么做校正参照的,但是我想通用CPU应该都有相应的装置,否则将会发生许都我们不想看到的事情。
如果下次看到相关资料,再和大家交流一下!
====
阅读(1373) | 评论(0) | 转发(0) |