多线程编程  Linux 下线程 概述  linux 线程 实现. 1 、 Linux 下线程 概述 进程是系统中程序执行和资源分配的基 本单位。每个进程有自己的数据段、代码 段和堆栈段。 线程通常叫做轻型的进程。线程是在共 享内存空间中并发执行的多道执行路径, 他们共享一个进程的资源。 因为线程和进程比起来很小,所以相对.

Slides:



Advertisements
Similar presentations
实验二 Linux 线程及信号灯 一、目的 了解并掌握 Linux 线程及信号灯。 二、要求 1 、了解 Linux 线程与信号灯使用: ( 1 ) Linux 线程 ( 2 ) Linux 信号灯 ( 3 )线程互斥 ( 4 )线程同步.
Advertisements

高级服务器设计和实现 1 —— 基础与进阶 余锋
© 2005 博创科技 北 京 博 创 兴 业 科 技 有 限 公 司 BEIJNG UNIVERSAL PIONEERING TECHNOLOGY Co., LTD 博创科技 嵌入互动 第四讲 Linux 多线程编程 北京博创兴业科技有限公司.
1 基于嵌入式 Linux 开发基础 丁男. 2 概要 基于 linux 系统开发简介 基于 linux 系统开发简介 多线程技术 多线程技术 对文件操作 对文件操作 对设备操作 对设备操作.
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
2.7 线程 2.7.1线程的其本概念.
第三章 嵌入式Linux操作系统.
Oracle数据库 Oracle 子程序.
第三章 Windows多线程编程.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第三讲 多线程程序设计 课程网站:CourseGrading buaa.edu.cn 主讲教师: 赵长海
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
OpenMP简介和开发教程 广州创龙电子科技有限公司
CHAPTER 4 THREADS,SMP,AND MICROKERNELS
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
互斥与同步 操作系统实验2
进程及进程管理 第4章 进程及进程管理.
实验、进(线)程同步与通信 一、实验目的 1、掌握Linux系统用户界面中键盘命令的使用。 2、学会一种Linux下的编程环境。
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
走进编程 程序的顺序结构(二).
辅导课程六.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab8 1.
2018/12/7 Java语言程序设计-多线程 教师:段鹏飞.
临界区软件互斥软件实现算法.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
操作系统原理 Operating System Principles
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
临界区软件互斥软件实现算法 主讲教师:夏莹杰
Threads 线程 为什么要引入线程 线程(轻量级进程) WEB服务器 同时处理多个客户请求 创建多个进程降低响应时间
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
华南理工大学 陈虎 博士 多核处理器上的操作系统 华南理工大学 陈虎 博士
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
实验二、线程同步与通信 一、实验目的 1、掌握Linux下线程的概念; 2、了解Linux线程同步与通信的主要机制;
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
实验一 体验Nachos下的并发程序设计 陈毅东 2006年春.
第9章 多线程 王德俊 上海交通大学继续教育学院.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
信号量(Semaphore).
Pthread.
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
Google的云计算 分布式锁服务Chubby.
_07多连接之select模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab10 1.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第十七讲 密码执行(1).
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab11 1.
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab7.
Presentation transcript:

多线程编程  Linux 下线程 概述  linux 线程 实现

1 、 Linux 下线程 概述 进程是系统中程序执行和资源分配的基 本单位。每个进程有自己的数据段、代码 段和堆栈段。 线程通常叫做轻型的进程。线程是在共 享内存空间中并发执行的多道执行路径, 他们共享一个进程的资源。 因为线程和进程比起来很小,所以相对 来说,线程花费更少的 CPU 资源。

用户地址空间 线程一线程二 线程三 进 程进 程 图 1 进程与线程的关系

线程按照其调度者可分为用户级线程和内核级线 程两种。 ( 1 )用户级线程 主要解决的是上下文切换的问题,其调度算法和 调度过程全部有用户决定。 ( 2 )内核级线程 有内核调度机制实现。 现在大多数操作系统都采用用户级线程和内核级 线程并存的方法。用户级线程可与内核级线程实现 “ 一对一 ” , “ 一对多 ” 的对应关系。

2 、 linux 线程实现 以下线程均为用户级线程。在 linux 中, 一般采用 Pthread 线程库实现线程的访问与 控制,由 POSIX 提出,具有良好的可移植 性。

2.1 线程创建与退出 创建线程使用 pthread_create 函数。在线程创 建以后,就开始运行相关的线程函数。线程退出 时使用函数 pthread_exit, 是线程的主动行为。注 意进程退出时使用 exit 函数,线程中用 pthread_exit 替代 exit 。 由于一个进程中的多个线程共享数据段,因 此通常在线程退出后,退出线程所占用的资源并 不会随线程结束而释放。所有需要 pthread_join 函数来等待线程结束,类似于 wait 系统调用。

创建进程: #include pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) thread :线程标识符 attr :线程属性设置 start_routine :线程函数起始地址 arg :传递给 start_routine 的参数

进程退出: #include pthread_exit( void *retval ) retval : pthread_exit 调用者线程的返回 值,可由其他函数和 pthread_join 来检测获 取。

等待进程退出: #include pthread_join( pthread_t *th , void **thread_return ) th :等待线程的标识符 thread_return :用户定义指针,用来存储 被等待线程的返回值 线程实例见: thread.c

2.2 修改线程属性 在 thread_creat 函数中有设置线程属性 参数,这些属性包括绑定属性、分离属性、 堆栈地址、堆栈大小、优先级。系统默认 属性为非绑定、非分离、缺省 1M 的堆栈、 与父进程同样级别的优先级。 分别介绍绑定属性和分离属性。

