进程与线程(Process & Thread)
一.理论
(1)Process
从操作系统角度
进程(process)会分配到cpu时间片,分配到memory空间,这就是程序的运行环境.是由操作系统维护的资源实体.所以有一些性质:
1.可以被创建,回收,挂起,运行,死亡;
2.进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;
3.从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。
通俗的说:当一个进程放弃执行(准确的说是放弃占有CPU),而被操作系统交换到硬盘上,使别的进程有机会运行的时候,在那个进程里的所有数据也将被写到硬盘上,甚至包括整个系统的核心(core memory).
就java而言:JVM就几乎相当于一个进程(process),因为只有进程才能拥有堆内存(heap,也就是我们平时用new操作符,分出来的内存空间)。
(2)Thread
从os角度
Thread包含一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代 码流。
多cpu并发应用中,多线程由为重要.单cpu情况多线程不提高cpu的处理能力,只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。
另外,如果应用程序必须等待网络连接或数据库连接等数据吞吐速度相对较慢的资源时,多线程应用程序是非常有利的。
就java而言,线程是由JVM执行的二进制指令。这里面没有对象(Object)甚至没有方法(Method)的概念。
指令执行的序列可以重叠,并且并行的执行。
线程是有序的指令,而不是方法(method)。
线程的数据结构,与进程相反,仅仅只包括执行这些指令的信息。
它包含当前的运行上下文(context):如寄存器(register)的内容、当前指令的在运行引擎的指令流中的位置、保存方法(methods)本地参数和变量的运行时堆栈。如果发生线程切换,OS只需把寄存器的值压进栈,然后把线程包含的数据放到某个类似列表(LIST)的地方;把另一个线程的数据从列表中取出,并且用栈里的值重新设置寄存器。切换线程更加有效率,时间单位是毫秒。对于Java而言,一个线程可以看作是JVM的一个状态。
运行时堆栈(也就是前面说的存储本地变量和参数的地方)是线程数据结构一部分。这是因为多个线程,每一个都有自己的运行时堆栈,也就是说存储在这里面的数据是绝对线程安全的。因为可以肯定一个线程是无法修改另一个线程的系统级的数据结构的。也可以这么说一个不访问堆内存的(只读写堆栈内存)方法,是线程安全的(Thread Safe)。
二.java中线程安全与同步
信号量是任何可以让两个线程为了同步它们的操作而相互通信的对象。Java也是通过信号量来实现线程间通信的。如果没有synchronized关键字,就无法用JAVA实现信号量,但是仅仅只依靠它也不足够。
计算机的汇编指令顺序的执行,这些指令的执行是不被打断。指令试图测试一个比特(bit),然后设置各种二进制位来表示测试的结果,如果这个bit没有被设置,指令就设置它。这可以说是非常原始的信号量,因为当两个线程同步的企图设置一个bit的值时,只有一个线程可以成功,两个线程都会检查结果,看看是不是自己设成功了。
如果bit已经被设置(这里说的是有线程竞争的情况下),失败的JVM(线程)不得不离开操作系统的核心进程等待这个bit位被清零。这样来回的在系统核心中切换是非常耗时的。在NT系统下,需要600次机械指令循环来进入一次系统内核,这还仅仅是进入所耗费的时间还不包括做操作的时间。
线程安全,是指一个方法可以在多线程的环境下安全的有效的访问进程级的数据(这些数据是与其他线程共享的)。事实上,线程安全是个很难达到的目标。一般不操作对象状态信息(例如数据成员)的方法都不需要同步,例如:一些方法只访问本地变量(也就是说在方法内部声明的变量),而不操作类级别的数据成员,并且这些方法不会通过传入的引用参数来修改外部的对象。符合这些条件的方法都不需要使用synchronization这种重量级的操作。除此之外,还可以使用一些设计模式(Design Pattern)来避免同步,如Decorator模式.
三.协作
分享到:
相关推荐
4. **线程与工人**:在一个车间里,有许多工人协同完成任务,这里的工人可以对应于进程中的线程。一个进程可以包含多个线程,它们共同完成同一项任务的不同部分。 5. **共享资源**:车间的空间(例如工具间、仓库等...
在操作系统课程设计中,Linux进程与线程的通信是一个核心且复杂的主题。在这个项目中,学生将深入理解操作系统内核如何管理和协调不同进程和线程之间的数据交换,从而实现高效的任务执行。以下是对这个主题的详细...
本文将详细讲解如何使用C#语言来创建一个简单的进程与线程管理器,适合初学者入门。 首先,让我们了解基础概念。进程是操作系统中正在运行的一个程序实例,每个进程都有独立的内存空间,而线程则是进程内的执行单元...
嵌入式Linux开发教程深入探讨了进程与线程的概念及其在操作系统中的实现,这对于理解和开发高效、并发的嵌入式应用程序至关重要。以下是这些知识点的详细解释: **一、基础知识:线程和进程** 1. **进程**:是操作...
总结,理解和掌握C++中的进程与线程是编写高性能、并发应用程序的关键。正确地利用它们可以提高程序的效率,但同时也需要关注同步和通信的细节,以避免潜在的问题。通过实践和学习,开发者能够更好地驾驭这个强大的...
对于初学者来说,理解进程与线程的关系至关重要,因为这有助于深入掌握操作系统的基本原理及应用。下面将详细阐述进程与线程之间的区别及其相互作用。 #### 一、进程的概念 进程是程序的一次执行过程,是系统进行...
进程与线程是操作系统中重要的概念,它们是执行程序的基础。在计算机系统中,进程可以理解为一个资源分配的基本单位,包含应用程序运行所需的所有资源,如内存、输入/输出设备等。而线程则是执行的基本单元,是进程...
鉴于网上和一些教材上对进程和线程说明不是很全面,在对这方面知识学习之后,进行了总结,对操作系统中进程与线程的关系和一些应用进行了整理,希望对有这方面需要的同道中人有所帮助。
在计算机科学领域,进程与线程是操作系统中最基础且至关重要的概念。进程是程序执行时的一个实例,每个进程都有自己的独立内存空间,包括代码、数据、堆栈等资源。线程则是进程内的一个执行单元,它共享进程的内存...
了解和掌握进程与线程的区别和交互机制,对于编写高效的多线程程序至关重要。通过互斥锁和信号量等同步工具,我们可以有效地控制线程的并发访问,确保程序的正确性和性能。在实际开发中,合理地使用进程和线程,结合...
操作系统中的进程与线程是计算机科学中两个基本的并发执行单元。进程是操作系统资源分配的基本单位,它拥有独立的内存空间,包括代码、数据、堆栈等资源,而线程则是执行调度的基本单位,线程共享同一进程的内存资源...
"easx.rar_进程与线程"这个压缩包文件显然包含了与易语言(EasyLanguage)相关的幼儿算术程序源码,这为易语言爱好者提供了一个学习和研究进程与线程如何在实际应用中运作的机会。 易语言是一种面向对象、简单易学...
3. **线程与工人** - 在一个车间里,有许多协同工作的工人,这对应于一个进程中可以有多个线程。 - 线程是任务执行的最小单元,它们共享同一份内存空间,共同完成进程的任务。 4. **内存共享与资源限制** - 就像...
标题中的“tph.zip_进程与线程”表明这是一个关于操作系统中进程和线程概念的压缩包文件,可能包含了一些示例代码或者教学材料。在IT领域,进程和线程是计算机程序执行时的重要概念。 **进程**是操作系统中运行程序...
综上所述,理解和掌握进程线程的创建、结束、暂停与恢复、同步与通信等知识对于编写高并发、高效能的多线程程序至关重要。在实际编程中,需要根据系统特性选择合适的线程管理机制,并遵循最佳实践以保证程序的稳定性...
"Android Task 进程与线程详解" Android 中的 Task 概念是指一组以栈的模式聚集在一起的 Activity 组件集合,具有潜在的前后驱关联。Task 的主要作用是将组件之间的连接,从进程概念的细节中剥离出来,可以以一种...
标题"Mis.rar_进程与线程"涉及到计算机操作系统中的核心概念——进程和线程。在计算机系统中,进程是程序的执行实例,每个进程都有独立的内存空间,而线程则是进程内部的一个执行流,共享同一进程的资源。陶善文的...
在这个"MFC进程与线程Demo程序"中,我们可以深入理解并实践如何在MFC环境中管理进程和线程。 首先,进程是操作系统分配资源的基本单位,而线程则是执行的基本单位。在MFC中,我们可以使用`CWinApp`类来创建和管理...
在本实验中,我们主要探讨了如何使用C++模拟查看进程与线程,以及了解操作系统中进程和线程的基本概念。实验目标旨在深入理解进程的生命周期,以及它们在Windows 2000操作系统中的表现。 首先,我们编写了一个简单...