第一阶段面试问题(后半部分)

news2024/9/25 15:22:27

1. c语言中const *p的用法

(1)const int *p;int const *p; 

        指向常量整数的指针,通过这个指针不能修改它所指向的整数值,但可以修改指针本身来指向其他地址

const int a = 10;
const int *p = &a;
// *p = 20; // 错误:不能通过*p修改a的值
int b = 20;
p = &b; // 合法:可以修改指针p,使其指向其他地址

(2)int *const p;

        常量指针,指向一个整数。指针本身是常量,不能修改,但可以通过指针修改它所指向的整数值

int a = 10;
int *const p = &a;
*p = 20; // 合法:可以通过p修改a的值
// p = &b; // 错误:不能修改指针p本身

(3)const int *const p;

        表示一个指向常量整数的常量指针,既不能修改指针所指向的地址,也不能通过指针修改它所指向的整数值

const int a = 10;
const int *const p = &a;
// *p = 20; // 错误:不能通过*p修改a的值
// p = &b; // 错误:不能修改指针p本身

2. TCP/IP的四层模型是什么?

(1)应用层

        应用层是TCP/IP协议栈的顶层,它为应用程序提供网络服务接口。该层协议包括HTTP、FTP、SMTP、Telnet等,负责与用户直接交互,处理特定的应用程序任务

  • HTTP(HyperText Transfer Protocol):用于网页浏览。
  • FTP(File Transfer Protocol):用于文件传输。
  • SMTP(Simple Mail Transfer Protocol):用于电子邮件传输。
  • DNS(Domain Name System):用于域名解析。

(2)传输层

        传输层负责在两个主机之间建立、维护和终止传输会话,并保证数据包的可靠传输。该层主要包含TCP和UDP协议

  • TCP(Transmission Control Protocol):提供可靠的、有序的、面向连接的传输服务。它通过三次握手建立连接,确保数据包按序到达,并通过确认机制保证数据的正确传输。
  • UDP(User Datagram Protocol):提供无连接、不可靠的传输服务,适用于对速度要求高但对可靠性要求低的场景,如实时视频传输。

(3)网络层

        网络层负责将数据包从源传输到目的地,主要通过IP协议来实现。该层还包括路由选择、逻辑地址管理等功能        

  • IP(Internet Protocol):提供数据包的寻址和路由功能,是整个互联网的基础。IP协议分为IPv4和IPv6两个版本。
  • 其他相关协议包括ICMP(Internet Control Message Protocol)和ARP(Address Resolution Protocol)

(4)数据链路层

        数据链路层负责在相邻节点之间传输数据帧,提供物理地址寻址、帧同步、错误检测和纠正等功能。该层协议包括Ethernet、PPP(Point-to-Point Protocol)

  • Ethernet(以太网):是局域网中最常用的数据链路层协议。
  • PPP(Point-to-Point Protocol):用于点对点连接,常用于电话拨号连接和一些宽带连接。

3. 数据结构的框架

(1)线性数据结构(一对一)

        线性数据结构指的是数据元素按顺序排列,每个元素只有一个前驱和一个后继,常见的线性数据结构有:

        1. 数组

        2. 链表

        (1)单向链表

        (2)双向链表

        (3)循环链表

        3. 栈(先进后出)

        4. 队列(先进先出)

(2)树型结构(一对多)

        1. 二叉树

        2. 二叉搜索树

        3. 平衡树

        4. 红黑树

(3)图形结构(多对多网状结构)

(4)哈希表

4. 链表的作用

(1)动态分配内存

        链表在需要频繁插入和删除操作的场景中表现优越。由于链表不需要预先分配固定大小的内存,可以根据需要动态增加和减少节点,节省内存

(2)实现元素的灵活插入和删除

(3)实现抽象数据类型(如栈、队列等)

5. 链表的应用场景

(1)实现栈和队列的数据结构

        单向链表实现入栈出栈、入队出队的操作

(2)在编译器中实现符号表或字典的实现

(3)处理大量未知大小的数据集

        当需要处理的数据集较大且大小无法预知时,链表的动态内存分配优势显现出来,特别是频繁的插入和删除操作

(4)实现哈希表

(5)浏览器网页的前进和后退

6. 数据库的流程

        数据库是一套用于存储、管理和检索数据的系统。数据库的流程可以分为这几个步骤:包括设计、创建、操作、优化和维护。

(1)数据库的设计

        1. 需求分析

        (1)确定系统需求,包括数据存储、检索、更新和管理需求

        (2)与用户、业务分析师和其他相关方进行交流,了解业务流程和数据需求

        2. 概念设计

        3. 逻辑设计

        4. 物理设计

(2)数据库创建

        1. 创建数据库

        2. 创建表和约束

(3)数据操作

        1. 数据插入

        2. 数据查询

        3. 数据更新

        4. 数据删除

(4)数据库优化

        1. 查询优化

        2. 索引管理

        3. 性能监测

(5)数据库维护

        1. 备份和恢复

        2. 数据库安全

        3. 数据库迁移

(6)数据库管理

        1. 用户管理

        2. 日志管理

        3. 数据库调整

7. 目录操作流程

8. c语言中#ifndef的作用

(1)防止重复定义

        在大型项目中,头文件可能会被多个源文件包含,使用#ifndef可以防止多次包含同一个头文件而导致的编译错误

        当一个头文件被多次包含时,可能会导致重复定义的错误。#ifndef和#define一起使用可以确保头文件内容只被包含一次

