进程与线程
?
进程与线程(Process & Thread)
?
一.理论
(1)Process
从操作系统角度
? ? 进程(process)会分配到cpu时间片,分配到memory空间,这就是程序的运行环境.是由操作系统维护的资源实体.所以有一些性质:
? ? 1.可以被创建,回收,挂起,运行,死亡;
? ? 2.进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;
? ? 3.从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。
? ? ?通俗的说:当一个进程放弃执行(准确的说是放弃占有CPU),而被操作系统交换到硬盘上,使别的进程有机会运行的时候,在那个进程里的所有数据也将被写到硬盘上,甚至包括整个系统的核心(core?memory).
就java而言:JVM就几乎相当于一个进程(process),因为只有进程才能拥有堆内存(heap,也就是我们平时用synchronized关键字,就无法用JAVA实现信号量,但是仅仅只依靠它也不足够。
? ? ? 计算机的汇编指令顺序的执行,这些指令的执行是不被打断。指令试图测试一个比特(bit),然后设置各种二进制位来表示测试的结果,如果这个bit没有被设置,指令就设置它。这可以说是非常原始的信号量,因为当两个线程同步的企图设置一个bit的值时,只有一个线程可以成功,两个线程都会检查结果,看看是不是自己设成功了。?
如果bit已经被设置(这里说的是有线程竞争的情况下),失败的JVM(线程)不得不离开操作系统的核心进程等待这个bit位被清零。这样来回的在系统核心中切换是非常耗时的。在NT系统下,需要600次机械指令循环来进入一次系统内核,这还仅仅是进入所耗费的时间还不包括做操作的时间。?
? ? ? ??线程安全,是指一个方法可以在多线程的环境下安全的有效的访问进程级的数据(这些数据是与其他线程共享的)。事实上,线程安全是个很难达到的目标。一般不操作对象状态信息(例如数据成员)的方法都不需要同步,例如:一些方法只访问本地变量(也就是说在方法内部声明的变量),而不操作类级别的数据成员,并且这些方法不会通过传入的引用参数来修改外部的对象。符合这些条件的方法都不需要使用synchronization这种重量级的操作。除此之外,还可以使用一些设计模式—esign Pattern)来避免同步,如Decorator模式.
?三.协作
?
?
?
? ? ?
? ?
?