基本流程
面试包括一小时笔试,三轮面试官面试,我面的是云计算相关,对方基本业务是为内部呼叫中心提供云服务,说是有上万个呼叫中心,用嵌入式盒子加显示器做云终端,连接到云上,主要编程语言是python
跟新,现在已经入职,主要是做内部web发布工具,需要的技术栈包括python,django,数据库以及web开发常用技术
笔试
笔试包括选择题,和三道编程题
选择题
主要是一些数学题和逻辑题,数学底子比较好应该没问题
三道编程题
数组中是否存在和为s的两个数
一个数组,判断其中有没有两个数和为s
先排序,两个游标分别指向首尾,可以先判断最小的数是否大于s/2,变少判断,复杂度为O(n*log(n))
动态规划 弱项
一个数组保存硬币面值,求和为S的最小硬币数
第k大的数
m个已经排好序的数组,求这m个数组中第k大得数
一轮面试
比较基础
二轮面试
比较基础,问了些比较软的东西,实习经历相关,实习有什么收获之类的
三轮面试
压力较大,面试官技术很厉害的样子,问你看过哪些书,然后挑你不知道的问,有点挑刺,压力面的味道
面试题目搜集
python里面元组和dict区别
线程和进程
同一进程的不同线程的异同
不同点:
- 标示符id
- 状态及状态转换,需要提供一些操作
- 上下文环境:程序计数器等寄存器
- 自己的栈和栈指针
相同点:
共享所在进程的地址空间和其他资源
web服务器相关
你对jungle了解多少
为什么用tornado服务器?
听同学讲的,非阻塞异步io
core dump调试
参考一篇博客文章
core文件
core文件包含程序运行时的内存,寄存器状态、堆栈指针、内存管理信息还有各种函数调用堆栈信息等,可以理解为程序工作当前状态存储生成的一个文件,通过分析工具分析这个文件,可以定位到程序异常退出的时候对应的堆栈调用的信息
如何判断一个文件是否为core文件
readelf -h core
查看type字段
或者:
file core
ulimit设置
ulimit -c [size]
size | 含义 |
---|---|
0 | 不产生core文件 |
n | 产生core文件大小为n个block,一个block大小为512bytes |
ulimit | 大小不限 |
还有些路径设置相关,需要的时候搜一下
core产生的原因
- 内存访问越界
- 多线程程序使用了线程不安全函数
- 多线程读写的数据没有加锁保护
- 非法指针
- 指针转换,字节对齐的问题,比如32位机器int类型数据地址是4字节对齐,一个char类型数据地址1字节对齐即可,如果将一个非4字节对齐的char指针赋给int类型数据指针,会发生什么呢?
- 堆栈溢出
- 局部定义一个特别大得数组这种,递归嵌套也可能爆栈
gdb调试core
gdb executivefile corefile
可以看到一些详细的错误信息
注意一些常见的signal含义:
signal | 含义 |
---|---|
SIGABRT | 调用abort函数时产生此信号。进程异常终止。 |
SIGBUS | 指示一个实现定义的硬件故障。 |
SIGEMT | 指示一个实现定义的硬件故障。EMT这一名字来自PDP-11的emulator trap 指令。 |
SIGFPE | 此信号表示一个算术运算异常,例如除以0,浮点溢出等。 |
SIGILL | 此信号指示进程已执行一条非法硬件指令。4.3BSD由abort函数产生此信号。SIGABRT现在被用于此。 |
SIGIOT | 这指示一个实现定义的硬件故障。IOT这个名字来自于PDP-11对于输入/输出TRAP(input/outputTRAP)指令的缩写。系统V的早期版本,由abort函数产生此信号。SIGABRT现在被用于此。 |
SIGQUIT | 当用户在终端上按退出键(一般采用Ctrl-/)时,产生此信号,并送至前台进程组中的所有进程。此信号不仅终止前台进程组(如SIGINT所做的那样),同时产生一个core文件。 |
SIGSEGV | 指示进程进行了一次无效的存储访问。名字SEGV表示“段违例(segmentationviolation)”。 |
SIGSYS | 指示一个无效的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其指示系统调用类型的参数却是无效的。 |
SIGTRAP | 指示一个实现定义的硬件故障。此信号名来自于PDP-11的TRAP指令。SIGXCPUSVR4和4.3+BSD支持资源限制的概念。如果进程超过了其软C P U时间限制,则产生此信号。 |
SIGXFSZ | 如果进程超过了其软文件长度限制,则SVR4和4.3+BSD产生此信号。 |
数据库
事务,database transaction:单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行
事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
ACID属性:
- atomic原子性:事务必须是原子工作单元,对于数据修改,要么全部执行,要么不执行
- consistent一致性:事务完成时,必须使所有的数据保持一致状态,
- insulation隔离性:并发事务所作的修改必须与任何其它并发事务所作的修改隔离,事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
- duration持久性:事务完成之后,它对于系统的影响是永久性的。
linux使用
查看某个运行的进程
参考
- ps -aux | grep program
- top
git使用
版本机常规操作,难一点的是分支的管理
linux命令返回值
多线程多进程相关 弱项
多进程,多线程,单线程服务器的区别和应用场景
线程,进程的区别等
进程之间的任务队列