并发编程总结

1,简述计算机操做系统的中断的做用python

中断请求,中断响应,中断处理,中断返回linux

中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,
使得cpu暂时中断当前正在执行的程序,转去执行相应的事件处理程序。待处理完毕
后又返回原来被中断处继续执行或调度新的进程执行的过程。它使计算机能够更好更
快利用有限的系统资源解决系统响应速度和运行效率的一种控制技术。实时响应,系统调度。web

2,简述计算机内存的“内核态”和“用户态”
内核态:cpu能够访问内存的全部数据,包括外围设备,
用户态:只能受限的访问内存,且不容许访问外围设备,
占用cpu的能力被剥夺,cpu资源能够被其余程序获取windows

3,为何要有内核态和用户态?
因为须要限制不一样的程序之间的访问能力,防止他们获取别的程序的内存数据,
或者获取外围设备的数据,并发送到网络网络

cpu划分出两个权限等级:用户态和内核态。
多线程

4,什么是进程?
正在执行的一个程序或者说一个任务,负责执行任务的是cpu。
进程是用来把资源集中到一块儿的,进程是资源单位,或者说资源集合。并发


5,什么是线程?异步

线程是cpu上的执行单位。同一个进程内的多个线程共享该进程内的地址资源。
建立线程的开销要远小于建立进程的开销。
线程是操做系统可以进行运算调度的最小单位。
它被包含在进程之中,是进程中的实际运做单位。
一条线程指的是进程中一个单一顺序的控制流,一个进程中能够并发多个线程,
每条线程并行执行不一样的任务socket


6,什么是系统调用?
全部用户程序都是运行在用户态的,可是有时候程序确实须要作一些内核态的事情,
例如从硬盘读取数据,或者从键盘获取输入等,
而惟一能作这些事情的就是操做系统,因此此时程序就须要向操做系统请求以程序
的名义来执行这些操做。这时,就须要一个机制:用户态程序切换到内核态,可是不能
控制在内核态中执行的指令。这种机制就叫系统调用。async


7,threading模块event和condition的区别;
condition: 某些事件触发或达到特定的条件后才处理数据,默认建立了一个lock对象。
con = threading.Condition()
con.acquire()
con.release()


event:其余线程须要经过判断某个线程的状态来肯定本身的下一步操做,就能够用event。
from threading import Event
event = Event()
event.set(): 设置event的状态值为True,全部阻塞池的线程激活进入就绪状态, 等待操做系统调度;
event.is_set():返回event的状态值;
event.wait():若是 event.is_set()==False将阻塞线程;
event.clear():恢复event的状态值为False。


8,进程间通讯方式有哪些?
消息队列 管道 信号量 信号 共享内存 套接字

9,简述对管道,队列的理解
队列 = 管道 + 锁
from multiprocessing import Queue,Process
queue = Queue()
queue.put(url)
url = queue.get()
from multiprocessing import Pipe,Process
pipe = Pipe()
pipe.send(url)
pipe.recv()


10,请简述你对join、daemon方法的理解,举出它们在生产环境中的使用场景;
join: 等待一个任务执行完毕;能够将并发变成串行。

daemon:
守护进程(守护线程)会等待主进程(主线程)运行完毕后被销毁。
运行完毕:
1.对主进程来讲,运行完毕指的是主进程代码运行完毕。
2.对主线程来讲,运行完毕指的是主线程所在的进程内全部非守护线程通通运行完毕,主线程才算运行完毕。


11,简述IO多路复用模型的工做原理
IO多路复用实际上就是用select,poll,epoll监听多个io对象,当io对象有
变化(有数据)的时候就通知用户进程。好处就是单个进程能够处理多个socket。

1.当用户进程调用了select,那么整个进程会被block;

2.而同时,kernel会“监视”全部select负责的socket;

3.当任何一个socket中的数据准备好了,select就会返回;

4.这个时候用户进程再调用read操做,将数据从kernel拷贝到用户进程。

总结:
1.I/O 多路复用的特色是经过一种机制一个进程能同时等待多个文件描述符,
而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,
select()函数就能够返回。
2.IO多路复用:须要两个系统调用,system call (select 和 recvfrom),
而blocking IO只调用了一个system call (recvfrom)。可是,用select的优点
在于它能够同时处理多个connection。
3.若是处理的链接数不是很高的话,使用select/epoll的web server不必定
比使用多线程 + 阻塞 IO的web server性能更好,可能延迟还更大。
4.select/epoll的优点并非对于单个链接能处理得更快,而是在于能处理更多的链接。


12,threading中Lock和RLock的相同点和不一样点
Lock():互斥锁,只能被acquire一次,可能会发生死锁状况。
RLock():递归锁,能够连续acquire屡次。
RLock = Lock + counter
counter:记录了acquire的次数,直到一个线程全部的acquire都被release,其余线程才能得到资源。

1三、什么是select,请简述它的工做原理,简述它的优缺点;
python中的select模块专一于I/O多路复用,提供了select poll epoll三个方法;后两个在linux中可用,

优势:使用select() 的事件驱动模型只用单线程(进程)执行,占用资源少,
不消耗太多 CPU,同时可以为多客户端提供服务。

缺点:一、当文件描述符过多时,文件描述符在用户空间与内核空间进行copy会很费时
二、当文件描述符过多时,内核对文件描述符的遍历也很浪费时间
三、select最大仅仅支持1024个文件描述符


1四、什么是epoll,请简述它的工做原理,简述它的优缺点;
epoll: 性能最好的多路复用I/O就绪通知方法。相比于select,epoll最大的
好处在于它不会随着监听fd数目的增加而下降效率。


