进程(有时被称为重量级进程)是程序的一次执行。每个进程都有自己的地址空间,内存,数据栈以及其它记录其运行轨迹的辅助数据。操作系统管理在其上运行的所有进程,并为这些进程公平地分配时间。进程也可以通过 fork 和 spawn 操作来完成其它的任务。不过各个进程有自己的内存空间,数据栈等,所以只能使用进程间通讯(IPC),而不能直接共享信息。
线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境。它们可以想像成是在主进程或“主线程”中并行运行的“迷你进程” 。线程有开始,顺序执行和结束三部分。它有一个自己的指令指针,记录自己运行到什么地方,线程的运行可能被抢占(中断)或暂时的被挂起(也叫睡眠),让其它的线程运行,这叫做让步。
进程是资源分配的最小单位,线程是CPU调度的最小单位
进程可以打开和操作系统资源而线程不行,所以在并发运行的环境中,如果程序要操作的资源比较大,最好可以做成多进程,由进程动态加载和资源。
好处:分配到多个进程动态加载资源,可以避免程序启动时一起性加载大型资源的长时间的等待,并且按需加载和释放资源, 还能起到节省内存空间的作用。
系统资源分配给进程,而线程只有cpu资源和一些必须的栈和寄存器,所以进程切换比线程切换慢得多,如果是切换比较频繁的job的话,用线程。windows中进程只是资源管理者,不是真正的程序执行者,执行工作由线程完成,即使不显式产生线程,系统有一个缺省得主线程运行。
子进程有自己的资源,比线程独立于父进程,可以在父进程退出后执行,如LINUX的守护进程就是这样的,线程使用的是父进程的资源,在父进程退出后跟着退出。
linux下进程间通信的几种主要手段简介:
- 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
- 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
- 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
- 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
- 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。