线程

引入线程的动机:

①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:优先级调度,用户级线程优先级由程序员设定。

热门文章

暂无图片
编程学习 ·

那些年让我们目瞪口呆的bug

程序员一生与bug奋战,可谓是杀敌无数,见怪不怪了!在某知识社交平台中,一个“有哪些让程序员目瞪口呆的bug”的话题引来了6700多万的阅读,可见程序员们对一个话题的敏感度有多高。 1、麻省理工“只能发500英里的邮件” …
暂无图片
编程学习 ·

redis的下载与安装

下载redis wget http://download.redis.io/releases/redis-5.0.0.tar.gz解压redis tar -zxvf redis-5.0.0.tar.gz编译 make安装 make install快链方便进入redis ln -s redis-5.0.0 redis
暂无图片
编程学习 ·

《大话数据结构》第三章学习笔记--线性表(一)

线性表的定义 线性表:零个或多个数据元素的有限序列。 线性表元素的个数n定义为线性表的长度。n为0时,为空表。 在比较复杂的线性表中,一个数据元素可以由若干个数据项组成。 线性表的存储结构 顺序存储结构 可以用C语言中的一维数组来…
暂无图片
编程学习 ·

对象的扩展

文章目录对象的扩展属性的简洁表示法属性名表达式方法的name属性属性的可枚举性和遍历可枚举性属性的遍历super关键字对象的扩展运算符解构赋值扩展运算符AggregateError错误对象对象的扩展 属性的简洁表示法 const foo bar; const baz {foo}; baz // {foo: "bar"…
暂无图片
编程学习 ·

让程序员最头疼的5种编程语言

世界上的编程语言,按照其应用领域,可以粗略地分成三类。 有的语言是多面手,在很多不同的领域都能派上用场。大家学过的编程语言很多都属于这一类,比如说 C,Java, Python。 有的语言专注于某一特定的领域&…
暂无图片
编程学习 ·

写论文注意事项

参考链接 给研究生修改了一篇论文后,该985博导几近崩溃…… 重点分析 摘要与结论几乎重合 这一条是我见过研究生论文中最常出现的事情,很多情况下,他们论文中摘要部分与结论部分重复率超过70%。对于摘要而言,首先要用一小句话引…
暂无图片
编程学习 ·

安卓 串口开发

上图: 上码: 在APP grable添加 // 串口 需要配合在项目build.gradle中的repositories添加 maven {url "https://jitpack.io" }implementation com.github.licheedev.Android-SerialPort-API:serialport:1.0.1implementation com.jakewhart…
暂无图片
编程学习 ·

2021-2027年中国铪市场调研与发展趋势分析报告

2021-2027年中国铪市场调研与发展趋势分析报告 本报告研究中国市场铪的生产、消费及进出口情况,重点关注在中国市场扮演重要角色的全球及本土铪生产商,呈现这些厂商在中国市场的铪销量、收入、价格、毛利率、市场份额等关键指标。此外,针对…
暂无图片
编程学习 ·

Aggressive cows题目翻译

描述&#xff1a; Farmer John has built a new long barn, with N (2 < N < 100,000) stalls.&#xff08;John农民已经新建了一个长畜棚带有N&#xff08;2<N<100000&#xff09;个牛棚&#xff09; The stalls are located along a straight line at positions…
暂无图片
编程学习 ·

剖析组建PMO的6个大坑︱PMO深度实践

随着事业环境因素的不断纷繁演进&#xff0c;项目时代正在悄悄来临。设立项目经理转岗、要求PMP等项目管理证书已是基操&#xff0c;越来越多的组织开始组建PMO团队&#xff0c;大有曾经公司纷纷建造中台的气质&#xff08;当然两者的本质并不相同&#xff0c;只是说明这个趋势…
暂无图片
编程学习 ·

Flowable入门系列文章118 - 进程实例 07

1、获取流程实例的变量 GET运行时/进程实例/ {processInstanceId} /变量/ {变量名} 表1.获取流程实例的变量 - URL参数 参数需要值描述processInstanceId是串将流程实例的id添加到变量中。变量名是串要获取的变量的名称。 表2.获取流程实例的变量 - 响应代码 响应码描述200指…
暂无图片
编程学习 ·

微信每天自动给女[男]朋友发早安和土味情话

微信通知&#xff0c;每天给女朋友发早安、情话、诗句、天气信息等~ 前言 之前逛GitHub的时候发现了一个自动签到的小工具&#xff0c;b站、掘金等都可以&#xff0c;我看了下源码发现也是很简洁&#xff0c;也尝试用了一下&#xff0c;配置也都很简单&#xff0c;主要是他有一…
暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法&#xff0c;在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较&#xff0c;从而确定目标数是在中间数的左边还是右边&#xff0c;将查…
暂无图片
编程学习 ·

项目经理,你有什么优势吗?

大侠被一个问题问住了&#xff1a;你和别人比&#xff0c;你的优势是什么呢? 大侠听到这个问题后&#xff0c;脱口而出道&#xff1a;“项目管理能力和经验啊。” 听者抬头看了一下大侠&#xff0c;显然听者对大侠的这个回答不是很满意&#xff0c;但也没有继续追问。 大侠回家…
暂无图片
编程学习 ·

nginx的负载均衡和故障转移

#注&#xff1a;proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_dir; #设置Web缓存区名称为cache_one&#xff0c;内存缓存空间大小为200MB&#xff0c;1天没有被访问的内容自动清除&#xff0c;硬盘缓存空间大小为30GB。 pro…
暂无图片
编程学习 ·

业务逻辑漏洞

身份认证安全 绕过身份认证的几种方法 暴力破解 测试方法∶在没有验证码限制或者一次验证码可以多次使用的地方&#xff0c;可以分为以下几种情况︰ (1)爆破用户名。当输入的用户名不存在时&#xff0c;会显示请输入正确用户名&#xff0c;或者用户名不存在 (2)已知用户名。…