(2)条件编译

        根据编译环境的不同,选择性编译代码

        可以用来根据条件编译特定的代码片段。例如,在不同的编译环境中包含不同的代码

9. c语言中头文件#include “stdio.h” 和 #include <stdio.h>中""和<>有啥区别

(1)双引号#include "header.h"包含项目中自定义的头文件

        编译器会先在当前目录中搜索头文件,如果找不到再去系统目录中搜索

(2)尖括号#include <header.h>包含标准库头文件或第三方库头文件

        编译器只会在系统标准包含路径中搜索头文件

10. 熟悉哪些协议?下载文件常用的协议?

(1)MODBUS协议

(2)HTTP协议

(3)FTP协议

(4)TCP/IP协议

(5)UDP协议

(6)下载文件常用的协议

        1. HTTP

        通过浏览器或下载管理器来下载网页资源、文档、软件等

        2. FTP

        通常用于下载大型文件或从特定服务器下载

11. 设计一个点对点通信的软件,选择TCP还是UDP,为什么?

(1)TCP(传输控制协议)

        1. 特点

        (1)可靠性强

        (2)流量控制

                根据网络状况调整数据发送速率,防止网络阻塞

        (3)连接建立

                TCP需要建立连接(三次握手),有一定延迟

        2. 适用场景

        (1)保证文件完整性的文件传输        

        (2)消息传递

                需要确保消息有序且完整到达的场景,如聊天应用程序

(2)UDP(用户数据报协议)

        1. 特点

        (1)无连接

        (2)不可靠传输

        (3)资源开销小

        2. 适用场景

        (1)实时的音视频传输:容忍数据丢失

        (2)在线游戏

        (3)广播通信

(3)选择理由

        1. 若通信软件需要可靠的消息传输应该选用TCP

        2. 若通信软件强调实时性并且能够容忍数据的丢包和乱序,并且需要低延迟,则选择UDP

12. 排序算法总结(以数组举例)

(1)冒泡排序

        1. 原理

        重复遍历要排序的数组,比较相邻的元素大小,如果相邻元素的的顺序错误,交换元素的位置,直到数组变为顺序结构为之

        2. 代码

void BubbleSort(int array[], int len)
{
	int i = 0;
	int j = 0;
	int tmp = 0;

	for (i = 0; i < len - 1; ++i)
	{
		for (j = 0; j < len - 1 - i; ++j)
		{
			if (array[j] > array[j+1])
			{
				tmp = array[j];
				array[j] = array[j+1];
				array[j+1] = tmp;
			}
		}
	}
}

(2)插入排序

        1. 原理

        将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,将其插入到已排序部分中的合适位置,直到所有的元素都被排序完成。

        2. 代码

void InsertSort(int array[], int len)
{
	int i = 0;
	int j = 0;
	int tmp = 0;

	for (i = 0; i < len; ++i)
	{
		tmp = array[i];//暂时存储当前要插入的值
		j = i;

		while (j > 0 && a[j-1] > tmp)//判断要插入的值是否小于要比较的值
		{
			a[j] = a[j-1];//把大的数值向后移
			--j;
		}

		a[j] = tmp;//找到合适的位置
	}
}

(3)选择排序

        1. 原理

        每次从未排序部分找到最小(最大)的元素放入已排序部分的末尾,直到所有元素排序完成

        2. 代码

void SelectSort(int array[], int len)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	int minpos = 0;

	for (i = 0; i < len-1; ++i)
	{
		minpos = i;
		for (j = i+1; j < len; ++j)//在未排序数组中寻找最小值
		{
			if (array[minpos] > array[j])
			{
				minpos = j;//如果当前最小值大于未排序数组元素中的值,更新最小值下标
			}	
		}

		if (minpos != i)//如果最小值下标位置已经更新了
		{
			tmp = array[i];
			array[i] = array[minpos];
			array[minpos] = tmp;
		}
	}
}

(4)快速排序

        采用分治法,将一个数组分成较小的子数组,然后递归排序这些子数组。

        (1)选取基准元素

        (2)通过基准值,将数组划分排列,比基准值小的元素放在基准元素的左边,比基准值大的元素放在基准值的右边

        (3)递归对基准值左边和右边的数组进行上述操作,直到子数组大小为0或一个,结束排序

(5)希尔排序

13. 数据库类型

(1)关系型数据库(RDBMS)

        1. MySQL

        (1)特点

                开源、易于使用、高性能、

        (2)应用场景

                Web开发、电子商务

        2. SQLite

        (1)特点

                轻量级、适用嵌入式、无需服务器

        (2)应用场景

                移动应用、嵌入式系统、

        3. Microsoft SQL Server

        (1)特点

                商业化、与Windows生态系统集成度高

        (2)应用场景

                企业应用

(2)非关系型数据库(NoSQL)

        1. MongoDB

        (1)特点

                文档数据库、、基于JSON的存储、扩展性强

        (2)应用场景

                实时分析、大数据应用、物联网(loT)

(3)区别

        1. 数据模型

        (1)关系型数据库采用表格的关系模型、适合结构化数据和复杂查阅

        (2)非关系型数据库采用键值对、文档、列族或图的形式,适合灵活的数据模型

        2. 扩展性

        (1)关系型数据库一般纵向扩展

        (2)非关系型数据库一般横向扩展

        3. 查询能力

        (1)关系型数据库适用SQL进行复杂查询和操作

        (2)非关系型数据库提供灵活的查询语言和API接口

14. 链表头插尾插哪种效率高

