进程和线程-分别的概念和区别
进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位。但是并不是说CPU不在以进程为单位进行调度,虽然在某些操作系统中是这样。同一个进程中并行运行多个线程,就是对在同一台计算机上运行多个进程的模拟。
进程有独立的地址空间,而同一进程中的线程共享该进程的地址空间。比如在linux下面启动一个新的进程,系统必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种非常昂贵的多任务工作方式。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,因此启动一个线程,切换一个线程远比进程操作要快,花费也要小得多。当然,线程是拥有自己的寄存器和堆栈(线程栈),比如在windows中用_beginthreadex创建一个新进程就会在调用CreateThread的同时申请一个专属于线程的数据块(_tiddata)。虽然,线程有自己线程栈,线程可以直接访问全局变量,甚至可以访问进程地址空间中的每一个内存,所以一个线程可以读写甚至清楚另一个线程的堆栈。
线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,静态变量,打开的文件,子进程),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。在一个线程中分配的堆在各个线程中均可以使用,在一个线程中打开的文件各个线程均可用,当然指同一进程中的线程。
多进程比多线程程序要健壮。一个线程死掉整个进程就死掉了,但是在保护模式下,一个进程死掉对另一个进程没有直接影响
线程的执行与进程是有区别的。每个独立的线程有有自己的一个程序入口,顺序执行序列和程序的出口,但是线程不能独立执行,必须依附与程序之中,由应用程序提供多个线程的并发控制。
linux中进程具有父子关系,形成进程树,但是线程是平等的没有父子关系
线程和进程的适用范围
需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应。
多进程可以使用在多机分布式系统,需要扩展到其他机器上,使用多进程,多线程适用于多核处理机。
需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。
线程是否创建的越多越好?
不是,创建线程越多,对共享资源同步要求多,设计同步容易出错。另外多线程并发容易导致资源分配问题。而且创建线程本身也会消耗大量的资源,如果一有任务就创建线程,那么容易导致系统的负载过大。一般解决方案是线程池。
进程之间的通信方式?
进程间通信需要解决的问题有三个:数据传递,关键部位不会交叉,顺序
进程间通信适用于线程,但是有一个不同的地方,进程间交换数据是在不同的地址空间进行,但是线程是在同一个地址空间进行,只要知道数据的地址,都可以很方便的访问