进程:是资源分配的基本单位,它是程序执行的一个实例。程序运行时系统会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列。
Linux系统函数fork()
可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理,父进程只需负责监控请求的到来,然后创建子进程让其去处理,这样就能做到并发处理。
线程:是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程不拥有系统资源,但是它与同属一个进程的其他线程共享进程资源,线程也被称为轻量级进程。
每个进程都有自己的地址空间,即进程空间,因为一个服务器通常需要接收大量不确定数量用户的并发请求,如果为每个请求都创建一个进程的话,会导致很大的系统开销(①:进程间的切换会消耗大量的CPU时间;②:子进程是父进程的完整映像,子进程会复制父进程的文件描述符和堆内存等资源,如果子进程太多,会导致系统可用资源急剧下降,进而影响服务器性能。)
简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
线程和进程的区别?
①:进程是资源分配的最小单位,线程是进程执行的最小单位。
②:进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间;而线程则共享进程中的数据,使用相同的地址空间,因此CPU的线程间切换花费远比进程间切换要多。
③:线程之间通信更方便,而进程间通信需要以IPC方式进行。
④:多进程程序更健壮,因为一个进程死掉并不会对另外一个进程造成影响,但是一个线程发生死锁,则会导致整个进程死掉。
一个进程可以创建的线程数由可用虚拟空间和线程的栈的大小共同决定。如果可用的虚拟空间是2GB,而默认的线程栈为1MB,所以可以创建2000个线程。