JVM 进程、线程

/ Linux / 没有评论 / 1417浏览

JVM 进程、线程

很多程序员对于线程和进程还不是很清楚。尤其是在面试官问到 Redis 的知识的时候,很容易掉进面试陷阱。

其实我在 3 年前也写过一篇《线程和进程》。现在还有很多网友问起我,我这里再做一篇分享。

进程

我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务调度、资源分配管理,统领整个计算机硬件;应用程序是具有某种功能的程序,程序是运行于操作系统之上的。

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。

进程具有的特征:

线程

线程是程序执行中一个单一的顺序控制流程,是程序执行的最小单元,是CPU调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。

进程终止的情况

  1. 程序运行到最后,执行完所有的指令,便会结束.
  2. 程序运行到显示使用System.exit()或Runtime,getRuntime().exit.退出当前进程.
  3. 程序执行过程中遇到未捕获的异常或者错误而结束.
  4. 程序所在的平台强制结束JVM的运行.

定义

jvm不区分主线程和用户线程,各个线程是独立的(平级关系),不同与win32的线程模型。jvm把线程分为前台线程和后台线程,后台线程官方术语叫守护线程,jvm结束的条件是所有的前台线程结束。正常构建的线程都是前台线程,可以在线程未开始前调用Thread类的setDaemon(true)方法将线程改变为后台守护线程。

进程和线程的区别

  1. 进程是操作系统进行资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
  2. 同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。
  3. 进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
  4. 线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
  5. 线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
  6. 线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志

死锁?死锁产生的原因?死锁的必要条件?怎么处理死锁?

  1. 相互等待资源而产生的一种僵持状态,如果没有外力的干预将一直持续这个状态
  2. 系统资源不足、相互竞争资源、请求资源顺序不当
  3. 互斥、不可抢占、循环等待、请求与保持
  4. 因为互斥是不可改变的,所以只能破坏其他三个条件中的一个来解除死锁,方法:剥夺资源、杀死其中一个线程

Windows内存管理方式

段存储、页存储、段页存储。

进程的几种状态?

IPC 通信方式?

什么是虚拟内存?

是将进程部分装入内存中,从而能实现一个很大的程序能在一个比它小的内存中运行,它的主要实现是靠程序的换进换出来实现的,因为内存中0~3G是用户使用,3~4G才是内存使用,通过映射来实现来进行逻辑地址到物理地址的映射。

虚拟地址、逻辑地址、线性地址、物理地址的区别?

分段机制把一个逻辑地址转换为线性地址;接着,分页机制把一个线性地址转换为物理地址。

这些知识都比较理论,但是在实际应用中经常会遇到。如果你连理论知识都搞不清,遇到实际问题,那就无从下手,越搞越错了。