文档章节

菜鸟之旅——学习线程(基础)

o
 osc_e4gzv47r
发布于 2018/02/12 09:32
字数 2233
阅读 0
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

  在现在的软件编程中,不可避免的会用到多线程或者其他方式来实现异步的目的,那么,线程是个什么东西,如何使用?这些都是需要去学习与摸索的东西。不过在学习线程之前,还是有一些知识需要掌握的,虽说都是书本上的东西,但是还是对线程的学习有一定的作用的。

 

进程

 目的

  现在的计算机存在很多的操作系统(OS),大部分操作系统都是实时操作系统,可以实时的响应用户的操作,它们往往都有共同的基本特征:并发、共享虚拟,进程的产生于并发、共享有很大的联系。

  操作系统可以“同时”运行着很多的程序,并且很多程序有可能会有通讯、共同使用某些I\O设备,比如打印机之类的,这些都是操作系统为我们提供的诸多便利,但是实际上CPU在同一时刻只能处理一道程序,但是操作系统却实现了程序并发的特征,这是因为在微观上是因为多个程序交替使用CPU和其他资源;但是在多道程序环境下,程序之间将会失去封闭性,并具有间断性及不可再现性,为了能够更好的实现并发特征,引入了进程这一概念。每个进程通过一种时间片轮转调度算法来进行调度,分配运行时间片,在时间片内可以使用CPU或是其他资源,由于时间片非常短暂,用户感觉不到进程之间的切换。

  注意:在多处理机上,每个处理机可以处理不同的程序,可以说是真正的并发。

 定义

  从不同的角度,进程可以有不同的定义,比较典型的定义有:

  1、进程是程序的一次执行过程。

  2、进程是一个程序及其数据在处理机上顺序执行时所发生的活动。

  3、进程是具有独立功能的程序在一个数据集上运行的过程,是操作系统进行资源分配和调度的一个独立单位。

 组成

  PCB:进程控制块,为了使参与并发执行的程序(含数据)能够独立的运行,更好的并发且不会冲突,于必须给进程配置一个专门的数据结构,操作系统利用PCB来控制和管理进程,PCB是进程的唯一标识

  程序段:程序段就是能被进程调度程序调度到CPU执行的程序代码段,注意程序是固定的,可以被多个进程共享,就是说多个进程可以运行同一段程序。

  数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。

  由PCB、程序段和数据段三部分构成了进程映像,进程的创建就是创建进程映像中的PCB,进程的撤销就是撤销进程的PCB。在引入进程映像的概念后,可以把传统操作系统中的进程定义为:进程是进程映像的运行过程,是系统进行资源分配和调度的一个独立单位。进程是动态的,而进程映像是静态的。

 状态

  进程存在5种状态,分别是创建、就绪、运行、阻塞和终止,而进程大部分时间是在就绪、阻塞和终止三个状态下切换。
             

  进程的切换:进程切换就是处理机(CPU)从一个进程的运行转到另一个进程上,进程的运行环境发生了实质性的变化:

  1、保存CPU上下文,包括程序计数器和其他寄存器;

  2、更新PCB信息;

  3、把进程的PCB移入相应的队列,比如就绪或者等待队列;

  4、选择另一个进程运行,更新其PCB;

  5、更新内存管理的数据结构;

  6、恢复CPU上下文信息。

 

线程 

  我们从上面简单的回顾了一下进程的基本知识,当然,进程还有很多知识点没有介绍到,因为本人能力有限,就不更多的介绍了。下面开始回顾线程的基本知识:

 目的

  进程的引入是为了解决操作系统实现多个程序并发执行,进程的出现使各个程序在并发执行具有良好的封闭性,在进程切换的时候总会消耗一些资源,有一定量的时空消耗,但是随着软件复杂度提升,进程所占用的资源也会变多,在进程切换时需要付出更多的时空开销!于是为了减小程序在并发执行时所付出的时空开销,提升操作系统的并发性能,便引入了线程的概念。

 定义

  对于线程的最直接理解就是:轻量级进程,它是一个基本的CPU执行单元,由线程ID、程序计数器、寄存器集合和堆栈组成;线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一些在运行中必不可少的资源,但是可以与同一进程下的线程共享进程的全部资源。

  引入线程之后,进程的内涵发生了变化,进程只作为除CPU以外系统资源的分配单元,线程则作为CPU的分配单元,进程内线程切换时不会引起进程切换,减少时空开销。

 与进程的比较

   1、调度:在传统的操作系统中,拥有资源和独立调度的基本单位都是进程,在引入线程之后,线程则变为独立调用的基本单位,进程则是拥有资源 的基本单位;同一进程内线程切换不会引起进程的切换,但是不同进程间的线程切换则会引起进程的切换。

  2、拥有资源:进程是拥有资源的基本单位,而线程不拥有系统资源(除一些必不可少的资源),但是线程可以使用其进程的资源。

  3、系统开销:由于线程并不拥有系统资源,所以同一进程下线程在被调度到CPU执行时,只需保存和设置少量寄存器内容,而无需保存、更新进程在CPU运行的环境,所付出的时空开销相对变得更少。

  4、并发性:在引入线程的操作系统中,由于线程不论在创建、撤销或者在调度切换时时空消耗更低,且进程间的线程切换也不会引起进程的切换,所以在整体的并发性能上,引入线程的操作系统吞吐量更高。