(1)需要频繁在头部插入节点而不在乎节点顺序,头插法更高效

(2)如果要保持节点插入顺序或实现队列,尾插法更合适

15. 链表查重结束的条件?

(1)遍历到链表末尾,下一个节点指向NULL

(2)在遍历过程中发现重复节点

16. 如何调试段错误?

(1)GDB调试

        1. 在编译代码时加入-g选项

                gcc filename.c -g

        2. 使用gdb调试生成代码

                gdb a.out

        3. GDB调试命令

                l                查看代码

                b 函数名/行号        设置断点

                r                运行代码

                n                单步运行

                c                直接运行到下一处断点

                s                进入函数内部调试

                p  变量名    查看变量对应值

                q                退出

(2)打印法调试

        在程序可能出现段错误的位置加入打印,前一句能够打印出来,后一句打印不出来,问题就可以定位到两次打印中间的代码部分

(3)core文件调试法

        1. 配置core文件

        2. ulimit -c unlimited

        3. 编译代码加入-gxuanx        

                gcc filename.c -o filename

        4. 运行代码使其产生段错误,段错误产生后会生成一个包含错误信息的core文件

        5. gdb a.out core能够找到错误产生的位置

17. 数据结构对编程的帮助有哪些

(1)组织和管理数据

(2)提高算法效率

(3)简化代码实现

(4)解决特定问题

(5)增强代码可读性和维护性

18. 常用链表的适用场景?

(1)单向链表

        1. 实现队列(FIFO)

        2. 动态数据集合:例如动态管理学生名单或动态更新的购物车

(2)双向链表

        1. 双向遍历

        2. 编辑器的撤销操作

(3)循环链表

        1. 约瑟夫回环问题

        2. 时钟算法

19. 熟悉哪些协议?下载时用什么协议

(1)HTTP协议

(2)TCP/IP协议

(3)FTP协议

(4)MODBUS协议

(5)文件下载时常用HTTP/HTTPS协议

20. 栈区存放什么?栈区的大小?

(1)栈区存储的数据

        1. 局部变量:函数内定义的变量

        2. 传递给函数的参数

        3. 函数调用后需要范围的地址

        4. 临时变量:编译器在生成代码时使用的一些临时数据

        5. 栈指针

(2)栈区大小(可以修改默认值)

        1. Windows:通常1MB

        2. Linux:通常8MB

21. 数据区放什么?数据区的大小?

(1)数据区存放的数据

        1. 已经初始化的静态变量和全局变量

        2. 未初始化的静态变量和全局变量

        3. 字符串常量

(2)数据区大小

        由操作系统动态管理和分配

(3)特点

        1. 变量未初始化时默认为0

        2. 变量在程序编译时开辟空间,程序结束时回收空间

22. linux中的常用命令

文件和目录管理

  • ls:列出目录内容。
     

    sh复制代码

    ls -l # 以长格式列出目录内容
  • cd:改变当前目录。
     

    sh复制代码

    cd /path/to/directory # 切换到指定目录
  • pwd:显示当前工作目录的绝对路径。
     

    sh复制代码

    pwd # 显示当前目录
  • cp:复制文件或目录。
     

    sh复制代码

    cp source_file destination_file # 复制文件 cp -r source_directory destination_directory # 复制目录
  • mv:移动或重命名文件或目录。
     

    sh复制代码

    mv old_name new_name # 重命名文件或目录 mv file_name /path/to/destination # 移动文件
  • rm:删除文件或目录。
     

    sh复制代码

    rm file_name # 删除文件 rm -r directory_name # 删除目录
  • mkdir:创建新目录。
     

    sh复制代码

    mkdir new_directory # 创建新目录
  • rmdir:删除空目录。
     

    sh复制代码

    rmdir empty_directory # 删除空目录

文件内容查看和编辑

  • cat:连接文件并显示内容。
     

    sh复制代码

    cat file_name # 显示文件内容
  • more:逐屏查看文件内容。
     

    sh复制代码

    more file_name # 逐屏显示文件内容
  • less:逐屏查看文件内容,支持前后翻页。
     

    sh复制代码

    less file_name # 逐屏显示文件内容
  • head:显示文件开头部分内容。
     

    sh复制代码

    head file_name # 显示文件的前10行 head -n 20 file_name # 显示文件的前20行
  • tail:显示文件末尾部分内容。
     

    sh复制代码

    tail file_name # 显示文件的后10行 tail -n 20 file_name # 显示文件的后20行 tail -f file_name # 动态显示文件的新内容(如日志文件)
  • nano:简易文本编辑器。
     

    sh复制代码

    nano file_name # 使用nano编辑文件
  • vim:功能强大的文本编辑器。
     

    sh复制代码

    vim file_name # 使用vim编辑文件

系统管理

  • top:实时显示系统性能和进程信息。
     

    sh复制代码

    top # 实时显示系统信息
  • ps:显示当前进程信息。
     

    sh复制代码

    ps aux # 显示所有进程信息
  • kill:终止进程。
     

    sh复制代码

    kill process_id # 终止指定进程 kill -9 process_id # 强制终止指定进程
  • df:显示文件系统磁盘空间使用情况。
     

    sh复制代码

    df -h # 以人类可读的格式显示磁盘使用情况
  • du:显示文件和目录的磁盘使用情况。
     

    sh复制代码

    du -sh directory_name # 显示目录大小
  • free:显示系统内存使用情况。
     

    sh复制代码

    free -h # 以人类可读的格式显示内存使用情况
  • uname:显示系统信息。
     

    sh复制代码

    uname -a # 显示所有系统信息