1五、简述select和epoll的区别;
select 是不断轮询去监听的socket,socket个数有限制,通常为1024个;
poll仍是采用轮询方式去监听,只不过没有个数限制。
epoll并不用采用轮询方式去监听,而是当socket有变化时经过回调方式主动告知用户进程。
select支持多平台,epoll只支持linux平台。


1六、简述多线程和多进程的使用场景;
多进程用于计算密集型,如金融分析;利用多核实现并发。
多线程用于IO密集型,如socket,爬虫,web。

17,请分别简述threading.Condition、threading.event、threading.semaphore的使用场景;
condition: 某些事件触发或达到特定的条件后才处理数据。
event: 用来通知线程有一些事情已发生,从而启动后继任务的开始。
semaphore: 为控制一个具备有限数量用户资源而设计。

1八、假设有一个名为threading_test.py的程序里有一个li = [1, 2, 3, 4]的列表,
另有a,b两个函数分别往该列表中增长元素,
a函数须要修改li以前须要得到threading.Lock对象,b函数不须要,
请问当线程t1执行a函数获取到Lock对象以后并无release该对象的状况下,
线程t2执行b函是否能够修改li,为何?

能够,线程的数据是共享的,a 函数虽然上了锁,没有释放。因为b 函数不须要上锁,就能够访问资源。


1九、简述你对Python GIL的理解;
GIL(global interpreter lock)全局解释器锁
GIL是CPython的一个概念,本质是一把互斥锁,将并发运行变成串行。
解释器的代码是全部线程共享的,因此垃圾回收线程也有可能访问到解释器的代码去执行。
所以须要有GIL锁,保证python解释器同一时间只能执行一个任务的代码。

GIL:解释器级别的锁(保护的是解释器级别的数据,好比垃圾回收的数据)
Lock:应用程序的锁(保护用户本身开发的应用程序的数据)


20、什么是同步I/O,什么是异步I/O?
同步I/O:作”IO operation”的时候会将process阻塞;阻塞IO,非阻塞IO,IO多路复用都属于同步IO
异步I/O:当进程发起IO 操做以后,就直接返回不再理睬了,直到kernel发送一个信号,告诉进程说IO完成。


21,什么是管道,若是两个进程尝试从管道的同一端读写数据,会出现什么状况?
管道:是两个进程间进行单向通讯的机制。因为管道传递数据的单向性。管道又称为半双工管道。

管道传递数据是单向性的,读数据时,写入管道应关闭。写数据时,读取管道应关闭。


22,为何要使用线程池/进程池?
对服务端开启的进程数或线程数加以控制,让机器在一个本身能够承受的范围内运行,这就是进程池或线程池的用途.


23,若是多个线程都在等待同一个锁被释放,请问当该锁对象被释放的时候,哪个线程将会得到该锁对象?
这个由操做系统的调度决定。

24,import threading;s = threading.Semaphore(value=-1)会出现什么状况?
当threading.Semaphore(1) 为1时,表示只有一个线程可以拿到许可,
其余线程都处于阻塞状态,直到该线程释放为止。

固然信号量不可能永久的阻塞在那里。信号量也提供了超时处理机制。
若是传入了 -1,则表示无限期的等待。

26,某进程在运行过程当中须要等待从磁盘上读入数据,此时该进程的状态将发生什么变化?
一个程序有三种状态:运行态,阻塞态,就绪态;
遇到IO阻塞,进程从运行态转到阻塞态,cpu切走,保存当前状态;

27,请问selectors模块中DefaultSelector类的做用是什么;
IO多路复用:select poll epoll
select: 列表循环,效率低。windows 支持。
poll: 可接收的列表数据多,效率也不高。linux 支持。
epoll: 效率最高 异步操做 + 回调函数。linux 支持。

selectors 模块:
sel=selectors.DefaultSelector()
自动根据操做系统选择select/poll/epoll

28,简述异步I/O的原理;
用户进程发起read操做以后,马上就能够开始去作其它的事。
而另外一方面,从kernel的角度,当它受到一个asynchronous read以后,
首先它会马上返回,因此不会对用户进程产生任何block。
而后,kernel会等待数据准备完成,而后将数据拷贝到用户内存,
当这一切都完成以后,kernel会给用户进程发送一个signal,告诉它read操做完成了。

29,请问multiprocessing模块中的Value、Array类的做用是什么?举例说明它们的使用场景
python 多进程通讯Queue Pipe Value Array
queue和pipe用来在进程间传递消息;
Value + Array 是python中共享内存映射文件的方法;速度比较快.

30,请问multiprocessing模块中的Manager类的做用是什么?与Value和Array类相比,Manager的优缺点是什么
Python multiprocessing.Manager(进程间共享数据)

Python中进程间共享数据,除了基本的queue,pipe和value+array外,
还提供了更高层次的封装。使用multiprocessing.Manager能够简单地使用这些高级接口。

Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,
Event,Queue,Value和Array。


31,请说说你对multiprocessing模块中的Queue().put(), Queue().put_nowait(), Queue().get(), Queue().get_nowait()的理解;
q = Queue(3) 队列 先进先出 进程间通讯; 队列 = 管道 + 锁
q.put()
q.put_nowait() # 无阻塞,当队列满时,直接抛出异常queue.Full
q.get()
q.get_nowait() # 无阻塞,当队列为空时,直接抛出异常queue.Empty

32,什么是协程?使用协程与使用线程的区别是什么?协程:单线程下的并发。协程是一种用户态的轻量级线程,即协程是由用户程序本身控制调度的。 1.python的线程是属于内核级别的,即由操做系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其余的线程运行) 2.单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操做系统)控制切换,以此来提高效率(!!非io操做的切换与效率无关)

相关文章
相关标签/搜索