并发编程练习题
1、简述计算机操作系统中的“中断”的作用?
当遇到IO操作时或一个进程运行时间过长或被更高的优先级的进程替代时出现中断,保留此时的状态,转而执行其他的操作。
待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。有利于合理利用有限的系统资源,提高程序运行效率。
2、简述计算机内存中的“内核态”和“用户态”;
当进程执行系统调用中执行内核代码时,我们就称进程处于内核态
当进程在执行用户自己的代码时,则称其处于用户态
处于用户态的程序只能访问用户空间,而处于内核态的程序可以访问用户空间和内核空间
3、进程间通信方式有哪些?
进程之间的通信可以通过通道与队列实现,Queue模块(put、get、full、empty)
4、简述你对管道、队列的理解;
队列和管道都是将数据存放于内存中,而队列是基于“管道+锁”实现的
管道(PIPE):管道通信方式的中间介质是文件,一端进行写操作,一端进行读操作,通过管道进行协调,l流式的传输信息。
队列:消息队列提供了一种在两个不相关进程间传递数据的简单有效的方法,发送的是一个一个的数据块。
5、请列举你知道的进程间通信方式;
队列,信号量,Event事件,定时器Timer,线程queue,进程池线程池,异步调用+回调机制
6、什么是同步I/O,什么是异步I/O?
同步I/O:遇见I/O阻塞时,主进程会在此等候,直到阻塞结束。
异步I/O:遇见i/O阻塞,进程不会发生阻塞返回一个异常,主进程继续执行;当I/O准备好时,发送一个信号提醒
7、请问multiprocessing模块中的Value、Array类的作用是什么?举例说明它们的使用场景
实现进程之间数据内存的共享
8、请问multiprocessing模块中的Manager类的作用是什么?与Value和Array类相比,Manager的优缺点是什么?
Manager也是用于共享内存。其优点在于可以用于进程池/线程池中,缺点体现在Windows中,会占用较多的资源(要置于if __name__ == "__main__"之下)。
9、写一个程序,包含十个线程,子线程必须等待主线程sleep 10秒钟之后才执行,并打印当前时间;
from threading import Thread,currentThread,Event event = Event() import time def run(): event.wait() print('%s is run..time is %s.'%(currentThread().getName(),time.time())) if __name__ == '__main__': for i in range(9): t=Thread(target=run) t.start() time.sleep(10) event.set()
10 、 写一个程序,包含十个线程,同时只能有五个子线程并行执行;
from threading import Thread,Semaphore,currentThread import time sm = Semaphore(5) def run(): sm.acquire() print('%s is run '%currentThread().getName()) time.sleep(2) sm.release() if __name__ == '__main__': for i in range(10): t = Thread(target=run) t.start()
12、写一个程序,使用socketserver模块,实现一个支持同时处理多个客户端请求的服务器,要求每次启动一个新线程处理客户端请求
import socketserver class MySever(socketserver.BaseRequestHandler): def handle(self): while True: try: data = self.request.recv(1024) print(data) if not data: break self.request.send(data.upper()) except ConnectionResetError: break self.request.close() sever = socketserver.ThreadingTCPServer(('127.0.0.1',9999),MySever) sever.serve_forever()
from socket import * from threading import currentThread,Thread def client(): sock = socket(AF_INET,SOCK_STREAM) sock.connect(('127.0.0.1',9999)) while True: sock.send(('%s hi'%currentThread().getName()).encode()) data = sock.recv(1024) print(data.decode()) sock.close() if __name__ == '__main__': for i in range(100): t = Thread(target=client) t.start()