Solaris操作系统中的多线程进程架构与内核调度器解析
1. 用户级线程执行与LWP的关系
用户级线程的执行依赖于轻量级进程(LWP)或内核线程(kthread),以便被调度执行。线程库中有专门的调度线程负责这部分工作。用户线程有自己的优先级方案和线程库调度器,用于选择下一个要执行的用户线程,并且线程库调度器和内核调度器在架构上有很多相似之处。
线程创建时无需绑定到LWP,在多线程程序中,常常会将多个未绑定的线程调度到较少的LWP池上。确定LWP与用户线程的最佳比例并非易事,LWP过多会增加内核管理负担,过少则会导致可运行的用户线程等待LWP,从而减慢整体执行速度。
开发者可以使用thr_setconcurrency(3T)接口向操作系统提供关于为进程分配多少LWP的建议。此外,在thr_create(3T)调用中使用THR_NEW_LWP标志可以创建LWP,使用THR_BOUND标志可以将用户线程绑定到LWP。
2. 会话与进程组
内核通过创建不同的进程分组来管理进程控制的各个方面,除了进程的父子关系层次结构外,还实现了进程组和会话的概念。进程组和会话都是一个或多个具有共同关系或祖先的进程的集合,它们与信号和终端(tty)子系统密切相关。
进程组和会话的出现是为了增强Unix用户(包括开发者、系统管理员和最终用户)的操作能力和灵活性。用户可以通过它们在单个登录会话中运行多个并发作业,将作业置于后台或前台,暂停和继续作业,以及切换与控制终端连接的作业(前台作业)。