网络管理

  • ping:测试网络连接。
     

    sh复制代码

    ping www.example.com # 测试与目标主机的网络连接
  • ifconfig:配置网络接口(需要超级用户权限)。
     

    sh复制代码

    ifconfig # 显示网络接口信息
  • netstat:显示网络连接、路由表和网络接口信息。
     

    sh复制代码

    netstat -tuln # 显示所有监听端口
  • ssh:通过SSH协议远程登录到另一台主机。
     

    sh复制代码

    ssh user@hostname # 通过SSH登录远程主机

用户管理

  • useradd:添加新用户(需要超级用户权限)。
     

    sh复制代码

    sudo useradd new_user # 添加新用户
  • passwd:更改用户密码。
     

    sh复制代码

    passwd # 更改当前用户密码 sudo passwd user_name # 更改指定用户密码
  • su:切换用户身份。
     

    sh复制代码

    su - # 切换到超级用户 su - user_name # 切换到指定用户
  • sudo:以超级用户权限执行命令。
     

    sh复制代码

    sudo command # 以超级用户权限执行命令

23. linux下的进程命令

(1)ps(显示当前进程信息)

ps aux  # 显示所有进程的详细信息
ps -ef  # 显示所有进程的完整格式信息

(2)top(实时显示系统性能和进程信息)

(3)pstree(以树状图显示进程信息)

(4)kill(终止进程)

kill process_id  # 终止指定进程
kill -9 process_id  # 强制终止指定进程

24. linux下的网络命令

(1)ping(测试网络连接)

ping www.example.com  # 测试与目标主机的网络连接

(2)ifconfig(显示所有网络接口信息)

(3)ip(显示和操作网络接口、路由)

(4)netstat(显示网络连接、路由表和网络接口信息)

25. linux下查看网卡信息命令

(1)ifconfig(显示所有网络接口信息)

(2)ip(显示和操作网络接口信息)

ip addr show  # 显示所有网络接口的地址信息
ip link show  # 显示所有网络接口的信息
ip addr show eth0  # 显示特定网络接口eth0的地址信息
 

26. 单链表和双链表的区别?

(1)单向链表(每个节点有数据部分和指向下一个节点的指针)

        1. 优点

        (1)内存占用少(只有一个数据和指向下一个节点的指针)

        (2)实现相对简单

        2. 缺点

        (1)无法反向遍历

        (2)查找效率低

(2)双向链表(每个节点包含数据部分、指向上一个节点的指针、指向下一个节点的指针)

        1. 优点

        (1)能够双向遍历

        (2)更高的操作灵活性

        2. 缺点

        (1)内存占用多

        (2)实现复杂

(3)区别

        1. 单向链表:结构简单、内存占用少、但只能单向遍历、操作灵活性差

        2. 双向链表:结构复杂、内存占用多,但支持双向遍历、操作灵活性高

27. 如果知道某个节点的值,想删除怎么操作?

        (1)单向链表

                两个指针一前一后,遍历所有节点,寻找到要删除的节点,进行删除操作

        (2)双向链表

                只需要一个指针进行遍历删除即可

28. 编程时什么时候适合多进程?什么时候适合多线程

(1)多进程

        1. 需要任务隔离

        当你需要隔离不同任务或模块,确保它们之间的崩溃或故障不会影响其他任务时

        2. 需要稳定性和安全性

        当你需要提高系统的稳定性和安全性时,因为每个进程有自己的内存空间,崩溃或安全问题不会影响其他进程

        3. 资源隔离,不需要共享资源

        当任务需要独立的资源(如文件描述符、网络连接等),并且这些资源不能被共享时

(2)多线程

        1. 共享内存场景

        多个任务需要频繁访问共享数据时,线程可以通过共享内存进行高效的通信

        2. 轻量级任务

        3. 需要实时性响应

        当应用需要响应用户输入或进行实时处理时,线程可以在同一个进程中并发执行任务,提高响应速度

        4, 上下文切换开销低

        当你需要频繁的上下文切换,但进程切换开销过大时,线程的上下文切换开销更小

        

(3)区别

        1. 多进程:任务隔离、资源独立性高、稳定性安全性要求高

        2. 多线程:共享内存、高效资源利用、实时性要求高

29. 列举五个操作进程的命令

(1)ps(查看当前系统的进程信息)

ps aux  # 显示所有用户的所有进程详细信息
ps -ef  # 以完整格式显示所有进程
(2)top(实时显示系统中的进程活动)

(3)kill(终止进程)

kill <PID>  # 发送SIGTERM信号终止指定PID的进程
kill -9 <PID>  # 发送SIGKILL信号强制终止指定PID的进程
(4)pstree(以树状图显示进程信息)

(5)ulimit(设置用户进程的资源限制)

ulimit -a  # 显示所有限制
ulimit -n <number>  # 设置文件描述符限制
 

30. 什么是阻塞?

(1)定义

        在执行程序时,一个操作或进程由于某些原因无法继续执行,必须等待某个条件满足后才能继续,这种情况下程序或进程会暂停,直到阻塞消除

(2)常见场景

        1. IO操作

        2. 锁

        3. 等待条件

31. 为什么多进程不需要互斥、多线程需要互斥?

(1)多进程不需要互斥,因为每个进程都有独立的内存空间,进行间不直接共享内存数据,不会出现多个进程同时访问和修改同一内存位置的情况

