进程
每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)
线程
同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是独立运行和独立调度的基本单位)
进程和线程区别
1进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
2进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响。
3线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮。
4在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
5线程执行开销小,但不利于资源的管理和保护,而进程正相反
6线程适合于在SMP(多核处理机)机器上运行,而进程则可以跨机器迁移。
通信
一、进程间通信方式
(匿名)管道(pipe):数据只能单向流动,而且只能在具有亲缘关系的进程间使用(通常指父子进程关系)。
有名管道(namedpipe):半双工通信方式,允许无亲缘关系进程间的通信。数据可以双向流动。
信号量(semophore):是一个计数器,用来控制多个进程对共享资源的访问。常作为一种有锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,因此主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列(messagequeue):是由消息的链表,存放在内核中并由消息队列标识符标识。克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号(sinal):比较复杂的通信方式,用于通知接收进程某个时间已经发生。
套接字(socket):进程间通信机制,可用于不同进程之间的通信。
二、进程间通信方式
锁机制:互斥锁,条件变量、读写锁。
—互斥锁提供了以排他方式防止数据结构被并发修改的方法。
—读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
—条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。