进程、线程与JVM、CLR

2023-11-01


进程和线程的关系:

网上有一副很经典的图可以让我们来理解进程和线程的关系:

下面这副图是一个双向多车道的道路图,假如我们把整条道路看成是一个“进程”的话,那么图中由白色虚线分隔开来的各个车道就是进程中的各个“线程”了。

image

这副图出自:http://www.blogjava.net/pengpenglin/archive/2008/09/02/226292.html 

一些说明:

  • 这些线程(车道)共享了进程(道路)的公共资源(土地资源)。
  • 这些线程(车道)必须依赖于进程(道路),也就是说,线程不能脱离于进程而存在(就像离开了道路,车道也就没有意义了)。
  • 这些线程(车道)之间可以并发执行(各个车道你走你的,我走我的),也可以互相同步(某些车道在交通灯亮时禁止继续前行或转弯,必须等待其它车道的车辆通行完毕)。
  • 这些线程(车道)之间依靠代码逻辑(交通灯)来控制运行,一旦代码逻辑控制有误(死锁,多个线程同时竞争唯一资源),那么线程将陷入混乱,无序之中。
  • 这些线程(车道)之间谁先运行是未知的,只有在线程刚好被分配到CPU时间片(交通灯变化)的那一刻才能知道。

 

线程的生存期

当安排执行一个线程后,这个线程会经历几个状态,包括:未启动,激活,睡眠状态等,如下图显示的线程的生存期:

image

此图来自《c#线程参考手册》,这本书的电子版在CSDN有下载:http://d.download.csdn.net/down/1493065/phs415

 

如果使用Java,看下面图更容易点,其实他们描述的意思完全一样:

image

JVM 与 进程,线程

Java编写的程序都运行在在Java虚拟机(JVM)中,每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行的。JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。

如下图所示:

image

上述资料参看:

JVM和JRE浅谈 
http://blog.csdn.net/liufeng_cp/archive/2008/07/18/2674317.aspx

Java多线程编程总结 
http://lavasoft.blog.51cto.com/62575/27069

Java 由于要考虑跨平台,所以它跟进程,线程的模型比较简单, .Net 则复杂些了:

.Net CLR、 进程, 应用程序域, 线程

image

