chap7.4 多线程环境(自学)

上传人:今*** 文档编号:106904958 上传时间:2019-10-16 格式:PPT 页数:32 大小:299.51KB
返回 下载 相关 举报
chap7.4 多线程环境(自学)_第1页
第1页 / 共32页
chap7.4 多线程环境(自学)_第2页
第2页 / 共32页
chap7.4 多线程环境(自学)_第3页
第3页 / 共32页
chap7.4 多线程环境(自学)_第4页
第4页 / 共32页
chap7.4 多线程环境(自学)_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《chap7.4 多线程环境(自学)》由会员分享,可在线阅读,更多相关《chap7.4 多线程环境(自学)(32页珍藏版)》请在金锄头文库上搜索。

1、UNIX多线程环境,1 基本概念,引入原因: 在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。,引入效果:进程承担资源的分配。线程承担具体处理机的调度和信息处理 有效发挥处理机的功能,提高了并行性,程序响应快。 进程中的多个线程共享同一数据空间(用户地址空间和其他进程资源),通讯快,简单,减少了上下文切换开销, 。 改变程序设计结构,线程的概念:线程是进程内部相对独立的并具有可调度特性的执行单元。,1 基本概念,2包含线程的进程结构 单线程进程结构: PCB+用户地址空间栈段 多线程进程结构: PCB+用户地址空间各个线程结构信息(TC

2、B线程栈段),1 基本概念,3线程模型 核心级线程和用户级线程 :分类的标准主要是线程的调度者在核内还是在核外。前者更利于并发使用多处理器的资源,而后者则更多考虑的是上下文切换开销。 在目前的商用系统中,通常都将两者结合起来使用,既提供核心线程以满足smp系统的需要,也支持用线程库的方式在用户态实现另一套线程机制,此时一个核心线程同时成为多个用户态线程的调度者。,1 基本概念,(a) 核心级线程(KLT) 线程的调度和管理等由操作系统的程序完成。系统的核心程序给应用程序提供一个可访问核心级线程的应用程序接口。即系统调用或应用程序API。系统核心来管理线程的调度与上下文切换。 特点: 1. 核心

3、程序可以把同一进程中的不同线程调度到多个处理机上运行。即支持多处理器并行处理机制。 2. 当进程中的一个线程被阻塞时,进程中的另一个线程可以被调度。 3. 内核程序本身也可用多线程方式编写,所以核心程序可设计成可重入的并发程序结构。 4. 同一进程中的线程进行切换时需要进入到核心模式下完成。缺点。,1 基本概念,(b) 用户级线程(ULT) 系统中线程的产生与维护完全由用户级程序实现。内核只负责以进程为单位的系统资源和处理器调度和管理。应用程序通常是建立在一个“线程控制库”基础上的多线程程序。 特点: 1.线程切换时无需改变进程的运行模式,减少了进程在核心态和用户态之间转换时的资源消耗。 2.

4、线程的调度管理程序是用户级程序,所以线程的调度算法可以比较灵活。 3.用户级线程管理模式的系统程序移植性比较好 .,1 基本概念,(c) 轻量级进程 一个轻量级进程(LWP)是一个内核支持的用户线程。每个进程有一个或多个轻量级进程,每一个LWP都由一个单独的内核线程来支持,并可以将一个或多个用户级线程映射到一个核心级线程上。在一个多处理器系统中,每个LWP能被分配到不同的处理机上运行,实现并行。由于I/O等待或资源阻塞只是单个LWP而不是整个进程,在单处理器环境中优势很明显。 缺点: 由于大部分LWP的操作,如创建、释放和同步等需要系统调用。系统调用相对来说是开销很大的操作。 每个LWP需要花

5、费相当多的内核资源,因此,一个系统不能支持大量的LWP。,2 多线程程序设计规则,UNIX系统提供多线程机制,为用户的程序设计提供了更好的并行基础。但是多线程程序设计不同于单线程程序设计,有一些新的设计方法和规则应该引起注意。 1 多线程程序结构的改变 多线程编程可以使程序在运行中减少对系统资源的使用频率,可利用远程系统调用建立线程,并将程序的运行分布在多个处理器上完成。在编程时,应考虑以线程为核心完成程序的分布式处理,尽量使程序的设计结构简单化和独立化。 程序设计是基于线程控制库和远程系统调用包完成的。一般设计过程为:在某个主机中创建一个进程,然后让这个进程创建一系列的线程,每个线程可以完成

6、一个远程的系统调用,而这些远程的系统调用可以去调用另一台工作站上的过程。,2 多线程程序设计规则,POSIX标准: 该标准以libpthread线程库方式提供给用户使用。移植性好。 Solaris多线程标准: 包含的是一套sun的线程接口库libpthread。,2 多线程标准库,2 多线程程序设计规则,(a)全局变量的使用规则 在单线程中,全局变量使用很常见,但在多线程中,应考虑多个线程访问同一个全局变量的数据一致性的问题。,3 多线程编程规则,extren int errno if(write(file-des,buffer,size)=-1) printf(“%d”,errnno);,线