1 、绑定属性 在 linux 系统中,可实现一个用户级线程 与一个内核级线程相对应的 “ 一对一 ” 线程机 制。绑定属性是指一个用户级线程固定的 分配给一个内核级线程。非绑定属性则是 指用户级线程与内核级线程的关系不是始 终固定的,而是由系统来控制分配。

2 、分离属性 分离属性是用来决定一个线程以什么样 的方式来终止自己。在非分离情况下,当 一个线程结束时,它所占用的系统资源并 没有完全释放,也没有真正终止。只有当 pthread_join() 函数返回时,该线程才释放 自己占用的资源。而在分离情况下,一个 线程结束时会立即释放它所占用的资源。

3 、属性设置 属性设置是由一定函数来完成的,通常调用 pthread_attr_init 函数进行初始化。设置绑定属性的 函数为 pthread_attr_setscope, 设置分离属性的函数 是 pthread_attr_setdetachstate, 设置线程优先级的 相关函数 pthread_attr_getschdparm (获取线程优 先级)和 pthread_attr_setschedparam (设置线程 优先级)。在设置完成属性后,调用 pthread_creat 函数创建线程。

线程属性初始化: #include int pthread_attr_init (pthread_attr_t *attr) attr :线程属性 返回值:成功 0 ,错误 -1 。

设置绑定属性: #include pthread_attr_setscope(pthread_attr_t *attr, init scope) attr :线程属性 scope : PTHREAD_SCOPE_SYSTEM( 绑 定 ) PTHREAD_SCOPE_PRCESS( 非绑 定 ) 返回值:成功 0 ,错误 -1 。

设置分离属性 : #include pthread_attr_setsetdetachstate(pthread_attr_t *attr, init detachstate) attr :线程属性 detachstate : PTHREAD_CREAT_DETACHED( 分离 ) PTHREAD_CREAT_JOINABLE( 非分离 ) 返回值:成功 0 ,错误 -1 。

获取线程优先级: #include int pthread_attr_getschedparam (pthread_attr_attr *attr, struct sched_param *param) attr :线程属性 param :线程优先级 返回值:成功 0 ,错误 -1 。

设置线程优先级: #include int pthread_attr_setschedparam (pthread_attr_attr *attr, struct sched_param *param) attr :线程属性 param :线程优先级 返回值:成功 0 ,错误 -1 。 线程实例见: pthread.c

2.3 mutex 互斥锁线程控制 mutex 是一种简单的加锁的方法来控制对 共享资源的访问。在同一时刻只能有一个 线程掌握某个互斥上的锁, 拥有上锁状态的 线程能够对共享资源进行访问。若其他线 程希望上锁一个已经被上了互斥锁的资源, 则该线程挂起,直到上锁的线程释放互斥 锁为止。

互斥锁的操作主要包括以下几个步骤: 互斥锁初始化: pthread_mutex_init 互斥锁上锁: pthread_mutex_lock 互斥锁判断上锁: pthread_mutex_trylock 互斥锁解锁: pthread_mutex_unlock 消除互斥锁: pthread_mutex_destroy

互斥锁可分为以下三种: 快速互斥锁: 递归互斥锁: 检错互斥锁: 这三种锁的主要区别在于其他未占有互斥锁的线 程在希望得到互斥锁时是否需要阻塞等待。 快速互斥锁是指调用线程会阻塞直到拥有互斥锁的线 程释放为止。 递归互斥锁能够成功返回并且增加调用线程在互斥上 加锁的次数。 检错互斥锁则为快速互斥锁的阻塞版本,他会立即返 回并得到一个错误。

互斥锁初始化: #include int pthread_mutex_init( pthread_mutex_t *mutex, constpthread_mutex_attr_t *mutexattr) Mutex :互斥锁 Mutexattr : PTHREAD_MUTEX_INITIALIZER: 创建快速互斥锁 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: 创建递归互斥锁 PTHREAD_REEORCHECK_MUTEX_INITIALIZER_NP: 创建检错互斥锁

互斥锁操作: #include int pthread_mutex_lock(pthread_mutex_t *mutex) int pthread_mutex_trylock(pthread_mutex_t *mutex) int pthread_mutex_unlock(pthread_mutex_t *mutex) int pthread_mutex_destroy(pthread_mutex_t *mutex) Mutex :互斥锁 返回值:成功 0 ,错误 -1 。 互斥锁实例见: mutex.c

2.4 信号量线程控制 信号量也就是操作系统中所用到的 PV 操作, 它广泛用于进程或线程间的互斥与同步。 PV 操作是对整数计数器信号量 sem 的操作。 一次 P 操作使 sem 减一,一次 V 操作使 sem 加一。 用于互斥时,几个进程(或线程)往往只设 置一个信号量 sem 。 用于同步时,往往设置多个信号量,并安排 不同的值了来实现它们之间的顺序执行。

开始 初始化信号量 V 操作 线程二执行 线程一执行 P 操作 结束 图 2 信号量互斥操作

开始 初始化信号量 V 操作 sem1V 操作 sem2 线程二执行 线程一执行 P 操作 sem1P 操作 sem2 结束 图 3 信号量同步操作

Linux 实现了 POSIX.1 的无名信号量,用于 线程的同步与互斥。信号量操作函数: sem_init: 用于创建一个信号量,并初始化它。 sem_wait 或 sem_trywait: 相当于 P 操作,它们 都能使信号量减一,两者区别在于当信号量小 于零时, sem_wait 会阻塞,而 sem_trywait 则 会立即返回。 sem_post: 相当于 V 操作,它将信号量的值加一 同时发出信号唤醒等待的进程。 sem_getvalue: 得到信号量的值。 sem_destroy: 删除信号量。 信号量实例见: sem_mutex.c sem_syn.c