ComePlus Dev Test Paper

请选择你会的题目进行解答,回答请简明扼要,不需描述细节

操作系统

什么是操作系统的内核模式和用户模式?
一个进程有几个堆栈(Stack),是由什么决定的?
操作系统里中断(Interrupt)和异常(Exception)的区别是什么?
什么是写时复制(Copy On Write)? 请列举该机制的应用场景?
优化一个以I/O为瓶颈的程序,以下哪些方法效果比较显著, Why?
1. 增加CPU数目
2. 提高CPU主频
3. 增大内存的容量
4. 采用多线程
5. 采用异步I/O和多路(Multiplex)I/O
6. 对每次I/O进行Batch访问(多次I/O合并一次完成)

编译器, C语言

32位C程序中, 虚拟内存地址0x00000000-0xffffffff中分为哪些内存段? 每个段的作用是什么? (提示: C程序是如何分配内存的)
为什么C程序在stack中直接分配的变量不需要free? 而用malloc动态分配的需要free?
malloc分配的内存中的结构(heap)是如何维护的? 为什么同一个指针free多次会出错?
为什么C程序要引用.h文件?
如果程序引用的.h文件的定义和.so(.DLL)里面的接口不一致,会出现什么情况?编译错?连接错?运行错?什么情况下在哪一步会错?
请解释缓冲区溢出攻击的原理
以下C函数运行到"breakpoint"时,内存堆栈(Stack)中的结构是什么样的?

int __stdcall add(int x, int y)
{
    int ret = x + y;
    return ret; //breakpoint
}
以下C函数的执行结果是什么?

int recursive(int x)
{
    return x + recursive(x-1);
}

recursive(10);
以下C函数的问题在哪?

char* strcpy(const char* c)
{
    char buf[32];
    char *p = &buf[0];
    while(*c != '\0')
        *p++ = *c++;
    return buf;
}

###语言基础

请描述托管型(Managed)语言和本地型(Native)语言的区别,并举例说明
请分别列举出你所熟悉的编译型(Compile)语言和解释型(Interpret)语言
请描述强类型(Strong Typed)语言和弱类型(Weak Typed)语言的区别,以及各自的优劣和适用的领域。
什么是Duck Type? 它和强类型对象的区别在哪? 优势在哪?
请描述值类型(某些语言里也叫Primitive或Immutable类型)对象和引用类型对象的区别? String是哪种类型的对象? 请结合具体语言举例.
请描述你所熟悉的语言对面向对象是如何支持的? 
如何维护this指针? 如何支持虚函数? 如何支持继承?
请分析C++ Template和Java Generic实现机制的区别? 
为什么动态语言(JavaScript, Python)没有Template的概念?
请简要描述你熟悉的各种语言的垃圾回收(GC)机制。它们对循环引用是如何处理的?
如何查找内存泄漏(Memory Leak)?
请分析以下各种异常处理方式的优劣和适用场景:
1. try ... catch ...
2. if(returnValue) ... else ...
3. 不做任何检查和异常处理
请解释下列设计模式: Singleton, Observer, Decorator
以下Java类是线程安全的吗? 如何改进?

public class LazyInit {
	private ExpensiveObject instance = null;
	public ExpensiveObject getInstance() { 
		if (instance == null)
			instance = new ExpensiveObject(); 
		return instance;
	} 
}

###算法

关于哈希(Hash)算法和B-Tree算法
1. 请分析这两种算法的主要区别,和各自的适用领域
2. 请分别列举出使用该两种算法做索引的数据库产品

###数据库

请列举出你所熟悉的数据库产品? 其中哪些是NoSQL数据库? 其中哪些又是Key-Value类型的数据库?
在你所熟悉的数据库中, 它们是否支持索引? 各自对索引实现的机制是什么?
在你所熟悉的数据库中, 它们是否支持事务(Transaction)或原子操作(Atomic)? 以及各自对事务的实现原理是什么?
在你所熟悉的数据库中, 它们是否支持分库(集群Cluster)? 以及各自对分库的实现机制是什么?
现有SQL表如下, 数据中category和value为一对多的关系
CREATE TABLE `test` (
  `category` int,
  `value` int,
);