7、程局部变量,2多线程程序设计规则,(b)程序代码安全性问题 应注意加入的代码是否安全。不能在一个多线程程序中随便加入非多线程语句。应使用多线程函数完成各项操作工作。,2 多线程程序设计规则,(c)线程间的同步和互斥 统一互斥锁法: 线程运行时为了避免对共享资源的交替使用,可以使用一个互斥锁法进行管理。类似进程管理中的互斥机制。 可重入解决方法 : 使用模块化和数据封装的设计方法,将多线程中的函数制作成“可重入式函数“。可重入函数是指某一函数同时被多个线程调用时,其执行结果仍然是正确的。即在该函数的执行中已充分考虑了多线程的隔离与同步的问题。在编写可重入函数时,其关键技术是进行代码锁定和数据锁定

8、。,2 多线程程序设计规则,(1)代码锁定 使函数的整个运行过程在某个锁的保护状态下进行。 (2)数据锁定 可使用细粒度锁定 、粗粒度锁定策略来保证多线程在进行数据访问过程中数据的一致性 。,3 多线程程序设计基础,1 . 创建线程,#include int pthread_create( pthread_t *tid, pthread_attr *attr, void (* start_routine )(void*), void* arg );,参数tid 用于返回新创建线程的线程号; attr 是线程属性; start_routine 是线程函数指针,线程从这个函数开始独立地运行;arg

9、 是传递给线程函数的参数。,3 多线程程序设计基础,1 . 创建线程,创建默认的属性,#include pthread_attr_init(pthread_attr_t * attr),用指定的属创建线程,pthread_attr_t attr; pthread_attr_init( ,3 多线程程序设计基础,1 . 创建线程,线程的属性,定义在结构 pthread_attr_t 中,线程是否绑定,int pthread_attr_setscope( pthread_attr_t * attr, int mode); mode = PTHREAD_SCOPE_SYSTEM ( 绑定的 ) mo

10、de = PTHREAD_SCOPE_PROCESS ( 非绑定的 ),pthread_attr_t attr; pthread_t tid; pthread_attr_init (,3 多线程程序设计基础,1 . 创建线程,线程的属性,定义在结构 pthread_attr_t 中,线程是否分离,pthread_attr_setdetachstate(pthread_attr_t *attr, int mode); mode = PTHREAD_CREATE_DETACHED(分离线程) mode = PTHREAD _CREATE_JOINABLE(非分离线程)。,3 多线程程序设计基础,1

11、 . 创建线程,线程的属性,定义在结构 pthread_attr_t 中,线程的优先级别,线程的堆栈设置,3 多线程程序设计基础,1 . 创建线程 简单例程:在主线程中创建一个辅线程,由辅线程完成数据库查询等后台工作,主线程在完成其他任务后,在指定点和辅线程进行同步,#include typedef struct phonebook_ char name64; char phone64; phonebook; void findphone(void * arg) phonebook *p = (phonebook*)arg; /参数类型转换 / 中间处理过程 Search(p-name, p-

12、phone); pthread_exit(0); ,3 多线程程序设计基础,void main() phonebook pb; pthread_t tid = 0; int status; strcpy(pb.name,”lisi”); pthread_create( ,3 多线程程序设计基础,2 . 对线程的常用操作,#include int pthread_detach( pthread_t tid);,分离一个线程,#include void main() pthread_t tid; pthread_create( ,3 多线程程序设计基础,2 . 对线程的常用操作,#include

13、int pthread_join( pthread_t tid, void* status);,等待一个线程,#include void main() pthread_t tid1, tid2; pthread_create( ,3 多线程程序设计基础,2 . 对线程的常用操作,#include int pthread_exit( void* status );,线程的终止,#include pthread_t pthread_self();,获取线程ID,3 多线程程序设计基础,3 . 线程中使用的数据,int pthread_key_create( pthread_key_t *key,

14、void( * destructor )(void *) );,int pthread_key_delete( pthread_key_t key );,int pthread_setspecific( pthread_key_t key,void *v);,int pthread_getspecific( pthread_key_t key,void *v);,3 多线程程序设计基础,3 . 线程中使用的数据 示例,void thread_routine( void * p) /线程入口函数 char buff1024; /该内存区域设定为线程数据区域 pthread_key_create(

15、56789, NULL );/创建一个线程数据键 pthread_setspecific( 56789, buff );/指定线程数据区域 strcpy(buff,” write data to thread data zone!”); . . . . . . . . function1(); /线程内部调用函数 . . . . . . . function2(); /线程内部调用函数 . . . . . . . printf(“the data is %s”, buff ); pthread_key_delete( 56789 ); /删除线程数据键 . . . . . pthread_ex

16、it(0); ,3 多线程程序设计基础,void function1 char *p = null; pthread_getspecific( 56789, ,3 多线程程序设计基础,4 . 线程中使用互斥锁,int pthread_mutex_init ( pthread_mutex_t *mutex, pthread_mutexattr_t *mutex_attr );,int pthread_mutex_destroy ( pthread_mutex_t * mutex),int pthread_mutex_lock ( pthread_mutex_t * mutex);,int pthread_mutex_unlock(pthread_mutex_t * mutex) ;,3 多线程程序设计基础,4 . 线程中使用互斥锁 示例,include void reader_function ( void *p); void writer_function ( void *p); char* b

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号