说明:

  • 类似于Java虚拟机,目前CLR都是存在某个进程内,即:进程加载CLR。在 .Net 4.0 中,可以进程内并存 .Net 4.0 和之前版本, 就是这个的一个典型场景(.Net 4.0 的新特性你: "In-Proc SxS“ 就是指这个)。
  • .Net 中引入了应用程序域的概念,这是进程内的进一步的逻辑分区。显然:一个进程可以包含多个应用程序域,每一个应用程序域中承载一个.NET可执行程序。这样的好处:
    • 应用程序域是.NET平台操作系统独立性的关键特性。这种逻辑分区将不同操作系统加载可执行程序的差异抽象化了。
    • 和一个完整的进程相比,应用程序域的CPU和内存占用要小的多。因此CLR加载和卸载应用程序域比起完整的进程来说也快的多。
    • 应用程序域为承载的应用程序提供了深度隔离。如果进程中一个应用程序域失败了,其他的应用程序域也能保持正常。

下面这幅图就描述了 应用程序域 所处的位置:

image

参看: CLR 全面透彻解析进程内并行 

参考资料:

深究Java虚拟机 
http://www.chinaaspx.com/comm/dotnetbbs/Showtopic.aspx?Forum_ID=33&Id=302411&PPage=1

关于进程 线程和一些常见的多线程概念 
http://www.cnblogs.com/ChrisWang/archive/2009/09/07/1563675.html

.Net Discovery 系列之五--深入浅出.Net实时编译机制(上) 
http://www.cnblogs.com/isline/archive/2009/12/22/1629831.html

linux线程浅析 
http://blog.chinaunix.net/u2/87597/showart.php?id=2178432

Azure Cloud Application 运行方式特点 
http://tech.ccidnet.com/art/1105/20090625/1808497_1.html

读书感受 - 程序员 - C#线程参考手册(多线程技术分析) 
http://www.cnblogs.com/lzhdim/archive/2009/11/27/1611510.html

多线程编程的基础知识点 
http://www.blogjava.net/pengpenglin/archive/2008/09/02/226292.html

Java多线程编程总结 
http://lavasoft.blog.51cto.com/62575/27069

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程、线程与JVM、CLR 的相关文章

随机推荐

  • unity 射线获取坐标

    射线 碰到障碍物就会断开 鼠标点击屏幕获得一个二维坐标 通过相机的射线转换为三维世界坐标 private Vector3 worldPos 鼠标点击的点所对应的世界里面的位置 点击鼠标右键 if Input GetMouseButton 1
  • ThinkPHP文件包含漏洞分析

    出品 长白山攻防实验室 ID A Tree 0x00 声明 以下内容 来自长白山攻防实验室的A Tree作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作者不承担任何责
  • Vue3集成高德地图方法

    1 注册高德开发者账号 获取key和安全密钥 2 下载依赖 可参考高德官方文档 https lbs amap com api jsapi v2 guide webcli map vue1 npm i amap amap jsapi load
  • GD32f103 8M晶振改12M , 要修改的地方

    手里的单片机是gd32f103ret6 晶振和官方库默认的8M不一致 导致串口乱码 网上找了好久全是STM32的例子 不过还是有参考意义的 以下是gd32f10x 的设置方式 1 Keil中的Target设置 PS 这一项好像会自动设置 安
  • 7、变量进阶

    7 变量进阶 理解 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1 1 引用的概念 在 Py
  • [论文阅读]《how to share a secret》

    how to share a secret Adi Shamir 文章主要讲了如何将数据D分为n份 任意k份可以重组成D 任意k 1份不会泄露任何关于D的信息 这种技术能为密码系统构建鲁棒的密钥管理机制 即使灾难破坏一半信息或者安全性被破坏
  • 浅谈C++

    引子 程序运行时产生的数据都属于临时数据 程序一旦运行结束都会被释放通过文件可以将数据持久化 C 中对文件操作需要包含头文件 lt fstream gt C 提供了丰富的文件操作功能 你可以使用标准库中的fstream库来进行文件的读取 写
  • 【接口测试】POST请求提交数据的三种方式及Postman实现

    1 什么是POST请求 POST请求是HTPP协议中一种常用的请求方法 它的使用场景是向客户端向服务器提交数据 比如登录 注册 添加等场景 另一种常用的请求方法是GET 它的使用场景是向服务器获取数据 2 POST请求提交数据的常见编码格式
  • 【从零到一的Raspberry】数莓派踩坑实录(二) 内核编译配置和模块安装

    写在前面 本次作业具有挑战性 不过不管哪一环节出错了 你都要知道如何把它还原到初始状态 这样你就不是在危险地操作 而有还原的保障 因此在第0节我会介绍一种还原数莓派系统的方法 这样你就可以在内核无法运行时还原到默认系统 后面从第一章开始 带
  • AD 利用IPC封装创建向导快速创建封装

    首先在扩展更新里查看是否有IPC封装 工具里面第二个会有很多常见封装类型 选择SOP NEXT 会填写一些数据 相对应在数据手册上进行填写即可 下图左上角问的是要不要加散热焊盘 散热焊盘主要看原件是否真实需要 上图要填的值一般来说默认就可以
  • Ubuntu无法连接网络?

    文章目录 适用情况 Windows网络配置和虚拟机网络配置 Windows网络适配器配置 Ubuntu设置静态IP 图形化界面操作 指令文件操作 如果重新设置好以后 依旧不行 适用情况 如果您无法知晓 虚拟机出现是什么问题 始终就是无法连接
  • 黑盒测试的范围内容

    1 功能错误或遗漏 2 界面错误 3 数据结构或外部数内容据库访问错误 4 性能错误 5 初始化和终止错误
  • 动态规划(js版)

    1 动态规划算法介绍 理解动态规划 知乎好文 LeetCode简单的动态规划题 斐波那契数 爬楼梯 使用最小花费爬楼梯 有点小坑 不同路径 不同路径 II 注意初始值的设置 最小路径和 LeetCode较难的动态规划题 343 整数拆分 9
  • 哈希(Hash)与算法的衡量

    对于map来说 背后就是平衡搜索二叉树 具体可见 https blog csdn net weixin 42513339 article details 88889306 空间复杂度为 O logN 对于unorder map来说 背后就是
  • ubuntu18.04安装xmind思维导图 + 创建软件的快捷方式

    ubuntu18 04安装xmind思维导图 sh文件运行小知识 创建快捷方式 1 下载linux版本的 zip压缩包 2 运行sudo setup sh 2 1 sh 文件相关知识 补充 3 启动xmind 3 1 启动失败 font f
  • ggplot2中的条形图 geom_bar()

    20150226 1 ggplot 能直接计算aes 中x变量各个分类的数目 所以可以直接用原始数据 而不用像plot 一样要table 数据 2 geom bar mapping NULL data NULL stat bin posit
  • 从零搭建 Spring Cloud 服务(超级详细)

    点击上方 Java后端 选择 设为星标 优质文章 及时送达 作者 Anakki 链接 blog csdn net qq 29519041 article details 85238270 这里会介绍很多基础知识 直接想开始搭建微服务的可以看
  • 小学思品课如何使用计算机教学设计,关于小学思品教学设计与反思

    关于小学思品教学设计与反思 小学思想品德节约用水教学设计与反思 节约用水 教学设计与反思 一 指导思想 品德与生活课 注重学生的实践与参与性 突出教学实效性 让学生通过丰富的教学活动去亲身体验 亲自感受水的重要与水资源的匮乏 从而形成自觉的
  • Win10 系统下VisualStudio2019 配置Open3D-0.15.2(C++)

    目录 一 下载Open3D 0 15 2 二 编译 font color dd00dd 1 新建文件 CmakeList txt TestVisualizer h TestVisualizer cpp font color dd00dd 2
  • 进程、线程与JVM、CLR

    进程和线程的关系 网上有一副很经典的图可以让我们来理解进程和线程的关系 下面这副图是一个双向多车道的道路图 假如我们把整条道路看成是一个 进程 的话 那么图中由白色虚线分隔开来的各个车道就是进程中的各个 线程 了 这副图出自 http ww