资源描述
笔试题(只写关键点或思路即可):1. 线程、进程区别。线程间通信方式、进程间通信方式?进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 1.1数据库中各种组件、触发器、索引、容器?2. 删除一张表中全部数据,都有哪些方法?最快的是哪种?为什么?SQL:1. 删除表中所有内容:delete from table_name table_name是表名2. 删除所有的表:请问你用的哪个数据库?这里给出oracle的方法(A,B两种):oracle不能删除所有的表,只能删除所有用户下的表,所有的表都删了,数据库就完蛋了(有一些系统表)方法A select drop table | table_name | cascade ; from user_tables 该语句的查询结果是N个删除语句,将其复制,然后在sql窗口运行即可方法B drop user 用户名 cascade 这句话一下搞定,连用户也没了(一次只能删除一个用户下所有的表)oracle :TRUNCATE TABLE tableNametableName是要删除全部行的表的表名TRUNCATE TABLE 虽然与不带 WHERE 的 DELETE 语句相同但 TRUNCATE TABLE 速度更快而且占资源少速度快TRUNCATE TABLE 不记录日志所以不能激活触发器TRUNCATE TABLE 不能用于参与了索引视图的表TRUNCATETABLEdzjc.dzjc_yhmc; TRUNCATETABLEdzjc.dzjc_yhmc; 3.往数据库中加载1000万的数据,有哪些方法?最快的是哪种?为什么?对正常的数据库比如sql server 或oracle, 1000w 不是太多问题。oracle 有一个工具叫sql loader,load 1000W级数据最快可以在10几分钟完成。我用C#程序插入100W条数据到sql server 2005 可以在3分钟内完成。因为影响因素太多,很难说哪个最快。追问 “100W条数据到sql server 2005 可以在3分钟内完成”能否看一下你的代码。有多少原因就说多少,大家可以讨论一下回答 代码早就不在了,当时就是为了验证数据库速读写的最普通的ADO.NET代码。记得表只有3,4 列,用RAND产生随机数,插入数据库。数据库和application在同一个工作站。一下想到的影响因素包括:1. 网络带宽,connection pool管理机制。2. application server 的速度。3 数据库server的CPU速度。4. 数据库server的硬盘速度。5. 数据库的partition情况。6. 当时数据库的负荷。7. 数据库设计,主键的设计,索引的多少和分布情况,有多少列,各列的数据分布。8 数据库server, application server的内存。3. 请简述生产者消费者模型的基本原理、关键数据结构、典型应用场景。在电信领域业务中,“生产者-消费者(P-C)”的应用场景较为常见。在部门的多个产品中,就有几种“生产者-消费者”应用场景的实现。本周部门内部做了一次技术交流,谈到不同产品中关于“生产者-消费者”模式实现的差异以及优劣,这里汇总了一下思路简要说明一下。“生产者-消费者”问题又被称作“有限缓冲区”问题,即至少一个生产者与至少一个消费者针对一个公用的初始大小固定的缓冲区进行操作。首先缓冲区是公用的或者说是共享的。Producer进程(简称P进程,这里我们主要针对进程间的P-C问题)将消息生产出来后,放入缓冲区,Consumer进程(简称C进程)从缓冲区取出消息。这个缓冲区一般被实现为队列结构,比如基于共享内存队列结构。有了缓冲区后,下面就是P进程和C进程之间如何配合的问题了。信手拈来的简单方案:我们可以通过进程间的互斥锁对缓冲区进行互斥访问以解决多个P进程和P个C进程之间的配合问题。这样P、C进程,特别是C进程在实现逻辑上相对较为简单,即不停的尝试去lock mutex,但多数时间C进程可能都在忙等待,空耗计算资源。这种配合基本上完全由操作系统调度来完成对缓冲区的互斥操作。为了减少忙等待,对P、C的配合过程增加一些控制力,可提出进一步的方案:采用条件变量。C进程在条件变量上等待,P进程生产出数据后,可采用特定逻辑去唤醒某个C或者全部C进程(broadcast)。以上两个方案都很简单,但都有一个较为严重的缺陷,那就是C进程多数情况下都在挂起状态,在缓冲区没有数据的情况下也无法去做别的事情。当然如果你的应用场景就是这样的,那就无可厚非了。我们的应用场景不是这样的,所以我们还要继续演进下去。很久以前部门的一位大牛同事就给出了一个方案:依旧是基于条件变量,不同的是在C进程中创建了一个工作线程,并由该工作线程来做条件变量的等待。同时每个C进程中工作线程和主线程通过Pipe的方式配合。P进程主线程生成一条数据后,就会发起一个唤醒操作。被唤醒的C进程的工作线程则通过Pipe告知主线程,主线程一般通过多路复用(select or poll)监听Pipe并及时获得通知去获取缓冲去数据。这个方案还是蛮有灵光的,除了为每个C无端地增加了一个监听线程。这个方案在我们的产品中运行了 N多年,多数情况下很是稳定好用,但是也时常出现工作线程无法退出的问题:当C进程退出前,工作线程因无法从条件变量的阻塞状态下唤醒并退出,导致主线程在join该工作线程时挂起而无法退出。另外一个开发部实现了一种替代方案:采用可靠信号机制+进程内Pipe机制。P进程在生产后数据发送Unix可靠信号( SIGRTMIN)给所有注册的C进程。C进程设置的可靠信号处理函数的逻辑较为简单,就是向Pipe写入一个字节数据,这样当信号中断处理完毕后,C进程就可以收到Pipe的POLL_IN事件了。这种机制在线运行了两年多,没出现什么重大问题,不过Unix信号机制我们平时较少使用,有一定忌惮,也有一些担心的:- 软中断,一旦有不可重入的函数调用,会带来很大隐患;- 调试困难- 如果C进程众多,则每次都要发出大量信号,这两天脑子中也考虑出一种方案(尚未完善),这里也不妨说一下:通过Unix FIFO做P、C进程间通知的机制。FIFO机制简单、数据可靠,且在一定数据长度下的数据写入都是原子操作。FIFO与缓冲区一道做初始化创建,欲操作缓冲区的P、C进程都要事先打开FIFO以写入或读出数据。P进程输出数据后,向FIFo写入数据以表示通知。某个C进程从FIFO中读取通知并开始处理缓冲区数据,每个进程一般只从FIFO读取一个字节表示收到信号。深入思考一下,该机制虽然避免了前面提到的几个问题,同时还是有若干看起来别扭的地方:- 需传入FIFO名字,- 每次只有一个C进程能得到事件通知,无法做到broadcast。- FIFO销毁前应注意检查注册到该FIFO上的进程是否都detached了。4. 性能瓶颈产生的原因主要有哪些?如何解决?解决IT系统性能问题的难点往往在于定位问题的根源。1 也许不是服务器的问题 2 加快查询速度 3 降低病毒防护的代价 4 让中间层处于最佳状态 5 优化网络连接 6 调整Web服务器5. 请简要介绍几种常见的设计模式及适用场景。JavaScript设计模式共有两部分。第一部分给出了实现具体设计模式所需要的面向对象特性的基础知识,主要包括接口、封装和信息隐藏、继承、单体模式等内容。第二部分则专注于各种具体的设计模式及其在JavaScript语言中的应用,主要介绍了工厂模式、桥接模式、组合模式、门面模式等几种常见的模式。6. 请写个算法,计算10的阶乘。1000000的阶乘呢?7. 请写个算法,折半搜索。8. 线程的基本概念、线程的基本状态以及状态之间的关系,多线程有几种实现方法?同步有几种实现方法?线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态分别是:运行、就绪、挂起、结束。多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与notify9. 接口和抽象类有什么区别?Override与重载有什么区别?接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。第一点接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。第二点接口可以继承,抽象类不行第三点接口定义方法,不能实现,而抽象类可以实现部分方法。第四点接口中基本数据类型为static 而抽类象不是的。当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。接口可以实现也可以继承,抽象类不行 抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。override修饰符,覆写一个基类中的方法.重载则是将将同名方法重新写过,达到同名的函数实现不同的功能.从而实现了一个方法有不同的版本.override与重载的本质区别是,加入了override的修饰符的方法,此方法始终只有一个被你使用的方法10. 写一个算法,在一个100万记录的数据表中,查找某个值的所有父节点,一个亿的数据表中呢?create table test1( id int primary key,parented int )go11. 说明生活中遇到的二叉树,用java实现二叉树12. 握手协议在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念: 未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。 Backlog参数:表示未连接队列的最大容纳数目。 SYN-ACK 重传次数 服务器发送完SYNACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。 半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。13. 简单描述一下面向接口、面向对象、面向方面的区别?面向对象编程就是一堆对象,通过封装、继承、多态等更加有效的组织程序。面向接口编程就是一堆接口,通过接口规约对象的属性和方法,是面向对象一部分。面向方面编程把业务的主逻辑和次逻辑分开的一种思想。面向对象不好解释,可以理解为以一切元素都是对象,在设计时以对象为单位,考虑它的属性及方法。设计中采用了封装、继承、抽象的手法面向接口本身就是面向对象的,无所谓区别,只不过面向接口的好处是耦合性低面向方面Aspect-Oriented Programming (AOP)就是大名鼎鼎的AOP。其实有点象struts里的拦截器。举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。为了完成上述并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问。 这种加锁与解锁的操作可以使用拦截器来实现。而拦截器本身就是面向方面编程的一个具体应用。14. 简述几种软件工程过程模型及优缺点、适用场景。15. 你对Unity、IOC、AOP等概念是否熟悉?在开发过程如果运用了,都是为了实现哪些目的?Unity是微软团队开发的一个轻量级,可扩展的依赖注入容器,为松散耦合应用程序提供了很好的解决方案,支持构造器注入,属性注入,方法注入。同时因为把对象交给容器创建,有没有可能在创建的时候做些手脚和功能呢?答案是肯定的。目前Unity中提供两个Lifetime Manager类可供我们直接使用,当然你也可以实现自己的Lifetime Manager类。1. ContainerControlledLifetimeManager Unity保存一个指向对象实例的引用。通过Unity容器为同一个类型或对象获取对象实例时,每次获取到的都是同一个实例。也就是说实现了对象单例模式。默认情况下,RegisterInstance方法使用该Lifetime Manager。2. ExternallyControlledLifetimeManager Unity仅保存一个指向对象实例的弱引用。通过Unity容器为同一个类型或对象获取对象实例时,每次获取到的都是同一个实例。但是由于当对象创建完之后,容器没有对该对象的强引用,所以就可能出现当其他地方没有去强引用它时候,会被GC回收掉。16. 产品入库表(ProductList)产品ID为主键。不同产品的入库时间可能相同。产品ID(唯一)ID产品名称ProductName数量Count入库时间DateTime0001诺基亚N95202009-1-1 00:00:000002诺基亚N75302009-1-1 00:00:000003诺基亚N95302009-1-1 10:00:000004诺基亚N75502009-1-1 10:00:00。用一条语句查询所有产品的最后一次入账记录。Select * from ProductList17. 用一条SQL语句 查询出每门课都大于80分的学生姓名 name kecheng fenshu 张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 英语 90Select name from A where fenshu80 group by kecheng.18. 表结构T(a,b,c,d,e)用一条语句查询出按照T表的d列排序,取排序在10-20之间的数据19. 简述bi的几层架构包括数据层、业务层和应用层三部分。数据层基本上就是ETL过程。业务层主要是OLAP和Data Mining的过程。在应用层里主要包括数据的展示,结果分析和性能分析等过程。在实际应用中,由于每个公司的规模和组织架构的不同,在实施商务智能选择系统架构的时候要结合公司的特点,选者最合适的架构。 20. 编写一个查询从表T中每隔一行返回一名员工;需要查找第一,第三以此类推。T(name)-zhangsanlisiwangwulybcccccdddd21. 将结果集转置成一行如:depton cnt- -10 320 530 6 希望得到结果depton_10 depton_20 deptno_30- - -3 5 6Select decode(depton,10,3,20,5,30,6) from 表A.22. 计算简单的小计,按照部门统计,部门内所有员工的工资,并在最后展示一列统计公司所有部门的工资总计job sal- -jishubu 2000yanfa 4000caiwu 3000TOTAL 9000Select sum(sal) from 表A group by job.23. 多维数据名称 Adventure Works 纬度1Date.Calendar.Month.August 2003,纬度2Product.Category用MDX,返回在 2003 日历年度的前八个月(包含在 Date 维度中)聚合的 Measures.Order Quantity 成员之和
展开阅读全文