进程是资源 (CPU, 内存等) 分配的基本单位, 它是程序执行时的一个实例. 程序运行时系统就会创建一个进程, 并为它分配资源, 然后把该进程放入进程就绪队列, 进程调度器选中它的时候就会为它分配 CPU 时间, 程序开始真正运行.
线程
线程是程序执行时的最小单位, 它是进程的一个执行流, 是 CPU 调度和分派的基本单位, 一个进程可以由很多个线程组成, 线程间共享进程的所有资源, 每个线程有自己的堆栈和局部变量. 线程由 CPU 独立调度执行, 在多 CPU 环境下就允许多个线程同时运行. 同样多线程也可以实现并发操作, 每个请求分配一个线程来处理.
线程和进程各自有什么区别和优劣呢?
进程是资源分配的最小单位, 线程是程序执行的最小单位.
进程有自己的独立地址空间, 每启动一个进程, 系统就会为它分配地址空间, 建立数据表来维护代码段, 堆栈段和数据段, 这种操作非常昂贵. 而线程是共享进程中的数据的, 使用相同的地址空间, 因此 CPU 切换一个线程的花费远比进程要小很多, 同时创建一个线程的开销也比进程要小很多.
线程之间的通信更方便, 同一进程下的线程共享全局变量, 静态变量等数据, 而进程之间的通信需要以通信的方式 (IPC) 进行. 不过如何处理好同步与互斥是编写多线程程序的难点.
但是多进程程序更健壮, 多线程程序只要有一个线程死掉, 整个进程也死掉了, 而一个进程死掉并不会对另外一个进程造成影响, 因为进程有自己独立的地址空间.
进程间通信的方式 -- 信号, 管道, 消息队列, 共享内存
1. 管道 pipe: 管道是一种半双工的通信方式, 数据只能单向流动, 而且只能在具有亲缘关系的进程间使用. 进程的亲缘关系通常是指父子进程关系.
2. 命名管道 FIFO: 有名管道也是半双工的通信方式, 但是它允许无亲缘关系进程间的通信.
4. 消息队列 MessageQueue: 消息队列是由消息的链表, 存放在内核中并由消息队列标识符标识. 消息队列克服了信号传递信息少, 管道只能承载无格式字节流以及缓冲区大小受限等缺点.
5. 共享存储 SharedMemory: 共享内存就是映射一段能被其他进程所访问的内存, 这段共享内存由一个进程创建, 但多个进程都可以访问. 共享内存是最快的 IPC 方式, 它是针对其他进程间通信方式运行效率低而专门设计的. 它往往与其他通信机制, 如信号两, 配合使用, 来实现进程间的同步和通信.
6. 信号量 Semaphore: 信号量是一个计数器, 可以用来控制多个进程对共享资源的访问. 它常作为一种锁机制, 防止某进程正在访问共享资源时, 其他进程也访问该资源. 因此, 主要作为进程间以及同一进程内不同线程之间的同步手段.
7. 套接字 Socket: 套解口也是一种进程间通信机制, 与其他通信机制不同的是, 它可用于不同及其间的进程通信.
8. 信号 ( sinal ) : 信号是一种比较复杂的通信方式, 用于通知接收进程某个事件已经发生.
来源: http://www.bubuko.com/infodetail-2853873.html