Solaris多线程

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

exec(2) – 装入新进程映象
• 绝大部分 fork(2)调用后面跟着 exec(2) • exec – 执行一个新文件 • exec – 用一个由exec(2)参量的二进制文件构造 的新进程覆盖已有的进程映象 • • 执行的进程继承了调用者的状态: • > nice value, scheduling class, priority, PID, PPID, GID, task ID,project ID, session membership, real UID & GID, current working directory, resource limits, processor binding, times, etc,
进程结构主要内容
• 在多线程进程中所有线程共享进程的部分。
• 地址空间(Address space).虚拟及物理空间大致划分为文本段( text segment,含进程执行的指令流) ,栈段 (stack segment)为进程栈(若 进程多于一个线程,则每个线程有自己的栈)及数据段 (data segment,含 初始数据)。所有进程有一个堆( heap segment,为未初始化数据的页面) 认证(Credentials). 将The进程和用户、组及权限绑定 。认证定义了真实 有效的用户号(user identification) (UID), 组号(group identification) (GID), 及进程的权限列表,和project及zone information. 进程链(Process links). 一个进程将出现在内核中的几个链表上。除去进 程表外,还有进程家族树链 (parent, child and sibling processes, and orphans) 及相同进程组(process group )中.进程组为内核提供了对同组进 程采取行动的机制, 典型应用在信号提交的场合,比如在进行作业控制或终端 控制功能时。 CPU使用(CPU utilization). 相关域用来记录进程执行时分别在用户态和 核心态的时间 ,及所有子进程使用的相关时间. 信号(Signals).信号处理方式设置域:挂起(pending),忽略(ignore)排 队(queued)等.
进程结构proc_t(3)
• • • • • • • • • • • • • • 进程相关的指针: 父指针,兄弟指针,儿子指针等 struct proc *p_link; /* forward link */ struct proc *p_parent; /* ptr to parent process */ struct proc *p_child; /* ptr to first child process */ struct proc *p_sibling; /* ptr to next sibling proc on chain */ struct proc *p_psibling; /* ptr to prev sibling proc on chain */ struct proc *p_sibling_ns; /* prt to siblings with new state */ struct proc *p_child_ns; /* prt to children with new state */ struct proc *p_next; /* active chain link next */ struct proc *p_prev; /* active chain link prev */ struct proc *p_nextofkin; /* gets accounting info at exit */ struct proc *p_orphan; struct proc *p_nextorph;
进程结构proc_t
• • • • • • • • • • • • • • • proc_t usr/src/uts/common/ sys/proc.h 进程关键字段: /* * Fields requiring no explicit locking */ struct vnode *p_exec; /* pointer to a.out vnode */ // 可执行文件的vnode指针 struct as *p_as; /* process address space pointer */ //地址空间数据结构指针 struct plock *p_lockp; /* ptr to proc struct's mutex lock */ //进程互斥锁指针 kmutex_t p_crlock; /* lock for p_cred */ //内核互斥锁,用于同步对认证结构的访问 struct cred *p_cred; /* process credentials */ //指向进程认证结构的指针
Solaris多线程
百度文库
Solaris 多线程进程模型
• 多线程进程模型 • 内核线程(kernel thread)被调度/执行 • LWP(轻量级线程)允许每个线程执行系统调用 (system calls) • 每个内核线程有一个关联的LWP • 一个非线程进程(non-threaded process)有一个内核线 程/LWP • 一个线程化进程有多个内核线程 • 一个进程中的所有线程共享进程环境(process context) • > Address space • > Open files • > Credentials • > Signal dispositions • > 每一个线程有自己的栈
进程结构proc_t(4)
• • • • • • • • • • /* * Per-process lwp and kernel thread stuff */ id_t p_lwpid; /* most recently allocated lwpid */ int p_lwpcnt; /* number of lwps in this process */ int p_lwprcnt; /* number of not stopped lwps */ int p_lwpdaemon; /* number of TP_DAEMON lwps */ int p_lwpwait; /* number of lwps in lwp_wait() */ int p_lwpdwait; /* number of daemons in lwp_wait() */ int p_zombcnt; /* number of zombie lwps */
Process
进程是线程的容器 用户进程和轻量级进程一起创建,轻量级进程是内核对象, 可使用户线程独立执行和进入内核; 内核线程是Solaris中调度和执行单位
Solaris Thread Data Structures
proc_t p_tlist
kthread_t t_procp t_lwp klwp_t lwp_thread lwp_procp t_forw

• • •
Process Creation
• • • • • • 传统UNIX的fork/exec模型 > fork(2) – 复制整个进程,包含所有线程 > fork1(2) -复制进程,只对调用线程 > vfork(2) -复制进程, 但不复制地址空间 > 子进程将借用父进程地址空间,直至执行 exec()后新建空间。 • Solaris10中 • fork(2) 只复制调用线程 • • forkall(2) 加入:用来复制整个进程中包含 的所有线程
• •


进程结构主要内容(续)
• 线程(Threads). 各种域用来跟踪进程中LWP的数目, LWP状态和进程中所有的内核线程的链表。 • 微状态记帐(Microstate accounting). 用于进程的资源 使用及微状态的跟踪,包括多线程进程中的所有线程 • 用户域(User area). 用户域(user area ,uarea)维护 各种信息位,比如可执行名称和变量表,进程打开文件表 的链。 • Procfs. 支持进程文件系统( process file system) • 资源管理(Resource management).支持资源控制 (controls),计划( projects),任务( tasks), 和资源池 ( resource pools). • An examination of usr/src/uts/common/sys/proc.h reveals a considerable number of proc_t structure members required to make it all work as well as it does.
proc_t
The Life Of A Process
• • • 进程创建(Process creation) > fork(2) 系统调用创建所有进程 > SIDL 状态 > exec(2) 用可执行映象(executable image)覆盖新创 建进程 状态转移(State Transitions) > 典型地是状态是可运行 (SRUN), 到正在运行 (SONPROC) 或休眠(aka blocked, SSLEEP) >有可能停止 (debugger) SSTOP 终结(Termination) > SZOMB state > 显式或隐式地 exit(), signal (kill), fatal error
进程结构proc_t(2)
• • • • • • • • • • • • ... int p_swapcnt; /* number of swapped out lwps */ //被交换出的LWP的数目 char p_stat; /* status of process */ //进程状态 char p_wcode; /* current wait code */ //当前等待状态 ushort_t p_pidflag; /* flags protected only by pidlock */ int p_wdata; /* current wait return value */ //用于使用信号的进程同步 pid_t p_ppid; /* process id of parent */ //父进程的PID

• • • • • • • • •
kthread_t *p_tlist; /* circular list of threads */
//指向绑定的内核线程链表 lwpdir_t *p_lwpdir; /* thread (lwp) directory */ lwpdir_t *p_lwpfree; /* p_lwpdir free list */ lwpdir_t **p_tidhash; /* tid (lwpid) lookup hash table */ uint_t p_lwpdir_sz; /* number of p_lwpdir[] entries */ uint_t p_tidhash_sz; /* number of p_tidhash[] entries */ uint64_t p_lgrpset; /* unprotected hint of set of lgrps */ /* on which process has threads */ 注:结构中没有直接涉及到ulwp_t及klwp_t的指针!
Solaris: Processes, Threads and LWPs
Process 1
Process 2
user
L
L
L
L
Int kthr
kernel
... ... ...
hardware
P
P
P
演变
• • • • 由M:N到1:1原因 信号行为:接收信号线程未连接到LWP 线程调度:延迟 LWP池维护:没有应用程序提示
相关文档
最新文档