线程是可执行代码的可分派单元,所有进程有至少一个线程。这意味着单个程序(进程)可以并发执行两个或者多个任务。线程就是把一个进程分为很多片,每一片都可以是一个独立的流程。创建一个新的进程,会分配新的内存空间,拷贝别的进程的数据,所以说进程是一个拷贝的流程,而线程只是把一条河流截成很多条小溪。线程没有拷贝这些额外的开销,但是仅仅是现存的一条河流,就被多线程技术几乎无开销地转成很多条小流程,它的伟大就在于它少之又少的系统开销。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访问时,如果要保证线程安全,则必须通过加锁的方式。
1 关于线程的堆栈
生成子线程后,它会获取一部分该进程的堆栈空间,作为其名义上的独立的私有空间。这些线程属于同一个进程,其他线程只要获取了你私有堆栈上某些数据的指针,其他线程便可以自由访问你的名义上的私有空间上的数据变量。
(http://blog.csdn.net/lishenglong666/article/details/8557215)
从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,
2 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,(当一个线程向非法地址读取或者写入,无法确认这个操作是否会影响同一进程中的其它线程,所以只能是整个进程一起崩溃。)所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。一个进程的开销大约是一个线程开销的30倍左右
3 WEB服务器技术中,Apache是采用多进程的(perfork模式,每客户连接对应一个进程,每进程中只存在唯一一个执行线程)Java的Web容器Tomcat、Websphere等都是多线程的(每客户连接对应一个线程,所有线程都在一个进程中)。
要创建子进程可以通过使用使用ProcessB ilder的start()方法和Runtime的exec()方法。
浙公网安备 33010602011771号