1.已知一个ip地址为10.5.136.5,子网掩码为255.255.64.0,他的网络号和主机号分别是?
把ip地址和子网掩码转换成二进制,由子网掩码可知网络号和主机号有几位,连续全1的位数为网络号数,连续为0的位数为主机号,进行与运算是网络地址,广播数是把网络地址中主机位数变成1,地址范围是网络地址+1 广播地址-1,主机数量=2^主机位数-2
ip: 10.5.136.5=0000 1001.0000 0101.1001 0000.0000 0101
掩码:255.255.64.0=1111 1111.1111 1111.0100 0000.0000 0000
与运算:网络地址 0000 1001.0000 0101.0000 0000.0000.0000=10.5.0.0
网络号数:16 主机号数:14
广播数:0000 1001.0000 0101.0011 1111.1111 1111
2.软件测试的目的是:
解:1、确保产品完成了它所承诺或公布的功能,并且所有用户可以访问到的功能都有明确的书面说明------在某种意义上与ISO9001是同一种思想。
2、 确保产品满足性能和效率的要求
3、 确保产品是健壮的和适应用户环境的
3.某操作系统采用了分页存储管理方式,下去给出了进程a和进程b的页表结构,如果物理页的大小为512字节,那么进程a与进程b的物理内存总共使用了()字节。
进程a页表:进程b页表:
逻辑页 物理页 逻辑页 物理页
0 9 0 1
1 2 1 3
2 4 2 4
3 6 3 7
4 - 4 2
5 - 5 -
物理页可以在进程间共享,两个进程间共使用了1,2,3,4,5,6,7,9,8个物理页,字节 8*512=4096
4.fork用法
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
5.哪种协议在数据链路层?
ICMP为网络层,UDP为传输层,FTP和HTTP是在应用层,TCP/IP模型中,ARP协议属于网络层,在OSI参考模型中,ARP属于数据链路层
6.按照二叉树的定义,具有3个结点的二叉树有多少种?
7.进程从运行状态变为阻塞状态的原因是?
1.进程的三种基本状态
进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。
就绪(Ready)状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
执行(Running)状态
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
阻塞(Blocked)状态
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
2.进程三种状态间的转换
一个进程在运行期间,不断地从一种状态转换到另一种状态,它可以多次处于就绪状态和执行状态,也可以多次处于阻塞状态。图3_4描述了进程的三种基本状态及其转换。
(1) 就绪→执行
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
(2) 执行→就绪
处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
(3) 执行→阻塞
正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
(4) 阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
8.在一个双向循环链表中,指针p所指向的结点(非尾结点)之后插入指针s指向的结点,其修改指针的操作是?
注意先p->next->prev = s,再是p->next = s;否则链表会断开
9.删除表a全部数据的方法,一般情况下执行速度最快的是
http://www.cr173.com/html/40708_1.html
drop 删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表,
truncate 删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表,
delete 虽然也是删除整个表的数据,但是过程是痛苦的(系统一行一行地删,效率较truncate低 删除内容不删除定义,不释放空间
1、truncate 在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销,而 truncate 则不会被撤销。
2、truncate 是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对 truncate 使用ROLLBACK命令。
3、truncate 将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过 truncate 操作后的表比Delete操作后的表要快得多。
4、truncate 不能触发任何Delete触发器。
5、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。
6、不能清空父表
10.数据库完整性约束包括哪些?
数据完整性分为以下四类:
1) 实体完整性:规定表的每一行在表中是惟一的实体。
2) 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。
3) 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。
11.关于死锁的说法。
死锁有哪些必要条件
- 互斥条件:指进程对所分配的资源进行排它性使用,也就是说在某一段时间内,某资源只被一个进程占用,如果还有其它进程请求该资源,则请求的进程只能等待,直到该资源被释放。
- 请求和保持条件:指一个进程已经拥有了某些资源,但是它还需要其它资源,于是又提出新的申请,而该资源又偏偏被其它进程占用,此时该申请资源的进程产生了阻塞, 它又不释放自己已占有的资源。
- 不剥夺条件:指进程已获得的资源不能被剥夺,只有自己使用完之后才释放.( 可见如果资源可被剥夺,该条就不成立,所以A错 )
- 环路等待条件:指发生死锁的时候,一定存在一个环路:进程1-资源2(被进程2占用)-资源3(被进程3占用).............-进程n-资源1(被进程1占用)银行家算法是避免死锁;
在资源的动态分配过程中,防止系统进入不安全状态,可避免发生死锁。
按序分配可以破坏环路等待的条件、一次性给进程分配完全部资源破坏请求与等待条件 剩下那两个条件直接按名字 反着操作就可以。避免死锁就是银行家算法+安全性算法12.typedef和define的区别typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。
#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编
译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,
从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量
,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#define
INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的
编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗
长的类型的别名。
宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变
量的功能。请看上面第一大点代码的第三行:
typedef (int*) pINT;
以及下面这行:
#define pINT2 int*效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;
表示定义了一个整型指针变量a和整型变量b。
13.在linux命令中,那些可以显示文本文件内容。linux文本文件查看、显示命令
cat 显示文件内容命令。
head 查看文件头部内容命令。
tail 查看文件尾部内容命令。
grep 查找文件内容命令。
more 分页显示文件命令。
less 分页显示文件命令