查询category=1中value的最小值
1. 请写出SQL语句
2. 请建立可优化该查询的索引

###网络基础

请解释下列术语: 
UrlEncode, Utf8, JSON, UTC, MD5
写出以下HTTP状态的含义: 
200, 302, 304, 400, 403, 500, 502
请写出下列常用端口所对应的应用:  
21, 22, 23, 80, 443, 3306, 6379, 10050, 11211, 27017, 55672
NAT服务器的原理是什么? 属于网络协议中的哪一层?
HTTPS 是不可破解的吗?HTTPS保护的是数据传输中的哪一部分?
ARP 欺骗是什么原理?
数字签名是什么原理?

###Unix基础

什么是Daemon进程?
描述以下Unix Signal的含义和区别: 
9(KILL), 15(TERM)
描述以下文件属性的含义: 
 -rwsr-xr-x, drwxrwxrwt
列举Unix系统提供的IPC(进程间通信)的机制
请用正则表达式描述IP地址段192.168.1.1/24
请列举在内网的两台服务器中拷贝文件的方法? 用Shell脚本解答
如何删除当前目录(及其子目录)中所有扩展名为.o的文件? 用Shell脚本解答

###服务器

请列举你熟悉的Web服务器框架
请写出你熟悉的网络服务器负载均衡的策略
请简要描述你熟悉的网络传输序列化(Serialization)框架或格式 
(例如Protobuf)
请列举出你所熟悉的文件存储服务,并分析各自的优劣和适用场景
(例如NFS, HDFS, FastDFS)
描述你知道的网路服务API的验证或加密方法?
描述聊天(长连接)服务器和普通Web(HTTP)服务器的区别
如何实现分布式服务器中对全局资源访问的锁(分布式锁)机制?
简要描述你所熟悉的服务器监控系统
(例如Zabbix)

###工程基础

写出你常用的编程工具集
1. 用哪种文本编辑器? 
2. 用什么工具(或格式)写程序的API文档? 
3. 用什么进行编译和调试?
4. 其他工具?
在没有安装图形界面的机器上,如何进行编程和调试?
向Git中增加一个新文件并commit, 请写出相关命令
列举你熟悉的测试框架
列举你熟悉的软件工程管理工具 (进度跟踪, Bug管理等)
迭代开发(Iteration)和瀑布开发(Waterfall)模式的区别在哪,你更倾向于哪种? 为什么?

###综合题

一个程序没有响应(hang)。假设该程序为C语言编写,在无源代码的情况下, 如何知道该程序当前在做什么? 请写出排查问题的步骤以及涉及的命令
浏览器打不开baidu.com,请写出排查问题的步骤和相关命令

###编程题

编程解析简化版JSON字符串
1. 假设该JSON没有数组只有Dict, 且key和value都只能是字符串如下
{"key":{"key":"value"}}
2. 请给出清晰程序架构, 不必考虑过多细节
3. 请用你熟悉的任何语言实现
有若干个文本文件,每个文件的格式为"ID\n", example:
input1.txt
100
101
...
input2.txt
101
102
...
请统计每个ID出现的次数, 输出格式为"ID\tCount\n", example:
100 5
101 2
...
可借助MapReduce**
请用你熟悉的任何语言(或脚本)实现

###开放问题

你从什么时候开始接触编程? 为什么选择软件开发这个行业?
你有没有参与过开源的项目?或阅读过源代码?你最喜欢哪些开源项目?
你喜欢去那些开发相关的社区? 喜欢哪些开发书籍?
你有没有破解过其他程序(破解网络协议或加密程序)? 如何做的?