线程

引入线程的动机:

①Web浏览器:一个线程来显示图像和文本,另一个线程从网络接受数据。
②字处理软件:一个线程用于显示图形,另一个线程用于响应用户的键盘操作,又可用一个线程在后台进行拼写和语法检查,还可用一个线程在后台定时存盘操作。
③Web服务器:执行多个类似的任务,可能有多个(可能数百个)客户并发访问它。

多线程结构:

每个正在运行的程序(即进程),至少包括一个线程,这个线程叫主线程。
主线程在程序启动时被创建,用于执行main函数。
只有一个主线程的程序,称作单线程程序。
主线程负责执行程序的所有代码。这些代码只能顺序执行,无法并发执行。

引入多线程的动机:

①单线程程序:只有一个线程,代码顺序执行,容易出现代码阻塞(页面假死)。
②多线程程序:有多个线程,线程间独立运行,能有效地避免代码阻塞,并且提高程序的运行性能。

引入线程的动机:

操作系统中引入进程的目的是为了使多个程序并发执行,以改善资源使用率和提高系统效率。
操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。

线程解决问题的基本思路:

①把进程的两项功能--“独立分配资源”与“被调度分派执行”分离开来。
②进程作为系统资源分配和保护的独立单位,不需要频繁地切换。
③线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换,在这种指导思想下,产生了线程的概念。

线程的概念:

线程是CPU使用的一个基本单元,线程控制块包括:
①线程ID
②程序计数器
③寄存器集
④堆栈空间

一个线程与同一个进程的其他线程共享:

①代码段
②数据段
③操作系统资源
总体为一个任务。
在这里插入图片描述

单线程结构进程给并发程序设计效率带来问题:

①进程切换开销大。
②进程通信代价大。
③进程间的并发性粒度较粗,并发度不高。
④不适应并行计算和分布并行计算的要求。
⑤不适合客户/服务器计算的要求。

多线程编程的优点:

①响应性:多线程编程,部分线程阻塞或执行冗长操作,整个程序还可以继续运行。
②资源共享:线程默认共享它们所属进程的内存和资源。
③经济:创建线程和切换线程更经济。
④可伸缩性:多个线程可以在多个处理核上并行运行。

多核编程:

①单核系统:并发仅仅意味着线程随着时间推移交错执行,因为处理核只能同一时间执行单个线程。
②多核系统:并发表示线程可以并行运行,系统可以为每一个核分配一个单独线程。

多线程编程的挑战:

①识别任务:分析应用程序,查找可以独立、并发的任务。
②平衡:平衡多个独立任务,尽量确保任务执行同等价值的工作
③数据分割:对数据进行分割,让由任务访问和操作数据也应划分以便运行在单独的核上
④数据依赖:分析多个任务之间的依赖关系
⑤测试与调试:多线程下的测试和调试变的复杂
在这里插入图片描述

多线程环境中进程的定义:

进程是操作系统中进行除处理器外的资源分配和保护的基本单位。
它有一个独立的虚拟地址空间,用来容纳进程映像(如与进程关联的程序与数据)。
以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程(进程间通信)。

多线程环境中的线程概念:

线程是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。

线程组成:

线程未运行时,可以把线程看成是进程中一个独立的程序计数器在操作。
用于存放线程局部变量及用户栈的私有存储区称为核心栈,核心态下工作时,保存参数,函数调用时的返回地址等。

线程又称轻量进程:

线程运行在进程的上下文中,并使用进程的资源和环境。
系统调度的基本单位是线程而不是进程,每当创建一个进程时,至少要同时为该进程创建一个线程,否则该进程无法被调度执行。

线程的状态:

①运行
②就绪
③堵塞

线程的实现:

从实现角度看,线程分成:
①内核级线程
②用户级线程
③混合式线程

内核级线程:

线程的管理工作由内核完成。

内核级线程的主要优点:

①在多处理器上,内核能够同时调度同一进程中的多个线程并行执行;
②若进程中的一个线程被阻塞,内核能够调度同一进程的其它线程占有处理器运行,也可以运行其它进程中的线程;
③切换速度快,内核自身也可以用多线程技术实现,从而提高系统执行效率。
④用户编程变得简单。
内核级线程的主要缺点:
①线程在用户态运行,调度和管理在内核实现,因此需要频繁进行模式切换,系统开销较大。
②需要修改操作系统。

