进程、线程与JVM、CLR

进程和线程的关系:

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

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

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

一些说明:

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

线程的生存期

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

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

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

JVM 与 进程,线程

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

如下图所示:

上述资料参看:

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、 进程, 应用程序域, 线程

说明:

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

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

参看: 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

时间: 2025-01-12 14:42:12

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

线程机制、CLR线程池以及应用程序域

最近在总结多线程.CLR线程池以及TPL编程实践,重读一遍CLR via C#,比刚上班的时候收获还是很大的.还得要多读书,读好书,同时要多总结,多实践,把技术研究透,使用好. 话不多说,直接上博文吧.先说一下,为什么Windows要支持线程机制? 1. Windows为什么要支持线程 计算机的早期时代,操作系统没有线程的概念,整个系统只运行着一个执行线程,其中包含操作系统代码和应用程序代码.只用一个执行线程的问题在于,长时间运行的任务会阻止其他任务的执行.例如16位Windows的时代,打印文

001-多线程基础-进程线程、线程状态、优先级、用户线程和守护线程

一.进程与线程 1.DOS系统[单进程系统] 最早的时候DOS有一个特点:只要电脑有病毒,那么电脑就死机了. 原因:传统的DOS系统属于单进程系统,即:在同一时间段内只允许有一个程序运行. 2.Windows系统[多进程多线程] 电脑中毒也可以运行,但是会变慢 原因:因为在一个cpu.一块资源的情况下,程序利用一些轮转算法,可以让一个资源在一个时间段可以同时处理多个程序(进程),但是在一个时间点上只允许一个进程去执行. windows:任务管理器 linux:ps 在每一个进程上可以划分出若干个

Linux下进程线程,Nignx与php-fpm的进程线程方式

1.进程与线程区别 进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源. "进程——资源分配的最小单位,线程——程序执行的最小单位" 进程有独立的地

android 进程/线程管理(四)续----消息机制的思考(自定义消息机制)

继续分析handler 和looper 先看看handler的 public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } } 所以消息的处理分层三种,就是 1.传入一

进程/线程介绍

一.进程 进程可以认为是程序执行时的一个实例.进程是系统进行资源分配的独立的实体,且每个进程拥有独立 的地址空间.一个进程无法直接访问另一个进程的变量和数据结构,如果希望让一个进程访问另一个进程 的资源,需要使用进程间通信,比如:管道,有名管道,信号,信号量,消息队列,套接字等. 一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间.线程和进程的一个主要区别是,同一程序内 的多个线程会共享部分状态,多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存).同时 每个线程还拥有自己的寄

进程线程协程那些事儿

一.进程与线程 1.进程 我们电脑的应用程序,都是进程,假设我们用的电脑是单核的,cpu同时只能执行一个进程.当程序出于I/O阻塞的时候,CPU如果和程序一起等待,那就太浪费了,cpu会去执行其他的程序,此时就涉及到切换,切换前要保存上一个程序运行的状态,才能恢复,所以就需要有个东西来记录这个东西,就可以引出进程的概念了. 进程就是一个程序在一个数据集上的一次动态执行过程.进程由程序,数据集,进程控制块三部分组成.程序用来描述进程哪些功能以及如何完成:数据集是程序执行过程中所使用的资源:进程控制

9 异常处理 操作系统 进程线程 队列+生产消费者模型 进程同步 回调函数

异常处理 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 异常的种类: AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块或包:基本上是路径问题或名称错误 IndentationError 语法错误(的子类) :代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访

操作系统:进程/线程同步的方式和机制,进程间通信

一.进程/线程间同步机制. 临界区.互斥区.事件.信号量四种方式临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event)的区别1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问.在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占.2.互斥量:采用互斥对象机

进程/线程

进程/线程控制: 创建                  退出                      等待 多进程               fork()         exit()           wait() 多线程      pthread_create    pthread_exit()        pthread_join() 线程的同步与互斥: 线程的互斥:  互斥锁 初始化互斥锁 int pthread_mutex_init(pthread_mutex_t *mute