笔试训练(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hu_junhua/article/details/79221619

1.静态链表
定义:用 数组 描述的链表,即称为 静态链表。
就是用一个二维数组存储线形,数组第1列用于存放数据元素本身,第2列存放该数据元素在线形表中的位序。
所以 静态链表中指针表示 数组下标
2.进程、线程
进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。
注意,进程一般有三个状态:就绪状态、执行状态和等待状态【或称阻塞状态】;进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系;挂起命令可由进程自己和其他进程发出,但是解除挂起命令只能由其他进程发出。
线程:线程是进程中的一个实体,作为系统调度和分派的基本单位
线程是进程的一部分
使用线程用利于提高程序执行效率
线程切换开销比进程切换开销低
线程间共享全局变量

(附加:)进程可以开多少线程?2048(实际值比这个小)
默认情况下,一个线程的栈要预留1M的内存空间,而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程,但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小(1G = 1024M)

3.TCP的服务特点:
1.可靠的面向连接的协议
2.基于字节流 TCP协议将应用层的字节流分成多个字节段,然后将其传送到互联层。
3.可将原主机的字节无差错传送到目的主机
4.具有流量的控制功能
4.进栈出栈操作,先进后出,(做题时入栈之后的数值只能按顺序出来,其余没有入栈的暂时不入栈)

5.数组和指针的区别:
5.1.数组是开辟一块连续的内存空间,数组本身的标示符代表整个数组,可以用sizeof取得真实的大小;指针则是只分配一个指针大小的内存,并把它的值指向某个有效的内存空间。

52.数组或是在静态存储区被创建(全局数组),或是在栈上被创建。数组名对应着,注意不是指向,一块内存,其地址与容量在生命期内保持不变(当然,使用了realloc()的不算),只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。

5.3.当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。
典型的情况是

void func(intA[])
{
//sizeof(A)得到的是4bytes
}
int main()
{
inta[10];//sizeof(a)得到的结果是40bytes
funct(a);
}

6.const
const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
Const与define的区别如下:
(1)编译器处理的方式不同。
define是在预处理阶段展开;
const是在编译运行阶段展开,在编译的时候确定其值;
(2)类型和安全检查不同。
define没有类型,不进行类型检查,也不进行安全检查,这样在进行替换的时候有可能发生意想不到的错误;
const常量有具体的类型,在编译阶段会进行类型检查;
(3)存储方式不同。
define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;
const定义的只读变量在程序运行过程中只有一份备份,所以const可以节省空间,避免不必要的内存分配,同时提高效率。
(4)效率不同。
编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高,提高了程序的健壮性。

(注:)Gcc的编译流程分为了四个步骤:
1.预处理,生成预编译文件(.i文件):对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析
何时需要预编译:
1.1总是使用不经常改动的大型代码体。
1.2程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个“预编译头”

    Gcc –E hello.c –o hello.i
2.编译,生成汇编代码(.s文件):
    Gcc –S hello.i –o hello.s
3.汇编,生成目标文件(.o文件):
    Gcc –c hello.s –o hello.o
4.链接,生成可执行文件:
    Gcc hello.o –o hello

7.C++ 调用c编译的程序,为何要加extern c?

程序阅读:
1.
void main()
{
int a[5] = {1,2,3,4,5};
int ptr = (int )(&a + 1);
printf(“%d %d\n”, (a + 1), (ptr - 1));
}

输出的结果为2,5.由于a是数组的地址,如果是a + 1,那么步长就是数组一个元素的长度;但是如果是&a + 1,那么步长就是一个数组的长度,此题就是20个字节长度,那么在最后ptr - 1的结果就是数组a的最后一个元素5.

对于二维数组a[3][4],哪个不能表示a[1][1]?
(a[1] + 1); 2.(&a[1][1]); 3.((a + 1)[1]); 4.(a + 5)
本题选择4号,因为最后一个的步长是一行,即它代表了数组a[5][0];
其实主要就是看步长,如果是&a + 5那就是二维数组为一个单位,后移5个二维数组的长度。
第一个就是以列为一个单位去移动,正好得到a[1][1]。

(1)OSI七层模型
OSI中的层 功能 TCP/IP协议族
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

(2)TCP/IP五层模型的协议
应用层
传输层
网络层
数据链路层
物理层

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
位码即tcp标志位,有6种表示:
SYN(synchronous建立连接)
ACK(acknowledgement 表示响应、确认)
PSH(push表示有DATA数据传输)
FIN(finish关闭连接)
RST(reset表示连接重置)
URG(urgent紧急指针字段值有效)

三次握手:

第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
确认号:其数值等于发送方的发送序号+1(即接收方期望接收的下一个序列号)。
四次挥手:
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次挥手”。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

TCP的四次挥手过程(简言之):主动关闭方向被动关闭方发送不会再给你发数据了的信息;被动关闭方对收到的主动关闭方的报文段进行确认;被动关闭方向主动关闭方发送我也不会再给你发数据了的信息;主动关闭方再次对被动关闭方的确认进行确认。
七层 有哪些重要协议

BIOS是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。此外,BIOS还向作业系统提供一些系统参数。

猜你喜欢

转载自blog.csdn.net/hu_junhua/article/details/79221619