(2)多线程需要互斥,线程共享同一内存空间,必须通过同步机制来管理对共享资源的访问,防止数据竞争和不一致性

(3)互斥主要目的是保证数据的完整性和一致性,防止多个执行单元(线程)在同一时间修改共享数据是出现不可预知的结果

32. 数据结构中表、栈、队列的区别?

(1)表

        表是一种有序的数据集合,每个元素有唯一的位置,表可以是动态的,能够随时增加或删除元素

        插入:可以在任意位置插入元素

        删除:可以删除任意位置的元素

        访问:可以通过索引访问任何位置的元素

(2)栈

        一种先入后出的数据结构

        入栈:在栈顶添加元素

        出栈:从栈顶移出元素

        访问:只能访问栈顶元素

(3)队列

        先进先出的数据结构

        入队:在队尾添加元素

        出队:从队首移除元素

        访问:只能访问队首和队尾元素

(4)总结

        1. 表:有序数据集合,可以在任意位置插入、删除和访问,适用于需要频繁访问和修改任意位置元素的场景

        2. 栈:先进后出,只能在栈顶进行插入和删除,适用于后进先出的场景

        3. 队列:先进先出,只能在队尾插入和队首删除操作,适用于需要先进先出的场景

33. 怎么实现文件的拷贝?

(1)linux命令:cp

(2)TCP

(3)管道

34. 如何定义一个指向整形5个元素的数组指针?

int array[5] = {1, 2, 3, 4, 5};
int (*pstr)[5] = &array;

35. Linux中如何测试内存大小?

(1)free

        显示系统中内存的使用情况,包括总内存、已经使用内存、共享内存、空闲内存、缓存和缓冲区等

        free -h

(2)top

        实时显示系统任务信息和内存使用情况

36. 如何在C语言中定义一个能够变长的数组空间?

(1)用malloc分配初始内存空间

#include <stdio.h>
#include <stdlib.h>

