线程管理
线程有三种模型:
·用户级或应用程序级线程
·内核级线程
·用户级和内核级混合线程
用户级线程不具有自身的线程上下文,对操作系统是不可见的。运行时库调度器从进程的多个线程中选择一个线程,然后该线程和该进程允许的一个内核线程关联起来,内核线程被操作系统调度器指派到处理器内核。
内核级线程驻留内核空间,像单个进城一样被调度。如果用户建立内核级线程,则单个线程都有一个内核级线程与之对应。
混合线程中,用户线程与内核线程是“多对一”的关系。这种实现中,进程有自己的内核线程池,可运行的用户线程由运行时库分派并标记为准备好执行的可用线程。操作系统选择用户线程并将它映射到线程池中的可用内核线程。
内核线程池不会被销毁和重建,它们总是位于系统中,在必要时分配给不同用户级线程。纯内核级线程被创建时,就创建一个新的内核线程。只对内核线程池池中的每个线程创建上下文(单个内核线程也有上下文)。
线程有两个竞争范围:
·进程范围
·系统范围
线程依照竞争范围和分配域(被指派到的处理器集)来同其他线程竞争处理器的使用。有进程竞争范围的线程同进程中其它线程竞争;有系统竞争范围的线程同系统分配的其它进程的线程竞争资源。有着系统范围的线程和系统中所有线程一起被排序和调度。
线程是进程被调度执行时的执行单元。
进程范围的
进程发生上下文切换是在:
·进程被抢占
·进程主动让出处理器
·进程发起I/O请求或需要等待某个事件
·进程从用户模式切换到内核模式
总而言之,就是进程失去处理器时会发生上下文切换。线程与之类似,但是,内核/操作系统是通过内核线程来实现对所有线程的调度的。
进程和线程的调度策略有:
·先进先出(FIFO)
·轮询(RR)
当一个就绪队列中包含多个进程时,调度器必须决定首先将哪个进程指派给处理器。每个进程被赋予一个优先级别,并同其他有着相同级别的可运行进程放置在同一个优先级队列中。调度策略的区别:
FIFO调度根据到达队列的时间指派处理器。当正运行的进程的时间片耗尽,它被放置在优先级队列的头部;当一个休眠进程变为可运行,被放置在优先级队列的尾部
RR策略中当时间片耗尽,进程被放置在队列的尾端,同时队列中下一个进程被指派给处理器。其它与FIFO相同。
状态转换
描述
就绪——>运行(分派)
进程被指派到处理器
运行——>就绪(超时)
处理器指派给进程的时间片用完,进程被放到就绪队列
运行——>就绪(抢占)
时间片用完前进程被抢占;当有着更高优先级的进程就绪时就可能发生这种情况,进程被放回就绪队列
运行——>休眠(阻塞)
时间片用完前,进程放弃了对处理器的使用;进程可能等待某个事件或者进行了系统调用例如I/O请求;进程同其它休眠进程被放入到一个队列中
休眠——>就绪(阻塞解除)
进程等待的事件已经发生,或系统调用结束例如I/O请求被满足,进程被重新放入就绪队列
运行——>停止
由于收到了停止信号,进程放弃了处理器
停止——>就绪
由于收到了继续信号,被放入就绪队列
运行——>僵死
进程已经结束,等待父进程从进程表中提取其退出状态
僵死——>退出
父进程已经提取了退出状态,进程退出系统
运行——>退出
进程已经停止,父进程已经提取了它的进程状态,而且进程退出系统
如果父进程不等待子进程,那么一旦子进程运行结束,它就变为僵死进程。僵死进程不使用任何系统资源,但是仍然在进程表中占用条目。
关于进程抢占:
用户抢占在以下情况时产生:
从系统调返回用户空间。
从中断处理程序返回用户空间
内核抢占可能发生在:
当从中断处理程序正在执行,且返回内核空间之前。
当内核代码再一次具有可抢占性的时候,如解锁及使能软中断等。
如果内核中的任务显式的调用schedule()
如果内核中的任务阻塞(这同样也会导致调用schedule())