操作系统、数据库和网络
1 作业、线程、进程、管程
- 作业:由三部分构成,即程序,数据和作业说明书,它是用户在完成一项任务过程中要求计算机系统所做工作的集合。
- 进程:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同的数据集合上运行,乃至一个程序在同样数据集合上的多次运行,都是不同的进程。
- 线程:线程是进程中的一个实体,是被系统独立调度和执行的基本单位。
- 管程:管程定义了一个数据结构和在该数据结构上的能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
2 进程间的通信如何实现?
最常用的进程间的通信方式有信号、信号量、消息队列、共享内存。
- 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
- 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
- 信号量( semophore ) :(可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。) 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
- 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
- 套接字( socket ) : 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
3 在windows编程中互斥器(mutex)的作用和临界区(critical section)类似,请说一下二者的主要区别。
两者的区别就是mutex可以用于进程之间互斥,critical section是线程之间的互斥。
4 死锁的4个必要条件
- 互斥条件:一个资源只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
根据产生死锁的4个必要条件,只要使其中之一不能成立,死锁就不会出现。(互斥条件无法被破坏)
避免死锁算法中最具有代表性的是Dijkstra于1968年提出的银行家算法,该算法需要检查申请者对资源的最大需求量,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。这样申请者就可以很快完成其计算,然后释放它所占用的资源,从而保证了系统中的所有进程都能完成,所以可避免死锁的发生。
5 进程的三种基本状态
- 就绪(Ready)状态:进程已分配除CPU之外的所有必要的资源,只要获得处理机便可立即执行。
- 执行(Running)状态:进行已获得了处理机,其程序正在处理机上执行。
- 阻塞(Blocked)状态:正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态(例如,等待I/O完成、申请缓冲区不能满足、等待信号等)。
6 进程和线程的差别
进程是程序的一次执行。线程可以理解为进程中执行的一段程序片段。在一个多任务环境中下面的概念可以帮助我们理解两者之间的差别。
- 进程间是独立的,这表现在内存空间、上下文环境上;线程运行在进程空间内。一般来讲,进程无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。
- 同一进程的两段代码不能同时执行,除非引入线程。
- 线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。线程占用的要少于进程所占用的资源。线程和进程都可以有优先级。
- 进程间可以通过IPC通信,但线程不可以。
7 搜索DLL的顺序
- 内存
- KnownDLLs
- 清单与.local
- 应用程序目录
- 当前工作目录
- 系统目录
- 路径变量
8 动态链接库和静态链接库
- 静态链接库的优点
(1) 代码装载速度快,执行速度略比动态链接库快;
(2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。 - 动态链接库的优点
(1) 更加节省内存并减少页面交换;
(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
(4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。 - 不足之处
(1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
(2) 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。
9 Windows内存管理的几种方式
页式管理、段式管理、段页式管理(须多查阅资料)
10 Bolady’s Anomaly出现在内存换页算法。
11 Thrashing是非常频繁的换页活动。
12 避免死锁的一个著名算法是银行家算法
该方法将系统的状态分为安全状态和不安全状态,只要使系统处于安全状态,便可避免死锁的发生。
13 虚拟存储器
基本思想是程序、数据、堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未使用的部分保存在磁盘上。
14 LRU页面管理算法
在前面几条指令中使用频繁的页面,很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面,很可能在未来较长的一段时间内不会被用到。
15 存储过程和函数的区别
存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值,并且不涉及特定的用户表。
16 数据库事务
数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做要么全不做,是一个不可分割的工作单位。
事务的开始和结束可以由用户显式控制。如果用户没有显式的定义事务,则由DBMS按默认规定自动划分事务。事务具有ACID等特点。
17 游标
游标用于定位结果集的行。
通过全局变量@@FETCH_STATUS可以判断其是否到了之后。通常此变量不等于0表示出错或到了最后。
18 触发器
- 事前触发器运行于触发事件发生之前;事后触发器运行于触发事件发生之后
- 语句级触发器可以在语句执行前或后执行;行级触发器在触发器所影响的每一行触发一次。
19 SQL注入式攻击
所谓SQL注入式攻击,就是攻击者把SQL语句插入到Web表单的输入域或者页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造动态SQL语句,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
防范SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL语句之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。
20 聚集索引和非聚集索引的区别
聚集索引的顺序就是数据的物理存储顺序;而非聚集索引的索引顺序与数据物理排序顺序无关。一个表最多只能有一个聚集索引。
在SQL Server中,所以是通过二叉树的数据结构来描述的,我们可以这么理解聚集索引:索引的叶节点就是数据节点。而非聚集索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。
21 SQL语言面试题
- 找出表ppp里面num最小的数,不能使用min函数。
select *from ppp where num <= all(select num from ppp)
或者:
select top 1 num from ppp order by num - 找出表ppp里面最小的数,可以使用min函数。
select * from ppp where num = (select min(num) from ppp) - 选择表ppp中num重复的记录。
select * from ppp
where num in (select num from ppp group by num having count(num)>1) - 写出复制表、拷贝表和四表联查的SQL语句。
- 复制表(只复制结构,不拷贝数据):
select * into B from A where 1 = 0 - 拷贝表(复制结构,同时也拷贝数据):
select * into B from A - 四表联查:
select * from A, B, C, D where 关联条件
(以上SQL语句仅在SQL Server中测试通过)
- 复制表(只复制结构,不拷贝数据):
- 在SQL Server中如何用SQL语句建立一张临时表?
create table #Temp (字段1 类型,字段2 类型……) - 有一个数据表A,有一个字段LASTUPDATETIME,是最后更新的时间,如果要查最新更新过的记录,如何写SQL语句?
select *
from A
where LASTUPDATETIME = (select max(LASTUPDATETIME) from A)
22 网络结构
OSI模型分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
1. 物理层涉及在信道上传输的原始比特流。
2. 数据链路层的主要任务是加强物理层传输比特流的功能,使之对应的网络层显现为一条无错线路。发送包把输入数据封装在数据帧,按顺序传送出去并处理接收方回送的确认帧。
3. 网络层关系到子网的运行控制,其中一个关键问题是确认从源端到目标端如何选择路由。
4. 传输层的基本功能是从会话层接收数据而且把其分成较小的单元传递给网络层。
5. 会话层允许不同机器上的用户建立会话关系。
6. 表示层用来完成某些特定的功能。
7. 应用层包含着大量人们普遍需要的协议。
23 TCP和UDP区别
TCP是传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发、丢弃重复数据、检验数据、流量控制等功能,保证数据能从一端传到另一端。
UDP是用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
24 如何编写Socket套接字?
- 服务器端程序编写:
- 调用ServerSocket(int port)创建一个服务器端套接字,并绑定到指定端口上。
- 调用accept(),监听连接请求,则接收连接,返回通信套接字。
- 调用Socket类的getOutStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。
- 关闭套接字。Socket.close()。
- 客户端程序编写:
- 调用Socket()创建一个流套接字,并连接到服务器端。
- 调用Socket()类的getOutStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。
- 关闭通信套接字。Socket.close()
25 入侵检测与防火墙的异同及其优缺点。
- 入侵检测系统和防火墙的区别
- 概念
1) 防火墙:防火墙是设置在被保护网络(本地网络)和外部网络(主要是Internet)之间的一道防御系统,以防止发生不可预测的、潜在的破坏性的侵入。它可以通过检测、限制、更改跨越防火墙的数据流,尽可能的对外部屏蔽内部的信息、结构和运行状态,以此来保护内部网络中的信息、资源等不受外部网络中非法用户的侵犯。
2) 入侵检测系统:IDS是对入侵行为的发觉,通过从计算机网络或计算机的关键点收集信息并进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。
3) 总结:从概念上我们可以看出防火墙是针对黑客攻击的一种被动的防御,IDS则是主动出击寻找潜在的攻击者;防火墙相当于一个机构的门卫,收到各种限制和区域的影响,即凡是防火墙允许的行为都是合法的,而IDS则相当于巡逻兵,不受范围和限制的约束,这也造成了ISO存在误报和漏报的情况出现。 - 功能
防火墙的主要功能:
1) 过滤不安全的服务和非法用户:所有进出内部网络的信息都是必须通过防火墙,防火墙成为一个检查点,禁止未授权的用户访问受保护的网络。
2) 控制对特殊站点的访问:防火墙可以允许受保护网络中的一部分主机被外部网访问,而另一部分则被保护起来。
3) 作为网络安全的集中监视点:防火墙可以记录所有通过它的访问,并提供统计数据,提供预警和审计功能。
入侵检测系统的主要任务:
1) 监视、分析用户及系统活动
2) 对异常行为模式进行统计分析,发行入侵行为规律
3) 检查系统配置的正确性和安全漏洞,并提示管理员修补漏洞
4) 能够实时对检测到的入侵行为进行响应
5) 评估系统关键资源和数据文件的完整性
6) 操作系统的审计跟踪管理,并识别用户违反安全策略的行为
总结:防火墙只是防御为主,通过防火墙的数据便不再进行任何操作,IDS则进行实时的检测,发现入侵行为即可做出反应,是对防火墙弱点的修补;防火墙可以允许内部的一些主机被外部访问,IDS则没有这些功能,只是监视和分析用户和系统活动。
- 概念
- 入侵检测系统和防火墙的联系
- IDS是继防火墙之后的又一道防线,防火墙是防御,IDS是主动检测,两者相结合有力的保证了内部系统的安全;
- IDS实时检测可以及时发现一些防火墙没有发现的入侵行为,发行入侵行为的规律,这样防火墙就可以将这些规律加入规则之中,提高防火墙的防护力度。
26 25端口是做什么用的,有什么漏洞么?
25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。比如在使用电子邮件客户端程序的时候,在创建账户时会要求输入SMTP服务器地址,该服务器地址默认情况下使用的就是25端口。
端口漏洞:利用25端口,黑客可以寻找SMTP服务器,用来转发垃圾邮件。25端口被很多木马程序开放,通过开放25端口,可以见识计算机正在运行的所有窗口和模块。
21 FTP
23 Telnet
80 HTTP
135 RPC
53 DNS
27 网路中常见的ping命令是什么协议?
ping.exe的原理是,向指定的IP地址发送一定长度的数据包,按照约定,若指定IP地址存在的话,会返回同样大小的数据包。
ping使用的是ICMP协议,有些防火墙软件会屏蔽ICMP协议,ping不通并不一定说明对方IP不存在。
“Ping of Death”的攻击原理是:如果ICMP数据包的尺寸超过64KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈奔溃,致使主机死机。此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。
扩展知识(常见网络协议):
动态主机配置协议
边界网关协议
VoIP协议
P2P协议
ARP协议
IPX/SPX协议
SNMP协议
TCP
IP协议
Layer2 Tunneling Protocol
NetBIOS Extend User Interface
28 说一下TCP的3次握手和4次挥手全过程是什么样的?
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用3次握手建立一个连接。
第1次握手:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
第2次握手:服务器收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第3次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成3次握手。
完成3次握手,客户端与服务器开始传送数据。