总结

  进程:计算机的CPU在同一时刻只有一道程序运行,且CPU是高速的,若是CPU等待程序的其他资源就绪,就会造成CPU的性能浪费,若是并发执行程序,在等待当前程序的其他资源就绪时,先去运行别的程序,就可以尽量减少CPU性能的浪费;这时引入了进程的概念,且CPU是以时间片调度的方式运行进程,进程的出现使得多到程序并发执行具有良好的封闭性和可控,使得操作系统拥有可控、稳定的并发性能。

  线程:进程作为系统资源和调度的基本单元本身是没什么问题,但是随着程序的日渐复杂,进程所拥有的资源变多,在进程被调度到CPU进行切换时,CPU需要保存当前进程的运行环境和设置要执行进程的运行环境,这里所付出的时空开销会越来越大;为了减少在调度时的开销,引入了更轻量的进程-线程,这时进程不再作为调度的基本单元,线程变为调度的基本单元,线程在进行切换要比进程的切换的开销小很多,这时操作系统的并发性能能够得到更良好的应用。

  总结的知识点不是很多,深一层的运行机制、数据结构和调度算法等,因本人知识限制都没有涉及到,这里还需要后续的学习。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.6K
16
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
8K
8
Javascript图元绘制库--ternlight

基于HTML CANVAS API的Javascript库,提供在HTML页面上绘制图元——如流程图的能力。 目前已支持简单的矩形图元和图元间的连线(直线、直角连线两种),拖拽图元等能力。 该javascript librar...

fancimage1
2013/02/07
6.3K
1
实时分析系统--istatd

istatd是IMVU公司工程师开发的一款优秀的实时分析系统,能够有效地收集,存储和搜索各种分析指标,类似cacti,Graphite,Zabbix等系统。实际上,istatd修改了Graphite的存储后端,重新实现了...

匿名
2013/02/07
3.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

历史上第一个聊天机器人:200 行代码就能欺骗人类感情

在 1964 年至 1966 年间,麻省理工学院人工智能实验室的德裔美国计算机科学家约瑟夫·维森鲍姆(Joseph Weizenbaum)开发了历史上第一个聊天机器人 —— Eliza。 Eliza 的名字源于爱尔兰剧作...

摆摊卖报纸
11分钟前
23
0
WordPress文章页面获取评论次数

页面的评论次数 主要调用在文章的开始,让读者方便的点击,参与评论,这里我们是获取本篇文章的评论次数,不是评论的人数。 通过以下代码轻松实现: <?php if( $posts ) : ?> <?php foreach...

osc_ho1lz6z7
11分钟前
0
0
JavaScript 预编译过程的详细解读

文章目录 JavaScript运行三部曲 JavaScript预编译 01 关于预编译的一些知识点 02 预编译四部曲(局部) 1. 创建AO对象(Activation Object) (执行期上下文) 2. 找形参和变量声明,将变量和形参...

osc_vo0yi5f8
13分钟前
5
0
WordPress页面添加打印功能

页面打印 功能方便我们快速链接打印机,有很多插件,这里介绍代码实现的方法。 1、html添加打印链接 <a href="javascript:printme()" target="_self">打印</a> 2、js函数 在你的wp中引入下面......

osc_hzf6peqc
14分钟前
0
0
wordpress文章页面添加字体增大减小链接

字体的大小 影响读者的视觉感受,我们可以在wordpress的文章页面single.php上通过js添加字体的增大减小按钮,来方便字体大小的调整。 1、在single.php文章页面添加Js <script type="text/jav...

osc_0qnrwmy3
16分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部