进程和线程区别详解

来源:互联网 发布:如何制作自己的软件 编辑:程序博客网 时间:2024/05/21 17:20
 1.进程和线程有什么区别?

a:进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位;

b:进程有独立的地址空间,启动一个新的进程,系统必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,当然,线程是拥有自己的局部变量和堆栈;

c:线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行;

d:多进程比多线程程序要健壮。一个线程死掉整个进程就死掉了,但是在保护模式下,一个进程死掉对另一个进程没有直接影响;

e:线程的执行与进程是有区别的。每个独立的线程有有自己的一个程序入口,顺序执行序列和程序的出口,但是线程不能独立执行,必须依附与程序之中由应用程序提供多个线程的并发控制;


2.什么是线程安全?

线程安全:多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

线程不安全:访问时不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

原因:线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

例子:比如一个arrayList类,在添加一个元素的时候,它可能会有两步来完成:1. 在items[index]的位置存放此元素;2. 增大size的值。
在单线程运行的情况下,如果size=0,添加一个元素后,此元素在位置item[0],而且size=1;
而如果是在多线程情况下,比如有两个线程,线程A先将元素存放在位置item[0]。但是此时CPU调度线程A暂停,线程B得到运行的机会。线程B也向此arrayList添加元素,因为此时size仍然等于0,所以线程B也将元素存放在位置item[0]。然后线程A和线程B都继续运行,都增加size的值。那么元素实际上只有一个,存放在位置item[0],而size却等于2。这就是"线程不安全"了。


3.多线程同步和互斥有何异同,在什么情况下分别使用他们?

线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒,存在先后关系。

线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。


4.其他

线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止;

线程有3个基本状态:执行、就绪、阻塞;

多线程中栈一般用于存放局部变量,为线程私有,堆一般用于存放程序共享数据。


原创粉丝点击