第十五章 多线程编程
·15.1 线程的概念
线程这样一种实体,它被包含在进程实体中,具有自己的运行线索,可以完成一定的任务。它和进程中其他进程共享所有的共享数据以及部分环境,并且可以和其他线程协同完成一定任务。线程常常被成为轻量级进程。
多个线程将共享同个进程虚空间的环境包括代码段和大部分数据,所以fork需要建立的大量复制创建就不需要,不同线程可以通过共享变量进行数据传输,不需要复杂的IPC机制。
同个进程的线程将并发运行。线程有独立的:线程ID、寄存器组值、线程堆栈、错误返回码变量errno、线程信号屏蔽码、线程优先级。
·15.2 线程的分类
1 用户线程:
用户线程的实现是通过运行时间系统代码来实现。这部分代码的功能是将线程恢复运行时需要保存的寄存器组信息和其他信息保存在一个结构中,然后将这个结构放在线程调度队列中,然后在线程队列中选择一个优先级最高的线程,而后将结构中保存的信息回复运行这个线程。
2 内核线程:
内核线程切换是通过内核调度器来实现,和普通进程一样是核心调度器实体。
·15.3 用户线程和内核线程的比较
1 CPU时间的分配
用户线程是通过在进程中连接用户级线程包来实现,所以这个进程的多个线程将竞争CPU分配给这个进程的时间。用户级线程不能在多个CPU环境中同时运行
内核线程和其他进程一起在核心调度器中竞争CPU时间,可以在多CPU环境运行更具良好的并发性
2 线程的并发性
除非一个运行中的用户级线程放弃CPU时间去运行进程内的线程切换代码,否则其他线程将不能获取CPU时间。因此一些慢系统调用将引起线程堵塞,而其他线程却无法切换。因此在用户级线程中,可能堵塞的系统调用将被无堵塞的版本取代。也因此这些原因和CPU的时间分配,大大限制了用户级线程的并发性
内核线程在发生堵塞时候,将由核心调度器把CPU时间分配给其他进程或核心线程。
3线程调度的开销
用户级线程的调度在进程内所有开销很小;内核线程调度和进程调度类似,所以开销较大。内核线程的良好并发性是用较大的开销换取,在对于并发性要求不是很高的应用时,用户级线程更加合适。
·线程函数库的使用
略
·线程同步
采用无名信号量、互斥锁、条件变量和信号变量、信号处理器等。
·线程应用
建议深入阅读其他专著。略~
·15.2 线程的分类
1 用户线程:
用户线程的实现是通过运行时间系统代码来实现。这部分代码的功能是将线程恢复运行时需要保存的寄存器组信息和其他信息保存在一个结构中,然后将这个结构放在线程调度队列中,然后在线程队列中选择一个优先级最高的线程,而后将结构中保存的信息回复运行这个线程。
2 内核线程:
内核线程切换是通过内核调度器来实现,和普通进程一样是核心调度器实体。
·15.3 用户线程和内核线程的比较
1 CPU时间的分配
用户线程是通过在进程中连接用户级线程包来实现,所以这个进程的多个线程将竞争CPU分配给这个进程的时间。用户级线程不能在多个CPU环境中同时运行
内核线程和其他进程一起在核心调度器中竞争CPU时间,可以在多CPU环境运行更具良好的并发性
2 线程的并发性
除非一个运行中的用户级线程放弃CPU时间去运行进程内的线程切换代码,否则其他线程将不能获取CPU时间。因此一些慢系统调用将引起线程堵塞,而其他线程却无法切换。因此在用户级线程中,可能堵塞的系统调用将被无堵塞的版本取代。也因此这些原因和CPU的时间分配,大大限制了用户级线程的并发性
内核线程在发生堵塞时候,将由核心调度器把CPU时间分配给其他进程或核心线程。
3线程调度的开销
用户级线程的调度在进程内所有开销很小;内核线程调度和进程调度类似,所以开销较大。内核线程的良好并发性是用较大的开销换取,在对于并发性要求不是很高的应用时,用户级线程更加合适。
·线程函数库的使用
略
·线程同步
采用无名信号量、互斥锁、条件变量和信号变量、信号处理器等。
·线程应用
建议深入阅读其他专著。略~