1.socket网络编程中源端口和目的端口是怎么指定的?
socket网络编程中目的IP和端口是程序指定的,源端口是系统随机分配的。
2.什么叫事件驱动?
程序的运行流程是由特定的事件来决定的,一般来说是启动一个事件循环不断的检查是否有等待的事件发生,事件发生后运行一个触发的
函数进行处理。图像界面和操作系统就是典型的事件驱动模型。
3.gevent是阻塞还是非阻塞的?是同步还是异步?
gevent的monkey patching会用gevent自己实现的socket模块替换原生的socket模块,这个自己实现的socket是在原生的socket基础是做了
两个重要的修改:1,将所有的socket设置成非阻塞的;2,在关键函数如send,recv等发生阻塞时在socket的fd上添加回调函数,并switch
到主协程。
gevent内部的loop是用libev实现的,也就是IO多路复用epoll,所以是同步的。gevent是用同步的方法写异步的应用,使用IO多路复用对
文件描述符监听,从而实现协程的透明切换,让程序异步执行,但是仍然属于同步IO。
gevent的优势在于协程的协作式调度,协程之间异步执行,但任何时刻都只有一个协程在运行。由gevent来保证协程之间透明的上下文切换。
4.linux读写锁的读优先和写优先是怎么实现的?
linux读写锁是读优先,设置一个很大的值(0x0100 0000),加读锁的时候减1,如果非负就可以加锁成功,加写锁的时候减0x0100 0000,
所以读锁更容易加上,理论上加读锁比加写锁容易0x0100 0000倍。
可以使用一个互斥锁和一个条件变量实现读写锁。
5.Boost中有几种锁?
Boost中有unique_lock独占锁和shared_lock共享锁共两种锁,mutex有两种:mutex独占互斥类和shared_mutex共享互斥类。