|
|
整理的百度面经1 y9 B7 y2 }6 J$ I
! s( ?5 @: `& d M
zz% d$ I( r d, ~/ ?! l( y" M% ~/ V
6 \) Y$ Z; N0 m2 V) @
4 R( X' B6 Z4 s: {; K# B4 B$ m- X
一面1. 网络编程经验:! h3 i8 T2 X! e8 I
如何判断一个http请求,一个客户端请求已经结束;如何处理服务器多线程
( r4 v) }0 R) K/ E' Q/ b; M 获得一个http请求后,是如何处理的?返回什么?有没有试过返回图片?
9 l J1 t; b) _7 G8 q& d& } 服务器给客户端请求时,是用什么函数写?服务器如何获取客户端请求,用什么函数+ p: f- B; L/ P
(需要函数级别的连接有一个认识)
% K; j) p% ^& Z2 ~, [0 s- A) L
# t6 O7 t3 A) g0 ]% ?2. cv操作是什么函数 cv_init, cv_wait, cv_signal& m9 }: a) Y9 i- d) I& h1 X
- O, P6 q* _: V- s/ K
3. 有一些关键词点击次数的文件,如何输出最多点击的一百个(当时应该回答,组织一个100个元素的最大堆)4 ?, Z! S; d- Q
. O" _/ R- l- Q& V; X u R; d4. 相交链表,如何找相交点(不能要标记)0 t5 H+ N k0 h. u
第一个头遍历到尾,知道他的长度;第二个头遍历到尾,知道他的长度。这样知道两截链表在交点前的长度,长的先走几步,然后一样长了,再轮流下走,就会相聚,相遇节点就是相交节点)6 k0 \7 N, b/ y
8 v u0 Q& R$ w/ _7 ~. ^+ _5 A
5. 有些文件,频繁访问在磁盘里头的,现在要放到内存中了。采用什么策略来决定哪些放到内存中?如果是一些url文件,放在内存后,如何快速的找到某个url的位置(采用字典序或者b树之类树状结构来组织) 如何快速找到哪些文件太久没人访问了,把他替换出去?(再那一棵树,记录树里每个位置url的访问时间;同时,那个url树的节点,也有这个时间树的对应的位置信息。时间树采用最大堆组织。要替换出去时,就从树顶取走节点,并且从中获得这个节点在url树对应位置,把他从url树中取走。当url被访问时,由于url树节点有时间树的位置信息,所以也很快找到对应节点在时间树的位置,然后把他的访问时间更新,然后做堆调整,每次堆调整为logN)
! `( O. o* Q; X/ T/ G* z7 R/ B7 }* w5 o* |! m0 d
6. c语言相关:内联函数的好处?非内联函数被调用的过程是怎么样的?
9 C2 Y+ |$ U4 k) h& }6 A! O( q int,short,char的struct,这几个数应该怎么放,内存小?怎么防止头文件被include多次?
4 k7 _/ C/ V* o, B, V) {$ D3 Z* u0 d, l$ h( Q6 }
7. 有没有什么问题想问的- j9 s1 C' r2 T9 p2 ]
8 linux 网络查看的命令
+ t6 K5 q# a& s$ x8 A5 U
1 w3 g2 `4 g) q& q2 `$ P二面
. S; S! l' h5 K1 i3 u1. 介绍一个项目4 w; F+ ?0 Y) T9 c8 N% o
: T/ E0 s0 l6 _3 |2. 2.5亿个int数,可能有相同的。统计出这里头不同的数有多少个?只有2g内存。
0 J) _$ f7 R- i5 _* u(2.5*1000 000 000 * 4 =1G)0 W5 B& k8 u8 m5 i3 u9 ?9 t
统计数-用hash,key是数,value是1或0,标记是否出现。
5 V4 Z& ^- b t! G/ {# b0 G如果key就是那个数,那么找一个数的时候,要遍历hash才知道有没有,慢(就是如果hash紧凑,慢)。& @( C1 \1 X% x# |. p
解决方案:把key作为连续的(就是hash是稀疏的,有个key值没有存在这2.5亿个数中),像数组下标一样,那么要访问第n个数,直接到第n个去看,复杂度是O(1)
{) W: c1 k& K! ?但是,如果连续,2.5亿个数,范围很广,而每个key用int存,会很大量,内存不一定够。
3 O0 W: U. [9 F解决方案:每个key用一位bit来标志。即数字1放在第一个bit上,数字2放在第二个bit上。看第n位在不在,就找一下第n个bit是1,还是07 {# h* S* b! a3 ^1 }0 G
具体方法:char a[] 数组。假设找3,那么3在3/8--0...3,所以在a[0]中,找第3个bit,如果是0,就设置为1。最后看看a[]的二进制表示有多少个1就有多少个数$ X& ^8 W6 z' U) F
3 u5 k) ?+ j9 b- M+ k3. 海量数据,在mysql中,cpu占用率很高。如何解决?7 p/ A" j% X# V2 P: C$ ]
1.show processlist,看哪个sql查询的多,建索引(问:建立联合索引时,要考虑什么,怎么建(哪个在前,哪个列在后?)
* Q4 I6 T# L0 L0 I: q7 H6 P2.如果老是在拷贝到临时表,就改配置,把临时表内存改大些
3 q6 S s: E7 L6 B3.还有什么方法:
" M. F& i2 K$ }5 l1 I& }" m1)分布式数据库 (问:如果你来设计分布式数据库,你会怎么设计?)
# T, C/ _4 q7 t( x2)使用缓存 (问:如果缓存中的数据,被删除或跟新了,数据库怎么判断这个缓存的数据不能用了,是脏数据?)(不懂)
& u/ J/ f! g. X问:什么情况下cpu会高?(内存不足)为什么内存不足cpu会高(频繁io读写)
' U8 F/ p) Q# e) M( z! e8 z/ L% Q; N& ^6 n# s& V- x0 i [- U
4. n个无序int,(有正有负),给一个数v,如何找出其中的a+b=v的两个数* ]' A: V v$ D* Q5 V
(我的答案是:排序 O(nlogn),记录序列中,0,大于v,小于v的3位。1 p* S+ `- x3 o4 \+ d* W
尝试最小的和最大的,最大不行,次大。。。,找到某个,加起来小于v了,停止
1 K2 s4 }( a3 _% |) G; ?( e尝试次小的,从上次大头停止的位置开始尝试
2 X( ~8 F: G5 X9 I% W" C---尝试范围两头不断缩小,复杂度为n)
: m! h$ N: D# e x, N4 \3 \1 q3 Y8 T/ G1 X3 D
5. 网络相册,一个人可以有多个相册,一个相册有多个图片,如何快速实现增删查移动等操作。web页面上,图片是翻页显示。$ _, Y; G1 z. y) S- A
(我回答:数据库记录:usr_id, book_id, item_id, position。相片放在磁盘上,目录为position/usr_id/book_id/item_id
5 ?5 Z& \3 [; H. L一次查两个操作:1)数据库查找2)根据位置取图片# W0 s, A2 `- h3 w0 J# b
6 d6 _. ~# x4 [" e' N+ J如果用户提取某个相册的所有图片,先给他第一个相片和所有item_id列表。然后用户翻页了,在客户端通过javascript能够知道翻的是哪个item,把item_id,book_id, usr_id发给服务器,服务器根据这个到目录下去找)- ` @$ R! b9 {# o" h
(你这种设计会有什么问题?(答不上来。。。)(如果用户频繁翻页,那么服务器上会不断地在传输图片)(如何解决?)+ Q U$ V' s( U
3 S2 C9 `% d) b3 S* U2 k第五题我想不出好办法,我觉得一般他们都show thumbnail. ?2 o$ o( c \+ x9 K- O
就是预览小图片不把原始图片show在页面上,点击后才能看单个图片8 V: f: d1 z4 I6 Q) M( z
! t3 d0 e7 J8 [2 F4 ~5 z" \
: C, {( H% u* K7 K# f! ^
6. Unix系统里,一个简单的print hello world的c程序,从./a.out执行到屏幕打印出来这句话,是什么过程
8 e. r! s# f$ d& l/ l+ e6 a' \7 \& E7 [( Q7 L(1.读elf,会从相对地址,计算出各个symbol的在进程中的绝对地址。然后找到入口main函数! _, O' X* {% n% J f
1.用到std的库,所有有run time load。
( D" x: [$ a# I! P+ J& L8 o 2.然后是print调用的进栈/ m+ B! b- q: A; U
3.然后是系统调用,当前进程被挂起。系统调用会调用驱动。。。(内核切换,用户态到内核态)
6 V }2 p* d6 s; z- R 4.内核处理完再唤醒当前进程。(切换)
" @6 `# j N2 w1 b3 h 5.print调用完毕,退栈; h' F: E+ W/ a! N, f
6.main函数退栈) [& Y! x2 J/ D
)
6 v5 _) n# u3 _* d# d! O/ Y, t0 e问:哪个进程来调用的main?(不知道)
) H% Z9 ~' d3 t" H应该是当前运行a.out的这个和用户交互的shell作为父进程,然后父进程fork子进程,子进程和父进程一样,然后调用execv会load执行文件,和把参数传到main的堆栈中
5 P( g, X7 C% K( b8 i6 r* p* e4 I
, I* o: T8 Y* W: P6 d7.socket编程,要注意什么问题
" c- h1 {4 s2 ^' _' O( J(服务器的serversocket的基本模型。: u0 Y) F# d% C) l
但是大量请求,会不能及时响应。所以要多线程。% A0 a5 v9 e$ n% l
一个监听线程,多个服务线程。服务线程一开始起来都阻塞在存放请求socket的tasklist上。wait
v: O7 t) i: t9 w$ r, ?监听线程接受到client的socket,放入tasklist中,signal唤醒一个服务线程。服务线程处理它,并把它从list中移走5 v, \7 e- Q, r5 G
注意问题:tasklist的存放的请求socket是会被放和移走的,消费者生产者问题。所以要synchronized来互斥?)
3 Y6 u- e1 |: W& {. |& f) \- e
9 y& o, M, [/ \- i( c2 g- ?" U三面" T% i! w, K4 e% @/ ~! L# m" C/ H
+ v/ B( c9 }# b. L+ k# c
+ w4 X- s+ O. C- N) V2. fread的过程(文件系统-内核。。。)
1 q0 W( u; _( w+ O. B7 O8 B3. 主DB在接到数据更新后同步到后台DB,如何避免网络丢失之类的问题
% a5 ]* q% E/ s' L; H3 B* r Q+ Z(参考答案1:传的是sql语句,接到后回ack,如果主DB发现一段时间没有回,重发;其实TCP传输,就保证了不会漏数据,所以不会考虑这个问题的)
* V5 ]. z/ W: G( [(参考答案2:每次传sql语句和当前版本号,然后后台DB会对比版本号是不是正确,发现落后就发数据请求。主DB保留每次版本号更新关联的sql语句)0 D7 n" a0 [5 b6 V Z3 d
4. N个bit,如和判断其中有多少个1.(时间复杂度小于N)
8 G6 A( ]% I: {: y8 r* W预存一个2的8次方大小的数组,每个数组值是,这个下标的数的二进制的1的个数,例如:
% h3 O% d" W# Ma[0]=0, a[1]=1, a[2]=1,a[3]=2....a[2^8-1]=7 (以空间换时间)4 M" g. d( G5 `; L6 N
4 h2 d$ b: ]' `: x
然后一个byte一个byte的读,看看他的值,直接以这个值为下标去数组看他的1的个数2 V3 s; C7 u; F: G1 Z% H$ s8 l' f* C
! ?+ L6 A! c4 C Z/ f
, j" n7 W! m$ |* D! B, A# l4 L) l
另一个方法:4 h& P' R* V# l8 J' ~* u( o
6 _8 ?1 r! a2 F) ~9 wwhile(v){
: V( \4 b+ z" L) M" ev &= (v-1);- f" X9 B) |5 e6 T
num++;
, g* t# e+ }8 y}
, S" I, f1 F: M# g1000 & 0111 = 0, 所以每&一次,不为0,说明有1个1,&到为0为止,num就是1的个数。复杂度为1的个数。
7 I( r+ @% y4 E( @
, y9 N' z: D& p& N" QZz
; a- o6 z$ m5 ?/ Z \& p& d该内容转载自网络,版权归原作者所有。
6 r, G# b: @) ~0 l U: T9 W& [( \. w w" I' G# y( G
……
- L% D3 \7 H1 p/ Xhttp://bbs.aftjob.com/thread-164201-1-1.html
. i; P0 O, W' {% e- ]- T" s8 L! G8 h9 f. M% h
3 o/ B( F B8 B; r
百度(Baidu)求职俱乐部
! t! c5 }0 L5 v Q1 \http://bbs.aftjob.com/group-4-1.html0 ] n$ y4 d5 m/ q- x
! |% L1 [7 b- u
|
|