定义

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是个动态的概念,区别于程序,程序就是一块代码,是一个静态的概念,进程是系统进行资源分配的基本单位
线程,是进程的一部分,线程有时又被称为轻权进程或轻量级进程,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

关系

线程是进程的一部分,一个线程可以创建和撤销另一个线程。同一个进程中的多个线程之间可以并发执行。线程可与同属一个进程的其他的线程共享进程所拥有的全部资源,但拥有自己的栈空间,拥有独立的执行序列。线程自己基本上不拥有系统资源,只拥有在运行中必不可少的资源(程序计数器,寄存器和栈)。

区别

进程和线程的主要差别在于不同的资源管理方式。进程有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,并发编程中的异常处理就变得特别重要。
1)一个程序至少有一个进程,一个进程至少有一个线程(没有线程的进程可以被看作是单线程的)
2)大小。线程的划分尺度小于进程,使得多线程程序的并发性高。
3)内存。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4)执行过程。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5)多线程的意义在于一个应用程序中有多个执行部分可以同时执行,但操作系统并没有将多个线程看做多个独立的应用来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

优缺点

1)线程执行开销小,上下文切换快且消耗小。线程的创建和结束所需要的系统开销也比进程的创建和结束要小得多
2)进程拥有运行时所有的资源,而线程基本上不拥有系统资源,因此进程可以进行跨机器迁移,线程不利于资源的管理和保护,线程共享资源时需要考虑线程安全

为什么需要线程

在网络或多用户环境下,Web服务器需要接收大量的并发请求,为每一个请求都创建一个进程显然是不行的,进程是相当重量级的,太多进程会很快让机器吃不消,问题不在于机器不够强大或者网络不好,而是实现的太差。Http连接是短暂的,资源一般很小,不会像Ftp保持数分钟或者几小时,所以早期的web性能问题不明显,但是随着使用量的增长,高流量的web服务器性能会下降。
有两种常见的解决方案:
1)重用进程。不是为每个请求新建一个进程,而是在服务器启动时,创建固定数量的进程,当一个请求到达时放入队列,进程从队列中取出请求处理,同时删除队列中的请求,处理完成之后继续从队列中取出请求进行服务。好处是避免了建立和销毁进程所用的开销
2)更轻量的线程。因为线程的以上优点,所以线程是个很好的选择,同时再利用线程池,可以提供很好的性能。

线程安全

多线程访问同一代码和单线程访问时中间变量以及结果相同,不会产生不确定的结果叫做线程安全。原因是,不同线程共享相同的内存,一个线程可能会破坏另一个线程使用的变量和数据结构。线程安全问题是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作而无写操作,这个全局变量是线程安全的。若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
在Java里同步的几种方法:synchronized(同步代码块/对象/方法), volatile,锁(lock)等。利用了锁机制来实现对共享资源的互斥访问,在操作系统层面就是信号量

本文重在进程与线程的区别,进程状态转换、线程同步问题以后总结。

留言