线程与进程区别:
1、进程拥有独立的堆栈空间和数据段,系统开销大,而线程仅有独立的堆栈空间,但是数据段是共享的。因此系统开销小。
2、进程之间相互独立,因此进程的通信机制比较复杂,如管道,信号,消息队列,共享内存,套接字等。而线程由于共享数据段所以通信方便。同样,因为进程独立,所以一个进程崩溃不会对其他进程产生影响,而线程是进程中的一个执行路径,线程死掉,进程就会死掉。
3、线程使得CPU更有效,因为当线程数不大于CPU数目时,不同的线程运行于不同的CPU上,可以使程序更高效执行。
进程间通信方式:
1)管道
管道分为有名管道和无名管道
当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。
2)信号量
信号量是计数器,用来控制多个线程对共享资源的访问,它常作为一种锁机制,防止某进程访问资源时其他进程也访问该资源。
3)信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.
4)消息队列
消息队列是UNIX系统下不同进程之间共享资源的机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程,对消息队列有权限的进程都可以使用msget完成对消息队列的控制。
可以实现任意进程间的通信,并通过系统调用函数来实现消息发送和接收之间的同步,无需考虑同步问题,方便;
信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合
5)共享内存
共享内存就是由一个内存创建,多个内存都可以访问,最快的(IPC)Inter-Process Communication。快捷,信息量大。缺点,只能在同一个计算机系统中使用,
6)套接字:可用于不同及其间的进程通信
传输数据为字节级,传输数据时间段,性能高,适合在客户端和服务器端之间信息实时交互。
进程与线程的选择取决以下几点:
1、需要频繁创建销毁的优先使用线程
2、线程切换速度快,需要大量计算切换频繁时使用线程
3、多核分布可用线程,CPU效率快;
4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。