用户级线程:

线程的管理由应用程序完成,在用户空间中实现,内核无须感知线程的存在。

用户级线程的主要优点:

①线程切换无须使用内核特权方式,可节省模式切换的开销和内核的宝贵资源;
②允许进程按照应用的特定需要选择调度算法;
③能够运行在任何操作系统上,内核无须做任何改变。
④不用修改操作系统,容易实现。

用户级线程的主要缺点:

①由于大多数系统调用是阻塞型的,因此,一个用户级线程的阻塞将引起整个进程的阻塞;
②用户级线程不能利用多重处理的优点。

多线程模型:

①多对一模型:
多个用户级线程映射到一个内核级线程,任一实践只有一个线程可以访问内核。
缺点:一个线程执行阻塞的系统调用时,整个进程都会阻塞。
在这里插入图片描述

②一对一模型:
每个用户线程映射到一个内核线程,该模型在一个线程执行阻塞系统调用时,能允许另一个线程继续运行。
缺点:创建一个用户线程就要创建一个内核线程。在这里插入图片描述

③多对多模型:
多路复用多个用户级线程到同样数量或者更少数量的内核级线程。
在这里插入图片描述

线程库:

线程包(库)提供一组API,支持应用程序创建、调度、撤销和管理线程的运行。基本线程控制原语:
①孵化(Spawn):又称创建线程。
②封锁(Block):又称阻塞线程。
③活化(Unblock):又称恢复线程。
④结束(Finish):又称撤销线程。

线程创建:

①异步线程:一旦父线程创建了一个子线程后,父线程就恢复自身执行,父进程与子进程并发执行。
②同步线程:父线程创建一个或多个子线程后,需等待所有子线程的终止,父进程才恢复执行。

线程池:

思想:进程开始时创建一定数量的线程,并加到池中等待工作,当服务器收到请求时,会唤醒池内的一个线程(有可用线程),并将需要服务的请求传递给它。一旦线程完成了服务,它会返回到池中再等待工作。如果池中没有可用线程,那服务器等待,直到有空线程为止。

线程池的优点:

①用现有线程服务请求比等待创建一个线程更快。
②线程池限制了任何时候可用线程的数量,对那些不能支持大量并发线程的系统非常重要。
③将要执行任务从创建任务的机制中分离出来,允许我们采用不同策略允许任务。

线程调度:

轻量级进程(LWP):在实现多对多或双层模型时,用户和内核级线程之间增加的中间数据结构
用户级线程:LWP为虚拟处理器,方便应用程序调度和运行用户线程。每个LWP与一个内核线程相连
内核级线程:操作系统进行调度
内核线程阻塞,LWP就会阻塞,与LWP相连的用户线程也会阻塞。
内核线程使用虚拟处理器(LWP)与用户线程通信
应用程序调度用户线程到LWP,内核通过回调的方式,执行回调处理程序,将特定事件通知应用程序。

一个用户线程阻塞时,内核向应用程序发回调,通知应用程序一个线程阻塞并对此进行标识。
内核分配一个新的虚拟处理器,应用程序在新的虚拟处理器上执行回调处理程序:保存阻塞进程状态,释放阻塞线程的虚拟处理器。
回调处理程序调度新的适合在新的虚拟处理器上运行的线程。
阻塞线程等待事件产生后,内核向线程库发出另一个会调,通知线程可以继续运行,这个回调程序也需要一个虚拟处理器,(内核可以分配新的虚拟处理器,或者抢占一个用户线程并在其虚拟处理器上运行回调处理程序)。
非阻塞线程可以继续运行时,应用程序可以在虚拟处理器上运行。

用户级线程:线程库进行管理。
核心级线程:操作系统进行调度。
用户级线程为了运行在CPU上,最终是需要用户级线程映射到内核线程上—轻量级进程(LWP)。
对于多对一个和多对多的模型:系统线程库调度用户级线程。这种方案称为:进程竞争范围(PCS)。竞争CPU发生在同一个进程的线程之间。
内核级线程调度:系统竞争范围(SCS)。
采用一对一模型的,只使用SCS。
PCS:优先级调度,用户级线程优先级由程序员设定。
PCS:优先级调度,用户级线程优先级由程序员设定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值