进程:
简单说来,进程就是一段程序的执行过程.
每一个进程有自己独立的地址空间, 每启动一个进程, 系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段, 此操作十分昂贵.
进程的三个状态:
- 就绪: 获取除了cpu外的所有资源, 只要处理器分配资源就立刻执行.
- 运行: 获得处理器分配的资源, 程序开始执行
- 阻塞: 等待条件满足才执行. 如: 等待i/o操作时, 此时状态就叫阻塞
举一例说明进程:
想象一位厨师正在为他的女儿烘制生日蛋糕。他有做生日蛋糕的食谱,厨房里有所需的原料:面
粉、鸡蛋、糖、香草汁等。在这个比喻中,做蛋糕的食谱就是程序(即用适当形式描述的算法)厨
师就是处理器(cpu),而做蛋糕的各种原料就是输入数据。进程就是厨师阅读食谱、取来各种原
料以及烘制蛋糕等一系列动作的总和。现在假设厨师的儿子哭着跑了进来,说他的头被一只蜜蜂
蛰了。厨师就记录下他照着食谱做到哪儿了(保存进程的当前状态),然后拿出一本急救手册,按
照其中的指示处理蛰伤。这里,我们看到处理机从一个进程(做蛋糕)切换到另一个高优先级的进
程(实施医疗救治),每个进程拥有各自的程序(食谱和急救手册)。当蜜蜂蛰伤处理完之后,这
位厨师又回来做蛋糕,从他离开时的那一步继续做下去。
线程:
线程也叫轻量级进程, 是程序执行过程中的最小单元. 线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制. 一个进程中可以包含若干个线程, 一个进程至少有一个线程, 线程基本上没有自己的系统资源, 所以他的调度所付出的开销更小, 能让系统多个程序间并发执行的程度更高效.
共享内存:
字面理解: 将一片内存共享出来, 让不同的线程去访问他, 修改他.
多进程:
一个进程崩溃后, 在保护模式下不会对其他进程产生影响.
在socket项目中, 我们使用到的函数fork()
就是用来创建多进程的. fork()
可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理,父进程只需负责监控请求的到来,然后创建子进程让其去处理,这样就能做到并发处理。
多线程:
多线程共享内存(进程内存), 减小了程序并发执行时的开销,极大提高了程序运行的并发性, 突破一个进程只能干一件事的缺陷.
多线程程序只要有一个线程死掉, 整个进程也死掉
多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配.
举一例说明多线程:
多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可
能只有一节车厢。多线程的出现就是为了提高效率。
综上总结:
“线程快而进程可靠性高”。线程有个别名叫“轻量级进程”,在有的书籍资料上介绍线程可以十倍、百倍的效率快于进程; 而进程之间不共享数据,没有锁问题,结构简单,一个进程崩溃不像线程那样影响全局,因此比较可靠。