关于任务切换的有关问题

关于任务切换的问题
最近正在学杨季文的《80X86汇编语言程序设计教程》,对任务切换感到不理解。

书上说,任务切换的指令是用JMP或者CALL,或者在指令中直接指定一个任务状态段TSS,或者在指令是指定一个任务门,然后任务门中的选择子指向一个TSS。这样就完成了任务切换。

可是,按照我的理解,这好象是程序主动的切换。而在另一些关于Windows的书中,则说这些任务切换是由操作系统完成的,操作系统给每个任务分配时间片,时间到了的时候,就打断正在执行的任务,把它挂起,然后转而执行另一个任务。

我就不明白了,任务切换是程序自已完成的,还是由外界(操作系统)完成的?如果是程序自己完成的,那么任务切换时,原任务的指令一定是JMP或CALL,如果是操作系统完成的,那任务切换时可能是任务一条指令。

操作系统究竟中如何完成任务切换的?中断?

------解决方案--------------------
"执行系统调用是程序主动挂起自己,而时钟中断是系统强行挂起程序",可以这么说。
系统调用其实就是软件中断,在linux中是int 80h。
但只有pause,waitpid等系统调用才进行任务切换