前些天有个电话面试,问我进程与线程的区别,没有总结过,胡乱说了一通。
现在网上看了看,凭理解记录下来。
在操作系统中,有关于进程的基本概念,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
在后来引入了线程的概念,线程就成了CPU调度的最小单位。线程不能独立存在,一个进程至少 包含一个线程。CPU对进程的调度实质上是对其包含的线程的调度。 看到其他博客上一个很好的例子比如多进程和多线程的关系。把进程比作一个条河流,多进程指很多条河流都可以同时流淌着,而线程就好比一条河流中的多条分支小溪,他们可以有一条,也可以由多条,这些小溪流淌组成了这条河流的流淌。
引入线程的好处:
1.线程的引入是操作系统执行粒度更小,并发度更高,CPU的运行效率也更高,系统开销更小。线程只占用程序运行中必不可少的一些资源,如如程序计数器,一些寄存器和栈。线程的切换几乎不需要什么开销。进程的创建需要分配虚拟内存,页表,堆栈等。因此操作系统并发的过程中,进程切换的开销远大于线程的切换。
线程和进程的关系:(copy from csdn)
1.一个线程只属于一个进程,而一个进程可以有多个线程;
2.资源分配给进程,同一个进程的所有线程共享该进程的所有资源;
3.处理机分配给线程,即真正在处理机上运行的是线程;
4.线程在执行那个过程中,需要同步协作。不同进程的线程间要利用消息通信的方法实现同步。
补充一些关于多线程和多进程的知识。
线程也有它的缺点,多线程由于共享的是进程的内存空间,一个线程的崩溃会引起同一个进程中的其他线程都崩溃,稳定性不如多进程;多进程的内存空间是独立,一个进程的崩溃不会引起其他进程的运行。
用于线程是共享进程的内存空间,在Linux2.6中默认线程的栈大小为8M,由于进程内核空间一般为3GB用户空间和1G内核空间,可以计算出线程的最大上限为:(1024*1024*1024*3)/(8 * 1024*1024) = 384 ;也就是线程最大上限为384,当线程数量超过这个上限,会出现段错误。 当然也可以修改默认线程的栈大小。
为了防止控制线程的数量,我们可以使用线程池和进程池的概念,提前创建好进程和线程,放在一个容器中进行同意管理,适合任务量大,但任务时间比较短,节约线程的创建时间。 这个概念通常用在WEB服务中。
另外,网上看了很久关于JAVA多进程,所谈论的甚少,找到几个例子还运行不了,感觉Java不提倡多进程编程,将线程当做轻量级的进程。基本都只是用多线程。