首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
编程语言
> 详细
第7章 线程
时间:
2016-05-12 14:47:34
阅读:
174
评论:
0
收藏:
0
[点我收藏+]
标签:
7.1 进程的分身术--线程(Thread)
process 只能干一件事情,所有的task 都需要串行执行,对资源的利用率、和一个job的效率都比较地;这时如果想让一个进程并发干多件事情,我们就引入了进程的"分身术“---线程;线程是进程的分身术,是进程不同的执行序列;也就是不同的代码序列(代码转换未指令集由cpu 来执行)
线程从一个角度上理解就是一个、一个进程的执行序列;一个进程可以有多个执行序列,也就是有多个线程
线程的另外一个核心作用
:提高计算机多core的利用率,如果一个进程只有一个线程,那这个进程(唯一的线程)最多可以占用一个core,即便是这个core 100%,其他的core 也是空闲的;但如果是多个Thread 那就可以每个线程占用一个core的资源,合理利用所有core的资源
进程、线程的一个典型case
:打开一个word 文件,进行编辑时就打开了多个线程:
首先打开word程序---进程
1个线程负责显示word的内容(窗形显示)
1个线程负责接受I/O输入;键盘、鼠标
1个线程负责把修改的数据保持到磁盘(定时保持)
这写线程同时运行,保证我们可以同时看到显示、同时输入数据、同时默认保存数据,可以很流畅、自然的给用户提供服务
7.2 线程的管理
进程需要进程管理,那线程也需要线程管理;线程相关的信息和数据都放在线程控制快里面;跟进程不同,所有的线程都属于同一个进程,发明线程就是在一个程序(进程)里面
并发执行多个task,所以多个线程协同工作可以最大的提升效率;所以资源共享也是多线程追求的一个目标;但不是所有的资源都可以共享的;
共享的资源
地址空间(各种资源:内存、全局变量、磁盘、文件、。。。)
信号以及信号服务程序
不可以共享的资源
程序计数器
寄存器
栈信息
7.3 线程的实现方式
因为线程是由进程产生,那是由进程自己来管理线程、还是由操作系统自己来管理;2种方式就出现了:用户态线程实现和内核态线程实现;
因为进程是在cpu上实现并发,也就是需要操作系统对各个进程进行cpu 切换,所以所有的进程都是操作系统来管理,也就是所有进程都是内核态实现方式
内核态线程的实现:
操作系统来管理线程,就跟操作系统管理进程是相似的,就是给线程分配一个线程控制块(线程表);统一放在内存中,这样os系统就可以分配cpu 到不同的进程,不同的线程,实现线程和进程一样的资源管理、和效率调度;
但用户态的线程有缺点:1). 因为线程很多,如果线程控制快都放在内核空间,那内核空间很快就满了,占满后如果新的线程创建失败,会导致进程出现问题 2). 而且如果让操作系统来管理线程,还需要说服操作系统来修改代码,再线程没有证明自己的时候是不可能是实现的
用户态线程的实现
用户态线程就是所有的线程都是进程自己创建、自己管理;os 都不需要知道线程的存在;因为进程获取CPU 的控制权后可以分配给下面的线程;但是进行也没有强制从一个线程的cpu 剥夺或者转移,所以所有的线程如果并发执行,必须采取合作的方式;
既然进程要管理所有的线程:就需要进程自己写一个执行系统(runtime system)作为线程的调度器,也就是必须有一个线程专门负责线程的调度工作,一般我们把这个线程成为
主线程,或者管理线程
因为主线程没有cpu的管理权限,所以线程的调度(cpu 的切换)必须采用线程合作的方式,就是主线程设置每个线程获取cpu的时间,每个线程时间到后必须释放出cpu的控制权,然后主线程通知另外一个线程去获取cpu然后开始执行
用户态线程的缺点: 如果一个线程阻塞(I/O: 写磁盘) 这时就不能释放cpu,到时时间后,操作系统会收回cpu直接给另外一个进程:一般可以采取2此机会,就是如果os 获取cpu控制器后,再跟进程(主线程) 确认下是否还有其他的线程等待执行,如果有继续把cpu给进程,然后主线程通知另外一个线程接收cpu继续运行
用户台缺点:二次机会会导致os 调用用户程序,这是如果用户程序写一段病毒,会导致os出现崩溃,所以安全问题非常大
7.4 现代操作系统的线程实现
因为用户态线程和内核态线程都有自己的优缺点,所以现代操作系统就结合2种方式来实现多线程的方式:
在进程创建线程时(现在高级语言写代码的时候,都已经封装到类库里面了,所以写程序基本感知不到)会创建2类线程;一类是用户态线程(数量多),一类是内核态线程(数量少),这样用户态线程用主线程来管理,内核态线程用os来管理
可以在一个进程里面对线程进行分组,多个用户态线程+ 1个内核态线程 = 1个线程组,
内核线程用来执行阻塞概率比较大的task,用户态线程执行阻塞概率比较小的task
但是如果用户态线程还是阻塞了,但这个组的线程也就阻塞了;其他的线程组还可以正常工作
第7章 线程
标签:
原文地址:http://blog.csdn.net/caoshuming_500/article/details/51362025
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
Spring Cloud 从入门到精通(一)Nacos 服务中心初探
2021-07-29
基础的排序算法
2021-07-29
SpringBoot|常用配置介绍
2021-07-29
关于 .NET 与 JAVA 在 JIT 编译上的一些差异
2021-07-29
C语言常用函数-toupper()将字符转换为大写英文字母函数
2021-07-29
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
2021-07-28
4-1 YAML配置文件 注入 JavaBean中
2021-07-28
【python】 用来将对象持久化的 pickle 模块
2021-07-28
马拉车算法
2021-07-28
用Python进行冒泡排序
2021-07-28
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!