基础篇:操作系统、计算机网络、设计模式
一:操作系统
进程的有哪几种状态,状态转换图,及导致转换的事件。
进程与线程的区别。
进程通信的几种方式。
线程同步几种方式。(一定要会写生产者、消费者问题,完全消化理解)
线程的实现方式. (也就是用户线程与内核线程的区别)
用户态和核心态的区别。
用户栈和内核栈的区别。
内存池、进程池、线程池。(c++程序员必须掌握)
死锁的概念,导致死锁的原因.
导致死锁的四个必要条件。
处理死锁的四个方式。
预防死锁的方法、避免死锁的方法。
进程调度算法。(周转时间 = 程序结束时间 – 开始服务时间、带权周转时间= 周转时间 / 要求服务时间)
Windows内存管理的方式(块式、页式、段式、段页式).
内存连续分配方式采用的几种算法及各自优劣。
动态链接及静态链接.
基本分页、请求分页储存管理方式。
基本分段、请求分段储存管理方式。
分段分页方式的比较各自优缺点。
几种页面置换算法,会算所需换页数。(LRU用程序如何实现?)
虚拟内存的定义及实现方式。
操作系统的四个特性。
DMA。
Spooling。
外存分配的几种方式,及各种优劣。
二:计算机网络
电路交换与分组交换的区别?优劣对比。OSI有哪几层,会画出来,知道主要几层的各自作用。TCP/IP有哪几层,会画出来,知道所有层数的作用,会列举各层主要的协议名称。硬件(MAC)地址的概念及作用。ARP协议的用途 及算法、在哪一层上会使用arp ?CRC冗余校验算法,反码和检验算法。如何实现透明传输。知道各个层使用的是哪个数据交换设备。(交换机、路由器、网关)路由表的内容。分组转发算法。IP报文的格式,格式的各个字段的含义要理解。 12.MTU的概念,啥叫路径MTU? MTU发现机制,TraceRoute(了解)。 13.RIP协议的概念及算法。 14.ICMP协议的主要功能。 15.组播和广播的概念,IGMP的用途。(环回地址、广播地址) 16.Ping协议的实现原理,ping 命令格式。子网划分的概念,子网掩码。IP地址的分类,如何划分的,及会计算各类地址支持的主机数。 19.DNS的概念,用途,DNS查询的实现算法。TCP与UDP的概念,相互的区别及优劣。 21.UDP报文的格式,字段的意义。TCP 报文的格式,字段的意义。 23.TCP通过哪些措施,保证传输可靠?三次握手,四次断开过程。TIME_WAIT状态的概念及意义。 26.滑动窗口协议 与停止等待协议的区别。TCP的流量控制和拥塞控制实现原理(会画拥塞控制的典型图)。 28.TCP的快速重传与快速恢复算法。 29.TFTP 与 FTP的区别。 30.阻塞方式和非阻塞方式,阻塞connect与非阻塞connect。(比较难,有兴趣可以了解)HTTP基本格式。(java程序员必须掌握) 三:设计模式各种常用模式的用途,使用方法(类图)。单例模式的双重检查实现。MVC模式提高篇:WIN32、MFC与Linux
一: WIN32
Win32应用程序的基本类型.
创建win32窗口程序的几个步骤,及使用到的函数。
nmake 与 makefile。
有哪些字符集? Win32对于各种字符集如何进行兼容及转换? (wchar_t、TCHAR、TEXT() )。
怎么创建一个子窗口?在哪进行设置?
窗口类的分类,如何创建一个应用程序全局窗口类。
Win32窗口程序运行机制与控制台程序的运行机制有何区别?
Getmessage函数的作用,与Peekmessage函数的区别。
发送WM_QUIT消息使程序终止的内部过程。
TranslateMessage及 DispatchMessage的作用。
SendMessage与PostMessage的区别。
Win32消息机制获取消息的过程(先查看什么消息?再查看什么消息?)
知道有哪几类主要的消息。(WM_CREATE, WM_DESTROY, WM_SIZE, WM_SYSCOMMAND, WM_COMMAND, WM_PAINT, 鼠标消息, 键盘消息)。
定时器如何使用。
用户自定义消息如何定义。
创建菜单、设置菜单的函数,在哪处理菜单命令的消息。
加速键如何使用?
GDI绘图对象,使用的步骤,及函数。
使用位图的步骤及用到的主要函数。
可用于文字绘制的API函数。
有模式对话框与无模式对话框的区别,创建步骤。收到的创建消息是什么?
子控件和父窗口通过什么进行通信? 父窗口在哪里处理子窗口发送的消息?
有哪些常见的子控件?(静态框、编辑框、按钮、listbox、comboBox、滚动条)25. 什么样的控件支持自绘制?
动态库与静态库的区别。
Win32里面怎样用静态库? C++程序在引用c的静态库时,需要注意什么?
Win32里面动态库有哪几种导出方式,有哪几种导入方式?(注意c++的导出方式)
Win32里面文件打开和关闭的API。
Windows地址空间的划分。
Windows 内存使用的几种方式及相应的函数(虚拟内存、堆内存、栈内存)。
Malloc内部调用A函数,A函数调用B函数。A和B分别是什么?
内存映射文件的作用。主要函数。
创建进程和打开进程用什么函数? 有什么区别?
创建线程用什么函数?试比较_beginthreadex、_beginthread 和 CreateThread的区别。
关闭线程和关闭进程的函数分别是什么?试比较_endthreadex、_endthread 和 ExitThread的区别。
(36、37解答:
1)<<Windows核心编程>>中有很详细地介绍。 _beginthreadex是微软的C/C++运行时库函数,CreateThread是操作系统的函数。_beginthreadex通过调用CreateThread来实现的,但比CreateThread多做了许多工作。注意:若要创建一个新线程,绝对不要使用CreateThread,而应使用_beginthreadex. Why?考虑标准C运行时库的一些变量和函数,如errno,这是一个全局变量。全局变量用于多线程会出什么事,你一定知道的了。故必须存在一种机制,使得每个线程能够引用它自己的errno变量,又不触及另一线程的errno变量._beginthreadex就为每个线程分配自己的tiddata内存结构。该结构保存了许多像errno这样的变量和函数的值、地址(自己看去吧)。通过线程局部存储将tiddata与线程联系起来。具体实现在Threadex.c中有。结束线程使用函数_endthreadex函数,释放掉线程的tiddata数据块。
2)解释一下理论上的区别: CreateThread、_beginthread和_beginthreadex都是用来启动线程的,但大家看到oldworm没有提供_beginthread的方式,原因简单,_beginthread是_beginthreadex的功能子集,虽然_beginthread内部是调用_beginthreadex但他屏蔽了象安全特性这样的功能,所以_beginthread与CreateThread不是同等级别,_beginthreadex和CreateThread在功能上完全可替代,我们就来比较一下_beginthreadex与CreateThread!
CRT的函数库在线程出现之前就已经存在,所以原有的CRT不能真正支持线程,这导致我们在编程的时候有了CRT库的选择,在MSDN中查阅CRT的函数时都有: Libraries LIBC.LIB Single thread static library, retail version LIBCMT.LIB Multithread static library, retail version MSVCRT.LIB Import library for MSVCRT.DLL, retail version 这样的提示! 对于线程的支持是后来的事! 这也导致了许多CRT的函数在多线程的情况下必须有特殊的支持,不能简单的使用CreateThread就OK。 大多的CRT函数都可以在CreateThread线程中使用,看资料说只有signal()函数不可以,会导致进程终止!但可以用并不是说没有问题!
有些CRT的函数象malloc(), fopen(), _open(), strtok(), ctime(), 或localtime()等函数需要专门的线程局部存储的数据块,这个数据块通常需要在创建线程的时候就建立,如果使用CreateThread,这个数据块就没有建立,然后会怎样呢?在这样的线程中还是可以使用这些函数而且没有出错,实际上函数发现这个数据块的指针为空时,会自己建立一个,然后将其与线程联系在一起,这意味着如果你用CreateThread来创建线程,然后使用这样的函数,会有一块内存在不知不觉中创建,遗憾的是,这些函数并不将其删除,而CreateThread和ExitThread也无法知道这件事,于是就会有Memory Leak,在线程频繁启动的软件中(比如某些服务器软件),迟早会让系统的内存资源耗尽!
_beginthreadex(内部也调用CreateThread)和_endthreadex就对这个内存块做了处理,所以没有问题!(不会有人故意用CreateThread创建然后用_endthreadex终止吧,而且线程的终止最好不要显式的调用终止函数,自然退出最好!)
谈到Handle的问题,_beginthread的对应函数_endthread自动的调用了CloseHandle,而_beginthreadex的对应函数_endthreadex则没有,所以CloseHandle无论如何都是要调用的不过_endthread可以帮你执行自己不必写,其他两种就需要自己写!(Jeffrey Richter强烈推荐尽量不用显式的终止函数,用自然退出的方式,自然退出当然就一定要自己写CloseHandle)
)
Waitforsingleobject与Waitformultiobjects的区别。Waitforsingleobject的第二个参数为0表示什么意思?
线程局部存储(TLS)的意义,如何指定一个变量的TLS属性。
Win32线程同步提供的方式,及主要函数为什么?
提供的同步措施中哪些是内核对象? 试比较互斥量和临界区。
二:MFC
MFC包含哪几类程序? 其中MFC应用程序又包含哪几类?MFC的中的大多数类都继承自哪个类?MFC主要要用到哪几个类?及其各个类的作用。MFC中有哪6类核心机制?Cobject中封装了哪些机制?在哪个类的什么函数中进行MFC程序初始化? 相当于main功能的函数。MFC应用程序的启动机制的实现。(几个步骤及相关函数)窗口的创建及窗口处理函数机制的实现。(几个步骤及相关用到函数)消息映射机制的原理及实现。宏。(查找消息处理函数的几个步骤及其函数)MFC的消息分类。自注册消息用什么函数进行注册?消息映射宏是什么?MFC菜单、工具栏、状态栏所用的类是什么?怎么定义一个视图窗口?划分窗口使用什么类? 划分窗口有哪两类,有什么区别?运行时类信息 机制的宏,及原理。CRuntimeClass的内容,isKindOf实现方法。动态创建 机制的宏,及实现。与运行时类信息在内容添加上的区别?消息的派发会经过哪几个类?一般在哪个类里进行处理?SetActiveView的作用。单文档、多文档模板类是什么? 保存模板类用什么函数?新建模板用什么函数?单文档视图的创建过程及所用到的相关函数。MFC绘图有哪几类DC?各自的类名,及区别。MFC有哪几类绘图对象?各自的类名。MFC有哪几类数据集合类?CMAP的底层实现?MFC的文件类是什么?文件查找类是什么?序列化机制 的宏,怎么使用? 执行>>和<<时进行的内部操作及其相应函数。MFC的对话框的种类,各自怎么使用?及相关函数。定义对话框数据交换的步骤,及使用方法,实现原理。通用对话框有哪些,试举例。MFC常用的通用控件有哪些?举出类名。MFC的动态库有哪几种类型?扩展库一般用来做什么?MFC的线程有哪几类? 相互有什么区别?各自的创建方法是什么?VC环境下可以使用哪几类socket? 其中MFC的socket类 有哪几种,各自区别?类名是什么?用什么函数初始化MFC的socket库。三:Linux基本命令
绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?怎么查看当前进程?怎么执行退出?怎么查看当前路径?怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户id?查看指定帮助用什么命令?Ls 命令执行什么功能? 可以带哪些参数,有什么区别?建立软链接(快捷方式),以及硬链接的命令。目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?文件权限修改用什么命令?格式是怎么样的?查看文件内容有哪些命令可以使用?随意写文件命令?怎么向屏幕输出带空格的字符串,比如”hello world”?终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?移动文件用哪个命令?改名用哪个命令?复制文件用哪个命令?如果需要连同文件夹一块复制呢?如何需要有提示功能呢?删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?删除空文件夹用什么命令?Linux下命令有哪几种可使用的通配符?分别代表什么含义?用什么命令对一个文件的内容进行统计?(行号、单词数、字节数)Grep命令有什么用? 如何忽略大小写? 如何查找不含该串的行?Linux中进程有哪几种状态?在ps显示出来的信息中,分别用什么符号表示的?怎么使一个命令在后台运行?利用ps怎么显示所有的进程? 怎么利用ps查看指定进程的信息?哪个命令专门用来查看后台任务?把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?终止进程用什么命令? 带什么参数?怎么查看系统支持的所有信号?搜索文件用什么命令? 格式是怎么样的?查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?使用什么命令查看用过的命令列表?使用什么命令查看磁盘使用空间? 空闲空间呢?使用什么命令查看网络是否连通?使用什么命令查看ip地址及接口信息?查看各类环境变量用什么命令?通过什么命令指定命令提示符?查找命令的可执行文件是去哪查找的? 怎么对其进行设置及添加?通过什么命令查找执行命令?34. 怎么对命令进行取别名?四:Linux编程
列举Linux内存管理相关的几个函数,各自有什么功能?GCC只编译的选项是什么?只进行预处理的选项是什么?在命令行定义宏的选项是什么?Linux静态库的使用,怎么创建一个静态库? 怎么使用一个静态库?静态库文件的后缀名是什么?静态库的命名规范。nm 工具的作用,ldd工具的作用。Linux动态库的使用,怎么创建一个动态库? 动态库文件的后缀名是什么?怎么使用一个动态库?动态库的命名规范? 系统默认的动态库的查找路径?动态库显示连接所使用的系统库是什么?Linux下make 与makefile。用什么参数指定makefile文件? 什么是默认的makefile文件。在哪个文件夹下存有进程运行时的所有信息?每个程序默认打开哪三个文件设备?操作文件描述符的读写函数是什么?打开文件描述符以及关闭文件描述符的函数?Fcntl函数主要的几个作用。创建进程的几个函数,及各自区别。父进程先结束,子进程会变为? 子进程先结束,子进程会变为?怎么使父进程回收子进程? 相关的几个函数。子进程在创建时与父进程的内存资源的复制问题。中断信号、终止信号、定时器信号的宏是什么?在程序中注册信号和发送信号用什么函数?信号的可靠与不可靠的含义。哪些信号是可靠的?哪些信号是不可靠的?信号屏蔽用什么函数? SigSuspend的作用? Sigpending的作用?信号处理函数处理信号时是否会被信号中断?最新版本的信号发送与处理函数?与老版本的发送与数据函数有什么区别?Linux下进程有哪些通信方式(IPC)?TCP服务器编程模型。UDP服务器编程模型。TCP编程特征,由于每次不定长数据到达,则一般使用什么选项?Selected模型是什么? 相比而言多进程实现方式有什么区别?Selected、epoll模型、poll模型的区别。常用的socket选项有哪些?利用哪个函数来设置socket选项?怎么发送和设置带外(OOB)数据?Linux 下多线程的库是什么? 利用哪个函数创建线程?利用哪个函数强制结束线程?主线程等待子线程结束时使用的函数?线程怎样在被迫退出时能做一些善后处理?以及怎么用linux特有的方式处理?算法篇:算法与数据结构 一:算法
算法的几个特征是什么。
算法复杂性的定义。大O、θ、、小o分别表示的含义。
递归算法的定义、递归算法的两要素。
分治算法的思想,经典的分治算法(全排列、二分搜索、归并排序、快速排序、线性时间选择、最接近点对问题)。
动态规划算法解题框架,动态规划算法的两个要素是什么?备忘录方法是什么?
经典的动态规划问题(矩阵连乘问题、最长公共子序列问题、0-1背包问题)。
贪心算法的思想,贪心算法的两个要素。
经典的贪心问题(活动安排问题、背包问题、装载问题、哈夫曼编码、单源最短路径、最小生成树问题)。
回溯法的思想,回溯法中有哪两种典型的模型。
经典的回溯算法(n后问题、0-1背包问题、旅行售货商问题)。
分支限界法思想,有哪两种分支限界法。
经典的分支限界算法(0-1背包问题、旅行售货商问题)。
二:数据结构
数据结构的定义。栈的两个应用:括号匹配和表达式的计算。是怎么应用的?表达式计算用的是哪种表达方式?有什么好处?字符串匹配算法:朴素的匹配算法、KMP算法。二叉树前序、中序、后序递归遍历算法。二叉树前序非递归遍历算法。堆,建堆算法,堆的插入和删除算法,堆排序。哈希。哈希函数的有哪些种?余数的取法? 处理冲突的方法? 闭散列方法有哪些?二叉搜索树的搜索、插入、删除。时间复杂度。二叉平衡树的插入结点的原理,有哪几种旋转方式?分别适用于哪种情况。分析二叉平衡树的时间复杂度。红黑树的定义,红黑树的性能分析和与二叉平衡树的比较。图有哪些储存表示。链表插入排序、链表归并排序。常见的有哪几种排序算法,试比较其时间复杂度,以及是否稳定,及各自使用的情形。常用分配排序有哪几种? 基数排序的定义,分类及原理。外部排序的过程。B树、B+树、Trie的概念及用途,添加删除结点的原理。