意料之中,果然 第一次大公司面试,一面就挂了,面的是PC网游c++。这个职位对服务器,线程,和进程要求的知识比较多。
开始先让我自我介绍,肯定要自夸一顿,把成绩,获奖,项目都说一遍。然后他说项目挺多,你挑一个你最拿手的项目说一下。我说华电就业信息网站,让说难点在哪,我说上传表格那个地方最难,开始用的是微软自带的一套,比较麻烦,后来就用NPOI实现,他说就是熟悉调用控件的过程是吗?我说不是,信息比较多,判断情况比较多。然后我又说管理员权限方面,他说你用的什么方法设计的,我说用一个字段判断,然后他又说就是一个判断字段过程(感觉应该有高级的设计方法)。他说你这么多项目,都有公用的管理员权限,能不能把他给提取出来,就行复用,我说用到了设计模式,他说怎么写,我说写一个接口,然后每个用到的时候去实现它。他说这个什么设计模式,我说不知道(有人说是代理。)后来又问你知道那些设计模式,我讲了一个模板方法,单例方法,他说你手写一个单例代码(剑指Offer),三分钟时间,没写出来(给我十分钟我要写不出来)。后来又问我,你做过的这些项目有没有做过压力测试,我说没有,他说如果让你写,你会怎样写,开始我说用for,他说这只是访问量,后来又说开很多线程,他说能开多少,我说不知多少,他说瓶颈在哪,我说cpu与内存,他皱了皱眉头,说为什么,。。我忘了当时怎么蒙的了。再后来看我没怎么答出来,就问了一些简单的项目,基于加速度传感器的智能穿戴,他说为什么是在脚上,而不是手上,我也没说出来啥。后来就让我走了。最后他又问有没有什么要问的,我当时只顾着想着我进公司做哪方面的东西,其实我应该问刚才没有答出来的问题的答案。
把NPOI的难点再看一下:
把管理员权限功能提取出来实现方法,用到了哪个设计模式,以及管理员权限的高性能方法:
搜集了一下资料,感觉应该是设计一个管理员系统,然后每次使用去调用它就行
权限表及相关内容大体可以用六个表来描述,如下:
1 角色(即用户组)表:包括三个字段,ID,角色名,对该角色的描述;
2 用户表:包括三个或以上字段,ID,用户名,对该用户的描述,其它(如地址、电话等信息);
3 角色-用户对应表:该表记录用户与角色之间的对应关系,一个用户可以隶属于多个角色,一个角色组也可拥有多个用户。包括三个字段,ID,角色ID,用户ID;
4 限制内容列表:该表记录所有需要加以权限区分限制的数据表、功能和字段等内容及其描述,包括三个字段,ID,名称,描述;
5 权限列表:该表记录所有要加以控制的权限,如录入、修改、删除、执行等,也包括三个字段,ID,名称,描述;
6 权限-角色-用户对应表:一般情况下,我们对角色/用户所拥有的权限做如下规定,角色拥有明令允许的权限,其它一律禁止,用户继承所属角色的全部权限,在此范围内的权限除明令禁止外全部允许,范围外权限除明令允许外全部禁止。该表的设计是权限管理的重点,设计的思路也很多,可以说各有千秋,不能生搬硬套说某种方法好。对此,我的看法是就个人情况,找自己觉得合适能解决问题的用。
个人分析:1、角色表,是管理员,系统管理员,用户,访客。
2、用户表:账号,密码,个人信息,电话
3、角色用户表:一个角色有多个用户,一个用户有多个角色
4、权限表:1,可读,2,可写,4,可执行,
5、数据表:用户数据,管理员数据,
6、角色权限数据表:那个角色,有那个权限,可以看哪些数据。
单例:
class sealed Singleton()
{
private Singleton()
{}
private static Singleton instance=new Singleton();
public static Singleton Instance()
{
return instance;
}
}
怎样进行线程的压力测试,以及瓶颈在哪里:
http://www.cnblogs.com/lori/archive/2015/03/27/4370827.html,vs自带的有压力测试方法,自己可以进行创建
默认情况下,一个线程的栈要预留1M的内存空间
而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。
你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。
如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。
即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。
比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。
如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。
在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。