【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

Java 高并发相关--多线程基础概念

转载 2016年08月31日 10:52:51

进程&线程的相关概念

进程的定义 from 百度百科
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
狭义定义:进程是正在运行的程序的实例。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
总结 :
1) 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
2) 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

线程的定义 from 百度百科
线程,有时被称为轻量级进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
特点 :
1) 轻型实体
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。
线程的实体包括程序、数据和TCB。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。而线程的动态特性由线程控制块TCB(Thread Control Block)描述。TCB包括以下信息:
(1)线程状态。
(2)当线程不运行时,被保存的现场资源。
(3)一组执行堆栈。
(4)存放每个线程的局部变量主存区。
(5)访问同一个进程中的主存和其它资源。
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。
2) 独立调度和分派的基本单位
在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)
3) 可并发执行
在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。
4) 共享进程资源
在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核

线程与进程的区别
1)地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度和切换:线程上下文切换比进程上下文切换要快得多。
4)在多线程OS中,进程不是一个可执行的实体。

守护线程
守护线程是特殊的线程,一般用于在后台为其他线程提供服务,守护线程会在非守护线程都结束时自动终止。

多线程的安全问题
线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与分隔的进程相比,进程中的线程之间的隔离程度要小,它与父进程的其它线程共享父进程所拥有的全部资源,包括内存、文件句柄和其它每个进程应有的状态。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。当数个线程对同一资源进行修改时,会导致意料之外的结果。
例:
假设有一个共用的变量名为list的ArrayList ,有两个线程A和B,A执行的是list.get(list.size()-1),B执行的是list.remove(list.size()-1),运行前list里有10个元素。
A线程先运行,list.size()-1得到的结果是9,正打算get(9)的时候 CPU 调度线程A暂停,线程 B 得到运行的机会并开始运行, list.remove(list.size()-1)把list中的索引为9的元素删除了。
其后A线程获得CPU调度,继续运行get(9),但此时9 = list.size(),索引为9的元素不存在,将会抛出IndexOutOfBoundsException 。

举报

相关文章推荐

Java多线程发展简史(转)

转载自:http://www.raychase.net/698这是篇关于并发的文章,其实一看到标题我就知道是篇不错的文章,因为知道一个技术点的发展历史,将来的规划,在整个技术蓝图中占的是什么位置,这会对我们更全面的了解这个技术点有很大的帮助。是凡这类的文章,我看过的基本上都是不错的,因为是从一个更高的角度的看待一项技术了,ok,开始吧。   这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的Knowledge Sharing的一个整理,我希望能对
  • googi
  • googi
  • 2012-10-08 13:49
  • 371

高并发Java 二 多线程基础

1. 什么是线程线程是进程内的执行单元某个进程当中都有若干个线程。使用线程的原因是,进程的切换是非常重量级的操作,非常消耗资源。如果使用多进程,那么并发数相对来说不会很高。而线程是更细小的调度单元,更...

Java多线程发展简史

这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的Knowledge Sharing的一个整理,我希望能对Java从第一个版本开始,在多线程编程方面的大事件和发展脉络有一个描述,并且提及一些在多线程编程方面常见的问题。对于Java程序员来说,如果从历史的角度
  • lk557
  • lk557
  • 2012-10-10 10:08
  • 260

java多线程与高并发库应用(一)线程基础概念

基础概念: 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。 线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有...

从JAVA多线程理解到集群分布式和网络设计的浅析

由于最近工作原因,很久没有在CSDN上留下些啥,今天在这些篇文章,是关于<span style="" lang="EN-U
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)