第一题:填空题(共10题,每题2分)
- 根据权限查找文件的命令: find -perm
- 操作系统是怎样组织管理进程控制块PCB的: 双向循环链表
- TCP服务的特点: 面向连接的,可靠的,字节流服务
- UDP服务的特点: 无连接 不可靠 数据报服务
- HTTP中服务器返回403代表什么意思: 客户端权限不足
- listen函数第二个参数的含义: 指定内核中维护已完成三次握手的队列的大小
- libevent通过什么管理超时事件: 最小时间堆
- 进程间通讯的方式: 管道(有名、无名) 信号量 消息队列 共享内存 信号 socket
- 线程共享那些数据: 全局数据 堆区数据 进程打开的文件资源
- 临界区的概念: 访问临界资源的代码区域
第二题:简答题(共10题,每题5分)
- 简述静态库和动态库的区别。
静态库: 在程序链接阶段,静态链接进最终的可执行文件,可执行文件中相等于有静态库的副本,在执行期间,不需要依赖静态库。
动态库: 在程序运行期间,由操作系统动态加载到内存上单独执行。
- 简述TCP服务都有那些保证可靠传输的机制。
1)保证数据能到达对端: 超时重传&确认机制 滑动窗口(发送方发送速率与接收端的接收缓冲区空间匹配) 拥塞控制(发送方发送速率与网络环境匹配)
2)保证数据不乱序,不重复: TCP报头中的32位序号,序号值为随机值ISN+报文段所携带数据的第一个字节在整个字节流中的偏移量。
3)保证数据不失真: TCP报头中的16位冗余校验码,接收端对TCP的头部和数据部分通过CRC算法进行冗余校验。
- 简述select、poll、epoll三种I/O复用函数的区别与特点,简述epoll的ET和LT模式。
- 从能够监听的事件类型: select只有三种,poll和epoll可以监听更多
- 从能够监听的文件描述符个数: select最多1024个,poll和epoll更多(由系统限制)
- 从返回的文件描述符:select和poll都会返回所有的关注的文件描述符(就绪的和未就绪的),epoll只会返回就绪的,所以用户程序检测就绪文件描述符的时间复杂度分别为O(n) O(1)
- 从函数参数: 每次select调用, 内核都会在线修改传递的参数,所以每次调用select都必须重新设置参数。poll(将用户关注的事件类型和内核修改的事件类型分离开表示)和epoll(由内核事件表维护用户关注的文件描述符上的事件类型)则不需要。
- 从调用时拷贝的文件描述: select和poll每次调用都需要将用户空间数据拷贝到内核空间,返回时,将内核修改的数据在拷贝到用户空间,epoll只会在调用epoll_ctl时拷贝一次,epoll_wait调用时,只从内核向用户拷贝就绪的文件描述符。
- 从内核实现角度: select和poll采用轮询的方式检测就绪的事件,epoll采用回调的方式。
- 从工作模式: select和poll只能工作在效率较低的LT模式下,epoll支持高效率的ET模式。
epoll的ET和LT的区别:
从使用上来看,LT模式下,同一个事件就绪后,如果应用程序并没有及时处理,下次还会再被通知给应用程序。ET模式则是如果就绪事件被通知给应用程序而其没有处理或者没有处理完成,则下次不会再次通知。
从内核实现上看: epoll的epoll_wait函数检测内核链表rdlist是否为空,不为空则将rdlist中的结点移动到txlist中(移动完成后,rdlist为空),接着遍历txlist中的每个结点,查看是否事件就绪,如果就绪就拷贝给epoll_wait调用时传递的用户数组上。对于LT模式,接下来会将还被关注的事件从txlist中拷贝回rdlist。对于ET模式,则不会被拷贝回rdlist。所以下次epoll_wait调用不会再直到之前就绪的事件。
- 简述父子进程之间为什么共享打开的文件描述符
fork之后,父子进程共享fork之前打开的文件描述符,其原因是因为子进程的PCB是由父进程拷贝而来,拷贝打开的文件信息时,仅仅拷贝了指针,而父子进程的指针指向的是同一个文件结构,仅仅是文件结构中的f_count加一。
- 简写kill系统调用函数的实现代码。(current指针指向当前进程的PCB结构)
kill的原型: int kill(pid_t pid, int sigtype);
第一步:根据pid的值,找到pid进程对应的PCB结构
第二步:判断sigtype是否合法
第三步:将sigtype代表的信号值设置到PCB结构中的signal中。
- 简述IPV4头部信息。
- 简述写时拷贝技术,以及vfork函数和fork函数的区别。
写时拷贝技术: fork之后,并不执行数据段、堆和栈的完全复制 , 而内核将这些共享的空间的访问权限修改为只读。当父子进程任意一个进程修改数据时,才会将修改数据所在的“页”拷贝一份出来。
vfork和fork的区别:
- vfork并不会将父进程的地址空间完全复制给子进程,在子进程调用exec或exit之前,子进程在父进程空间中运行,所以比fork的部分复制效率更高
- vfork保证子进程先运行,在子进程执行exit或exec后,父进程才会被调度执行
- 简述TIME_WAIT状态存在的意义。
- 保证可靠的终止TCP连接 -- 保证四次挥手最后一次的ACK能够到达对方,对方能够正常退出
- 保证迟来的数据能被识别并丢弃 -- 防止本次连接上的数据对下一个新的连接造成影响
- 简述你所知道的进程调度算法(至少两种),其原理以及缺陷。
1、先来先服务 -- 效率比较低下,不能后做到实时处理
2、优先级 -- 可能会存在进程饿死的情况
- 简述中断处理程序为什么分上半部分和下半部分。及其各自做了那些事情。
中断处理程序被分为上半部分和下半部分,只要是为了防止中断处理程序执行过程中,该中断被屏蔽的。一般要求上半部分尽可能快的执行。只要的中断任务处理都交由下半部分执行。
第三题:编程题(共4题,每题10分)
- 实现异步处理僵死进程。
- 实现主线程切割字符串“1 2 3 4 5 6 7”,函数线程切割字符串“a b c d e f g”,每隔一秒钟切割一次。
- 用I/O复用函数epoll实现同时处理TCP和UDP服务。