int main() {
    int initial_size = 5;
    int *array = (int *)malloc(initial_size * sizeof(int));

    if (array == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 使用数组
    for (int i = 0; i < initial_size; i++) {
        array[i] = i;
        printf("%d ", array[i]);
    }
    printf("\n");

    // 释放内存
    free(array);

    return 0;
}

(2)使用realloc来调整数组的大小

#include <stdio.h>
#include <stdlib.h>

int main() {
    int initial_size = 5;
    int new_size = 10;

    // 初始分配
    int *array = (int *)malloc(initial_size * sizeof(int));
    if (array == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 初始化数组
    for (int i = 0; i < initial_size; i++) {
        array[i] = i;
    }

    // 调整大小
    int *temp = (int *)realloc(array, new_size * sizeof(int));
    if (temp == NULL) {
        printf("内存重新分配失败\n");
        free(array);  // 确保释放原内存
        return 1;
    }
    array = temp;

    // 初始化新空间
    for (int i = initial_size; i < new_size; i++) {
        array[i] = i;
    }

    // 使用新数组
    for (int i = 0; i < new_size; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    // 释放内存
    free(array);

    return 0;
}

37. linux中如何查看进程的状态图?

        pstree命令能够以树状图形式显示进程信息

38. 如何使UDP稳定?

(1)超时和确认机制

        使用超时和确认机制,确保发送的数据包被正确接收

(2)重传机制

        在应用层实现重传机制,如果在一定时间内没有收到ACK(确认)包,则重新发送数据包

(3)错误监测和校验机制

(4)流量控制和拥塞控制

39. 什么是同步和异步?它们的区别是什么?

(1)同步

        指任务按顺序执行,一个任务必须等前一个任务完成后,才能开始下一个任务。

        程序阻塞执行:当前任务执行完之前,后续任务必须等待

        任务执行逻辑清晰

        会因为其中某个长时间执行的任务导致整体执行延迟变高

(2)异步

        指的是任务可以并发执行,不必等待其他任务完成。程序可以继续执行其他任务,不会被阻塞

(3)同步和异步的区别

        1. 执行方式

        (1)同步:按顺序执行,后续任务等待前一项任务完成才能开始执行

        (2)异步任务并发执行,不必等待

        2. 效率 

        (1)同步:适合短时间的任务,长时间的任务会阻塞程序

        (2)异步:适合长时间或IO密集型任务

        3. 复杂性

        (1)同步:逻辑简单,易于调试

        (2)异步:逻辑复杂,不易调试

40. 介绍数据库的工作原理

        数据库的工作原理涉及多方面的知识,包括数据存储、检索、索引、事务处理、并发控制、故障恢复等

(1)数据存储

数据库系统将数据存储在磁盘上的文件中,这些文件通常被组织成表。每个表由行(记录)和列(字段)组成。

  • 行(Row): 每行代表一条记录。
  • 列(Column): 每列代表一个数据字段
存储结构
  • 页(Page): 数据库通常将数据存储在固定大小的页中(如4KB或8KB)。
  • 表空间(Tablespace): 页进一步组织成表空间,用于管理表的数据存储。

(2)数据检索

        数据检索是通过SQL查询语句实现的。查询语句由数据库管理系统(DBMS)解析、优化和执行

查询处理
  • 解析器(Parser): 将SQL查询语句解析成语法树。
  • 优化器(Optimizer): 优化查询计划,选择最优的执行路径。
  • 执行器(Executor): 执行优化后的查询计划,检索数据。

(3)索引

        索引是提高查询速度的关键技术。数据库通过索引来快速定位数据,类似于书籍的目录

  • B-树索引: 常见的索引类型,适用于范围查询。
  • 哈希索引: 适用于等值查询。
  • 全文索引: 用于文本搜索

(4)事务处理

        事务是数据库中的一组操作,具有ACID特性(原子性、一致性、隔离性、持久性)

事务特性
  • 原子性(Atomicity): 事务中的所有操作要么全部完成,要么全部不完成。
  • 一致性(Consistency): 事务使数据库从一个一致状态转换到另一个一致状态。
  • 隔离性(Isolation): 事务的执行彼此隔离。
  • 持久性(Durability): 事务完成后,结果持久保存在数据库中。

(5)并发控制

        并发控制确保多个事务能够安全地并发执行,避免数据不一致

并发控制方法
  • 锁机制: 用于控制对数据的访问。

    • 共享锁(S): 允许多个事务读取数据。
    • 排他锁(X): 只允许一个事务修改数据。
  • 多版本并发控制(MVCC): 通过维护数据的多个版本,提供高并发性能

(6)故障恢复

数据库系统通过日志和备份机制实现故障恢复,保证数据的可靠性。

恢复机制
  • 日志(Log): 记录事务操作,支持事务回滚和重做。
  • 检查点(Checkpoint): 定期将内存中的数据写入磁盘,缩短恢复时间。
  • 备份(Backup): 定期备份数据库,防止数据丢失

(7)数据库架构

数据库系统通常采用客户端-服务器架构。

主要组件
  • 客户端: 用户接口,发送SQL请求。
  • 服务器: 处理SQL请求,管理数据库。
    • DBMS内核: 实现存储管理、查询处理、事务处理等功能。
    • 存储引擎: 负责数据的存储和检索

(8)数据库类型

  • 关系数据库(RDBMS): 使用表格结构存储数据,如MySQL、PostgreSQL。
  • 面向对象数据库(OODBMS): 将对象存储在数据库中。
  • NoSQL数据库: 非关系型数据库,适用于大数据和分布式存储,如MongoDB、Cassandra

41. 互斥和同步的定义和区别

(1)互斥

        1. 定义

        互斥是在任何给定的时刻,只有一个线程或进程能够访问某个资源或执行某段代码。这是为了防止多个线程同时修改共享资源,导致数据不一致

        2. 实现方式

        加锁机制实现互斥

        (1)互斥锁

        (2)自旋锁

        (3)信号量

        (4)读写锁

(2)同步

        1. 定义

        同步是指协调多个线程或进程的执行顺序,确保它们按照预期的顺序执行。

        2. 实现方式

        (1)条件变量

        (2)信号量

        

(3)互斥和同步的区别

        1. 互斥

        防止多个线程同时访问共享资源,确保资源访问的独占性

        用于保护共享资源,防止数据竞争和不一致

        2. 同步

        协调多个线程的执行顺序,确保线程间的依赖关系和协作

42. linux中与文件相关的命令有哪些

(1)文件和目录操作

        (1)ls

        (2)cd

        (3)pwd

        (4)mkdir

        (5)rmdir

        (6)rm

        (7)cp

        (8)mv

(2)文件查看命令

        (1)cat

        (2)more

        (3)less

        (4)head

        (5)head

        (6)tail

  (3)文件搜索与比较

        (1)find

  • 查找文件和目录。
  • 示例:find /home -name "file.txt" 在/home目录下查找名为file.txt的文件。

        (2)locate

  • 快速查找文件。
  • 示例:locate file.txt 查找系统中名为file.txt的文件。

        (3)grep

  • 搜索文件内容。
  • 示例:grep "hello" file.txt 搜索file.txt中包含hello的行。

        (4)diff

  • 比较文件内容差异。
  • 示例:diff file1.txt file2.txt 比较file1.txt和file2.txt的内容差异

        (5)cmp

  • 比较两个文件是否相同。
  • 示例:cmp file1.txt file2.txt 比较file1.txt和file2.txt。

(4)文件权限与属性

        (1)chmod

  • 修改文件权限。
  • 示例:chmod 755 file.txt 设置file.txt的权限为755

        (2)stat

  • 显示文件详细信息。
  • 示例:stat file.txt 显示file.txt的详细信息

(5)文件归档和压缩

        (1)tar

  • 归档文件。
  • 示例:tar -cvf archive.tar dir/ 创建名为archive.tar的归档文件,包含目录dir

        (2)gzip

  • 压缩文件。
  • 示例:gzip file.txt 压缩file.txt,生成file.txt.gz

        (3)gunzip

  • 解压缩文件。
  • 示例:gunzip file.txt.gz 解压file.txt.gz,生成file.txt

        (4)zip

  • 创建压缩文件。
  • 示例:zip archive.zip file1.txt file2.txt 创建名为archive.zip的压缩文件,包含file1.txt和file2.txt

        (5)unzip

  • 解压缩文件。
  • 示例:unzip archive.zip 解压archive.zip

(6)其他常用命令

        (1)touch

  • 创建空文件或更新文件的修改时间。
  • 示例:touch newfile.txt 创建名为newfile.txt的空文件

        (2)ln

  • 创建链接文件。
  • 示例:ln -s file.txt linkfile.txt 创建file.txt的符号链接linkfile.txt

        (3)file

  • 查看文件类型。
  • 示例:file file.txt 显示file.txt的文件类型

43. 使用进程和网络相关的命令?

(1)进程相关命令

        1. ps

  • ps aux:显示所有进程,包括其他用户的进程。
  • ps -ef:以完整格式显示所有进程

        2. top

        实时显示系统的资源使用情况,包括CPU、内存和每个进程的使用情况

        3. kill

  • kill [PID]:终止指定 PID 的进程。
  • kill -9 [PID]:强制终止指定 PID 的进程

        4. pstree

  • pstree:显示进程树。
  • pstree -p:显示进程树并包括 PID

(2)网络相关命令

        1. ifconfig

        2. ip

        3. ping

        4. netstat        显示网络连接、路由表、接口统计等

44. HTTP报文格式

        HTTP(超文本传输协议)是一种用于分布式、协作和超媒体信息系统的应用层协议。它是万维网的数据通信基础。HTTP 报文分为请求报文和响应报文,每种报文都包含三个部分:起始行、头部字段和消息主体

(1)请求报文格式

        1. 请求行

                包含请求方法、请求的 URL 和 HTTP 版本

                例如:GET /example.html HTTP/1.1

                GET 是请求方法,/example.html 是请求的资源路径,HTTP/1.1 是使用的 HTTP 版本

        2. 请求头部

                由一系列的键值对组成,每行一对,常见的头部字段有 Host(指定服务器的域名和端口)、User-Agent(客户端的信息,如浏览器类型和版本)、Accept(客户端能够接受的内容类型)等

                例如:

  • Host: www.example.com
  • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0

        3. 空行        

                用于分隔请求头部和请求体

        4. 请求体

                并非所有的请求都有请求体,例如 GET 请求通常没有,而 POST 请求常用于携带表单数据、JSON 数据等

(2)响应报文格式

        1. 状态行

                包含 HTTP 版本、状态码(如 200 表示成功,404 表示未找到资源等)以及状态描述

                例如:HTTP/1.1 200 OK

        2. 响应头部

                与请求头部类似,也是一系列的键值对,常见的有 Content-Type(响应内容的类型)、Content-Length(响应内容的长度)等

                例如      

  • Content-Type: text/html; charset=utf-8
  • Content-Length: 1234

        3. 空行

                分隔响应头部和响应体

        4. 响应体

                服务器返回的具体内容,如 HTML 页面、JSON 数据等 

              

45.    内存碎片、内存泄漏、内存溢出

(1)内存碎片

        由于频繁malloc和free小空间,导致大的连续空间由于中间存在小空间被占用而无法得到申请空间的现象称为内存碎片。分为外部碎片和内部碎片

(2)内存泄漏

        指程序在运行过程中分配了空间但未能释放,从而导致程序占用的内存不断增加,最终可能耗尽系统内存资源。(malloc但未能及时free)

(3)内存溢出

        也称内存越界,操作超过变量范围的空间

46. 原子操作

        在多线程或多进程环境中,对共享资源的操作能够保证在操作执行过程中不会被终端或干扰的操作。要么完全执行,要么完全不执行,不存在中间状态

47. 如何利用CPU占用率查看内存信息?

        top

        top 命令是一个实时的系统监控工具,可以显示 CPU 和内存的使用情况。通过观察 top 输出的信息,可以间接分析内存使用情况

48. 什么是MAC地址(在数据链路层)

(1)定义

        MAC地址是数据链路层地址,用在局域网中唯一标识网络接口设备。

(2)功能

        确保网络中的数据能够正确到达目标设备。数据链路层负责处理帧的封装和解封装,错误检测和流量控制

48. 详细介绍wireshark

(1)定义

        Wireshark 是一个广泛使用的网络协议分析工具,它允许用户捕获和分析网络上的数据包,帮助诊断网络问题、进行安全分析和进行协议开发等

(2)主要功能

        1. 数据包捕获

        2. 协议分析

             Wireshark 支持解码多种网络协议,包括 IP、TCP、UDP、HTTP、DNS、SMTP 等   

        3. 数据过滤

        4. 数据分析

        5. 到处和报告

49. 线程池和多进程的区别?epoll和线程池的关系和区别?epoll能否代替线程池?

(1)线程池

        是一种多线程处理技术,通过预创建和重用线程来处理任务,从而减少线程创建和销毁的开销。线程池在任务处理方面提供了一种高效的机制,通常用于需要频繁创建和销毁线程的场景

        

        

        

        

   

        

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商家拒单业务

文章目录 概要整体架构流程技术细节小结 概要 商家拒单是电子商务、外卖平台、在线零售等多个行业中可能出现的情况&#xff0c;指的是商家拒绝接受或完成某个订单。这种情况的发生可能由多种原因引起&#xff0c;同时也涉及到商家、平台和消费者的利益平衡。 需求分析以及接…

CTFHUB-XSS-反射型

开启题目&#xff0c;页面如下 先输入以下语句测试一下&#xff0c;发现页面弹出窗口显示“flag”&#xff0c;说明这里存在 XSS 漏洞 <script>alert("flag")</script> 验证存在 XSS 漏洞后&#xff0c;使用 document.cookie 语句在弹窗和控制台中输出当…

DOM案例

一.什么是DOM DOM(Document Object Model)文档对象模型的树形结构 说白了就是用js操作网页 使用方法: 1.找到对象 2.操作 操作网页 节点属性 改变网页内容.... 文档对象模型就是一个树形结构&#xff0c;类似于家谱树 html标签里面包裹了所有的文档内容。他是一个**父亲节…

用了组合式 (Composition) API 后代码变得更乱了,怎么办?

前言 组合式 (Composition) API 的一大特点是“非常灵活”&#xff0c;但也因为非常灵活&#xff0c;每个开发都有自己的想法。加上项目的持续迭代导致我们的代码变得愈发混乱&#xff0c;最终到达无法维护的地步。本文是我这几年使用组合式API的一些经验总结&#xff0c;希望…

【从相邻元素对还原数组】python刷题记录

R3-图篇 饭前一道题 思路&#xff1a; 单向构造 class Solution:def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]:mnlen(adjacentPairs)#n表示数组元素总数n1#统计dictdefaultdict(int)#存储关系哈希表hashmapdefaultdict(list)for a,b in adjacent…

DeDeCMS漏洞

一.登陆后台 二.文件管理上传shell 我们写一个一句话木马 然后上传 访问他 然后复制网址用工具连接 连接成功 修改模板文件拿shell 找到index.html修改 保存 然后进行下面的操作 访问返回的地址 然后用工具连接 三、后台任意命令执行拿shell 然后写入一个木马 添加成功 点击代…

开源:LLMCompiler高性能工具调用框架

开源&#xff1a;LLMCompiler高性能工具调用框架 LLMCompilerLLMCompiler 框架图任务提取单元使用方式参考链接 LLMCompiler LLMCompiler 是一种 Agent 架构&#xff0c;旨在通过在DAG中快速执行任务来加快 Agent 任务的执行速度。它还通过减少对 LLM 的调用次数来节省 Tokens …

51 华三路由

PC4 路由 能通的区域 MSR2

Vue和React谁更牛逼?看了你就有答案

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注&#xff01;个人知乎、公众号"沐爸空间" 使用 Chrome 浏览器&#xff0c;安装 Vue.js Devtools 和 React Developer Tools 浏览器插件后&#xff0c;打开网站即可知晓当前网站是使用的 Vue 框架还是 …

JCの技巧

当你们私下有矛盾&#xff0c;&#xff08;或者你被J惨了&#xff09;,可以试试以下方法 1.拔电线 优点&#xff1a;快准狠 缺点&#xff1a;看看你身后 2.定时关机 优点&#xff1a;猝不及防 缺点&#xff1a;设置时容易翻车 3.改代码 优点&#xff1a;长代码看不出来…

【数据结构入门 】队列

目录 前言 一、队列的概念及结构 1.概念 2.结构 二、队列的实现 1.队列的声明 2.初始化队列 3.队列的销毁 4.入队 5.出队 6.获取队列有效元素个数 7. 判断队列是否为空 8.获取队首元素 9.获取队尾元素 结论 前言 队列是一种数据结构&#xff0c;它遵循先进先出&#…

数字与位操作——168、670、233、357、400

168. Excel表列名称&#xff08;简单&#xff09; 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...示例 1&#xff1a; 输入&#xff1a;columnNumb…

[NISACTF 2022]ezstack-入土为安的第十四天

签到题吧 checksec pwn 没有保护 进入main函数&#xff0c;点进shell &#xff0c;buf 88808048buf system 08048512 /bin/sh 0804A024 直接让代码溢出调用system和/bin/sh from pwn import *# 连接到远程服务 p remote(node5.anna.nssctf.cn, 20789)# 构造 payload payl…

第三期书生大模型实战营之Llamaindex RAG实践

基础任务 任务要求&#xff1a;基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答&#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力&#xff0c;截图保存。 streamlit界面…

OS_进程

2024.06.25&#xff1a;操作系统进程学习笔记 第6节 进程 6.1 进程的定义6.2 进程的基本特征&#xff08;动态、并发、独立、异步&#xff09;6.3 机器状态&#xff08;进程可以读取/更新的内容&#xff09;6.3.1 虚拟化技术6.3.2 进程的地址空间&#xff08;虚拟存储器技术要学…

基于OpenCV-Python的彩色图像傅里叶变换

如果用OpenCV-Python进行图像的离散傅里叶变换与逆变换其实还蛮简单的&#xff0c;流程就是上图所示&#xff0c;值得注意的是&#xff0c;如果是多通道的图像&#xff0c;譬如多光谱、高光谱图像&#xff0c;需要对每个通道都进行傅里叶变换&#xff0c;最后再聚合&#xff0c…

数字乡村 | 是什么、建什么、怎么建?附200份详尽解决方案下载

数字乡村是什么 如何将数字乡村建设与全面实施乡村振兴战略有效衔接&#xff0c;已成为当前农业农村工作的重要课题。 200份资料下载方式&#xff0c;请看每张图片右下角信息 数字乡村作为一种新的乡村社会发展形态&#xff0c;是当今第四次工业革命工业互联网 生态系统的持…

如何在Java中调用数学中的log函数

在Java中&#xff0c;调用数学中的对数&#xff08;log&#xff09;函数通常是通过Math类来实现的。Math类提供了多种对数函数的实现&#xff0c;但最常用的是自然对数&#xff08;底数为e的对数&#xff09;和以10为底的对数。 自然对数&#xff08;底数为e&#xff09; 使用…

深度学习之参数初始化问题

参数初始化 1、 参数初始化可以减缓梯度爆炸和梯度消失问题 2、tanh一般使用Xavier初始化方法 3、Relu及其变种使用Kaiming初始化方法 V a r ( X ) E ( X 2 ) − E ( X ) 2 V a r ( X Y ) V a r ( X ) V a r ( Y ) , 当 X 和 Y 互相独立 V a r ( X Y ) V a r ( X ) V a r…

【机器学习基础】Scikit-learn主要用法

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…