1.中断处理程序不可重入,即同一个中断处理程序绝对不会被同时调用以处理嵌套的中断。而系统调用可以重入。2.异常与中断不同 (异常是同步中断)
3.系统调用是用户空间访问内核的唯一手段;除异常和陷入外,他们是内核内核唯一的合法入口。
4.用户抢占在下列情况时产生:从系统调用返回用户空间 ;从中断处理程序返回用户空间。
5.内核抢占会发生在:当从中断处理程序正在执行,且返回内核空间之前;当内核代码再一次具有可抢占性的时候;如果内核中的任务显式的调用schedule();如果内核中的任务阻塞(这同样也会导致调用schedule)
6、进程的状态:运行,可中断,不可中断,僵死,停止
7、在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。
8、在进程上下文可以睡眠,也可以调用调度程序;在中断上下文不可以睡眠。
9、在2.6内核中,内核提供了三种不同形式的下半部实现机制:软中断、tasklet(用软中断来实现的)和工作队列。
10.目前只有两个子系统:网络和SCSI直接使用软中断(最多32个)。
11.内核定时器也是建立在软中断基础上的。
12.工作队列允许重新调度、甚至是睡眠;是靠内核线程来实现的。
13.硬中断是外部设备对CPU的中断,软中断通常是硬中断服务程序对内核的中断,而信号则是由内核(或其他进程)对某个进程的中断。
14.软中断和tasklet仍然运行与中断上下文,而工作队列则运行与进程上下文。因此。软中断和tasklet处理函数中不能睡眠,而工作队列处理函数中允许睡眠。
15、在linux系统中,进程的4GB的内存空间被分为两个部分-用户空间与内核空间。用户空间一般为0-3GB,内核空间一般为剩下的2-4GB。linux中1GB的内核地址空间又被划分为物理内存映射区、虚拟内存分配区、高端页面映射区。专用页面映射区和系统保留映射区这几个区域。
16、在中断处理函数。tasklet和内核定时器等非进程上下文中不能阻塞。
17、内核中可能造成并发执行的原因:中断、软中断和tasklet、内核抢占、睡眠及与用户空间的同步、对称多处理(SMP)。
18、大多数内核数据结构都需要加锁。要给数据而不是代码加锁。2011、11、1
19、如果加锁时间不长并且代码不会睡眠(比如中断处理程序)
,利用自旋锁是最佳选择;如果加锁时间可能很长或者代码在持有锁时有可能睡眠,那么最好使用信号量来完成加锁功能。(在进程上下文才能获取信号量锁)
20、在中断上下文中只能使用自旋锁,而在任务睡眠时只能使用信号量。
21、局部锁(先获得)、属于内核更中心位置的锁
信号量(首先获得)、自旋锁
最好的方法是避免出现需要多个锁的情况。P124 LDD
22、在很多情况下,决定使用自旋锁还是互斥体相对来说很容易:
(1)如果临界区需要睡眠,只能使用互斥体,因为在获得自旋锁后进行调度、抢占以及在等待队列上睡眠都是非法的。
(2)由于互斥体会在面临竞争的情况下将当前线程置于睡眠状态,因此,在中断处理函数中。只能使用自旋锁 。
阅读(1615) | 评论(0) | 转发(0) |