线程和进程

  1. 进程
    进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调动的一个独立单位。几乎所有的操作系统都支持进程的概念,所有运行中的任务通常对应一条进程。当一个程序进入内存运行,即变成一个进程。
    进程包含的三个特征:
    • 独立性: 进程是系统中独立存在的实体,他可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。
    • 动态性:进程和程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。在进程中加入了时间的概念。进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。
    • 并发性:多个进程可以在单个处理器上并发执行,多个进程直接不会相互影响。

并发性和并行性是两个概念,并行指在同一时刻,有多条指令在多个处理器上同时执行;并发指在同一时刻只能一个一条指令执行,但多个进程指令被快速轮换执行,我们感觉好像具有多个进程同时执行的效果。


对于一个cpu而言,它在某个时间点只能执行一个程序,也就是说只能运行一个进程,cpu不断地在进程之间轮换执行。但由于cpu的执行速度实相对于我们的感觉实在是太快了,所以感觉到好像多个进程之间在同时执行。

2.线程
线程被称作轻量级进程,线程是进程的执行单元。就像进程在操作系统中的地位一样,线程在程序中是独立的、并发的执行流。当进程被初始化后,主线程就被创建了。对于绝大多数的应用程序来说,通常仅要求有一个主线程,但我们也可以在该进程内创建多条顺序执行流,这些执行流就是线程,每条线程也是相互独立的。
线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不拥有系统资源,它与父进程的其他线程共享该进程所拥有的全部资源。因为多个线程共享父进程的全部资源,因此编程更加方便;但必须更加小心,我们必须确保线程不会妨碍统一进程里的其他线程。
线程是独立运行的,它并不知道进程中是否还有其他线程存在。线程的执行是抢占式的,也就是说,当前线程在任何时候都可能被挂起,以便另外一个线程可以运行。
一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
从逻辑角度来看,多线程存在于一个应用程序中,让一个应用程序中可以有多个执行部分同时执行,但操作系统无须将多个线程看做多个独立的应用,对多线程实现调度和管理以及资源分配。线程的调度和管理由进程本身负责完成。
简而言之,一个程序运行后至少有一个进程,一个进程里可以包括多个线程,但至少要包含一个线程。
多线程的优势
线程在程序中是独立的、并发的执行流,但是,与分割的进程相比,进程中的线程之间的隔离成都要小。他们共享内存、文件句柄和其他每个进程应有的状态。
因为线程的划分尺度小于进程,是的多线程程序的并发性好。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性:多个线程共享同一个进程虚拟空间。线程共享的环境包括:进程代码段、进程的公有数据等。利用这些共享的数据等,线程很容易实现相互之间的通信。
当操作系统创建一个进程事,必须为该进程分配独立的内存空间,并分配大量相关资源;但创建一个线程则简单的多,因才使用多线程来实现并发比使用多进程实现并发的性能要高的多。
总结起来,多线程编程包含如下几个有点:

  • 进程间不能共享内存,但线程之间共享内存非常容易。
  • 系统创建进程需要为该进程重新分配系统资源,但创建线程则代价小得多,因此使用多线程来实现多任务比并发多进程的效率高。
  • Java语言内置多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Java多线程编程。
Java中的线程进程是操作系统中两个基本的概念,它们在执行上下文中有着不同的含义: 1. **进程**(Process): 进程是操作系统分配资源的基本单位,每个进程都有自己的独立内存空间和系统资源。Java程序运行时会创建一个对应的JVM(Java Virtual Machine),JVM中可以有多个并发执行的线程进程的切换是由操作系统内核控制的,切换开销相对较高。 2. **线程**(Thread): 线程是在同一个进程中并行执行的轻量级实体,它们共享同一块内存空间,因此相比于进程线程之间的通信更快、切换更频繁。在Java中,每个Java应用至少有一个主线程,用户可以通过继承Thread类或实现Runnable接口来创建新的线程。 **主要区别**: - **资源占用**:进程拥有独立的内存空间,而线程共享进程的内存,所以线程更节省资源。 - **并发性**:同一进程内的线程可以直接相互访问数据,易于实现并发控制;而不同进程间的数据交换需要通过I/O操作。 - **调度粒度**:进程调度由操作系统进行,线程调度则由JVM或操作系统的用户级线程管理器完成,线程切换更快速。 - **同步与通信**:线程之间通常通过锁、条件变量等同步机制协作,而进程间的通信通常使用管道、消息队列等机制。 **相关问题**: 1. Java如何创建和管理线程? 2. 进程线程在性能优化上有什么考虑? 3. 在并发编程中,为什么要避免不必要的线程创建?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值