关于进程,线程,协程是面试中常常可见的问题,接下来这篇文章帮你梳理一下,让你轻松应对面试官。python
一个程序的执行实例就是一个进程。每个进程提供执行程序所需的全部资源。(进程本质上就是资源的集合)程序员
进程拥有本身独立的堆和栈,堆和栈都不共享,由操做系统进行调度。面试
线程是操做系统可以进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运做单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中能够并发多个线程,每一个线程并行执行不一样的任务。bash
线程拥有本身独立的栈,可是堆是共享的,标准的线程也是由操做系统调度的。多线程
文末补充什么是并发什么是并行并发
来补充一下,拿个例子简单理解进程,线程!socket
作个简单的比喻:进程=火车,线程=车箱atom
• 线程在进程下行进(单纯的车箱没法运行)spa
• 一个进程能够包含多个线程(一辆火车能够有多个车箱)操作系统
• 不一样进程间数据很难共享(一辆火车上的乘客很难换到另一辆火车,好比站点换乘)
• 同一进程下不一样线程间数据很易共享(A车箱换到B车箱很容易)
• 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车箱更耗资源)
• 进程间不会相互影响,一个线程挂掉将致使整个进程挂掉(一列火车不会影响到另一列火车, 可是若是一列火车上中间的一节车箱着火了,将影响到全部车箱)
• 进程能够拓展到多机,进程最多适合多核(不一样火车能够开在多个轨道上,同一火车的车箱不能 在行进的不一样的轨道上)
• 进程使用的内存地址能够上锁,即一个线程使用某些共享内存时,其余线程必须等它结束,才能 使用这一块内存。(好比火车上的洗手间)-"互斥锁"
• 进程使用的内存地址能够限定使用量(好比火车上的餐厅,最多只容许多少人进入,若是满了需 要在门口等,等有人出来了才能进去)-“信号量”
线程和进程的操做是由程序触发系统接口,最后执行者是系统,本质是操做系统提供的功能,而协程操做是由程序员指定的。
协程共享堆,不共享栈。
多进程就是分享了系统的时间片,例如你能够同时听歌和聊qq
多线程就是,当一个进程中有些数据,每一个均可以被访问,每一个数据均可以被每一个线程访问。多线程是为了同步完成多项任务,不是为了提升运行效率,而是为了提升资源使用效率来提升系统的效率。
多线程同步的问题,如何解决鸭(哲学家就餐问题) 1,简单的操做交给atomic(保证一个原子周期完成)2,加锁(互斥锁,信号量,读写锁,自旋锁,python里面有个GIL也能够了解下哦)
加锁后,对资源有全部权,在全部操做结束前,其余想要这个资源的人,必须等着
若是面试官问了,进程和线程有什么本质区别
能够简单地说:
进程间通讯方式大概有socket,pipe,file等,对线程来讲是不同的,
假设n线程来讲均可以看到全局的数据,直接进行通讯。
也就是说对于一个进程来讲,你持有了一个页表,对于同一个进程內的线程,是共享了同一个页表。
固然你也能够提出一些前面的区别,好比线程是啥,进程是啥,balala
复制代码
补充一下并发和并行。由 Erlang 之父 Joe Armstrong举一个栗子
并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,若是串行,一个队列 使用一台咖啡机,那么哪怕前面那我的便秘了去厕所呆半天,后面的人也只能死等着他回来才能去 接咖啡,这效率无疑是最低的。
并发和并行均可以是不少个线程,就看这些线程能不能同时被(多个)cpu执行,若是能够就 说明是并行,而并发是多个线程被(一个)cpu 轮流切换着执行。
这篇文章前先后后补充了一些东西,感受逻辑有点混了,太多东西了,不理解能够评论或者邮箱(isysc1@163.com)我,我会及时回复的,若是文章对你有帮助,请点赞,哈哈哈哈(づ ̄3 ̄)