嵌入式笔试准备

news2024/12/26 0:03:33

文件组合

将传输文件切分成多个部分,按照原排列顺序,每部分文件编号为一个正整数。

class Solution {
public:
    vector<vector<int>> fileCombination(int target) {
        vector<vector<int>> res;
        int sum = 0;
        for(int i=1; i<target;i++){
            sum = i;
            for(int j=i+1; j<target; j++){
                sum += j;
                if(sum == target){
                    vector<int> temp;
                    for(int k=i; k<=j; k++){
                        temp.push_back(k);
                    }
                    res.push_back(temp);
                }else if(sum > target){
                    break;
                }
            }
        }
        return res;
    }
};

早餐组合

在这里插入图片描述

在这里插入图片描述

求2~2000的素数个数,时间复杂度优于O(nlogn)

int countPrimes(int n){
	if(n < 2){
		return 0;
	}
	vector<bool> isPrime(n+1, true);
	isPrime[0] = isPrime[1] = false;
	for(int i=2; i*i <= n; i++){
		if(isPrime[i]){
			for(int j=i*i; j<=n; j+=i){
				isPrime[j] = false;
			}
		}
	}
	
	int primeCount = 0;
	for(int i=2; i<=n; i++){
		if(isPrime[i]){
			++count;
		}
	}
	return primeCount;
}

isPrime数组:用一个布尔类型的数组isPrime来标记每个数是否是素数,初始化为true。

  1. 从2开始遍历到sqrt(n),因为一个合数的最小质数一定小于等于它的平方根。
  2. 如果i是素数,那么i的倍数一定不是素数,因此将i的倍数都标记为false。
  3. 这里优化的地方在于,对于一个合数j,它会被它的最小质因数筛掉,而不会被大的质因数重复筛选掉,避免了重复计算。

常用的IO多路复用方式

IO多路复用是一种高效的I/O处理机制,它允许单个进程同时监控多个文件描述符(如网络套接字),一旦某个描述符就绪(可读或可写),就能及时通知程序进行相应的读写操作。
大大提高了程序处理并发连接的能力,广泛应用于高性能网络服务器。

为什么需要IO多路复用:

  • 传统阻塞I/O的弊端:每个连接都需要一个线程来处理,当连接数量增多时,线程开销过大,系统消耗资源严重。
  • IO多路复用的优势:单个线程可以监控多个连接,有效地利用系统资源,提高并发性能。

select
将所有文件描述符放到一个数组中,轮训遍历这个数组,检查每个文件描述符的状态。
缺点:

  • 单个进程能监视的文件描述符数量存在最大限制(通常为1024)。
  • 需要频繁切换用户态和内核态,效率较低。
  • 需要每次把整个描述符集合从用户态拷贝到内核态,开销较大。

poll
与select类似,也是通过轮询的方式检查文件描述符的状态。

  • 使用链表来存储文件描述符,解决了描述符数量的限制。
  • 其它方面与select类似,仍然存在效率问题。

epoll
epoll使用事件驱动的方式,只有当某个文件描述符的状态发生变化时,才会通知应用程序。

  • 效率更高:epoll使用红黑树和回调机制,避免了每次都线性遍历全部连接。
  • 支持大量文件描述符:理论上支持百万级别。
  • 内核事件表:内核中维护一个事件表,将用户注册的事件添加到这个表中。

select

select是最早的一种I/O多路复用机制,在POSIX标准中被广泛支持。

select允许进程监视多个文件描述符,一旦这些描述符中的任何一个变为可读、可写或者有异常发生,select就会返回。

缺点是select的性能随着监控的文件描述符数量增加而下降,因为每次调用都需要对所有描述符进行遍历。

select 是最早的 IO 多路复用机制,出现在 UNIX 系统中。它允许程序监视多个文件描述符,以查看是否可以进行 IO 操作(如读、写或有异常发生)。

select接受三个文件描述符集合(可读、可写、异常),以及一个超时时间。
程序将这些集合传递给select,select监听这些描述符,一旦其中的某个或多个描述符就绪,select 就会返回,程序再对就绪的描述符进行相应的 IO 操作。

兼容性好,几乎在所有的 UNIX 系统上都可以使用。
使用简单,易于理解和实现。

POLL

poll与select类似,但没有文件描述符数量的限制,并且使用了更灵活的数据结构(链表),可以监视更多的文件描述符。

但是它仍然需要遍历所有的文件描述符,因此在处理大量描述符时,性能没有本质提升。

EPOLL

epoll是Lnux下专门为解决select和poll的性能问题而设计的,它们使用了事件通知机制,而不是遍历文件描述符。

epoll有两种工作模式:水平触发和边缘触发,后者能够高效地处理大量并发连接。

epoll非常适用于高并发服务器的开发。

首先通过epoll_create创建一个epoll实例,然后通过epoll_ctrl将需要监控的文件描述符添加到epoll实例中,最后调用epoll_wait等待就绪的事件。

Linux常用的信号

Linux系统中,信号是一种进程间通信机制,用于异步通知进程某个事件的发生。
当一个进程接收到信号时,它可以采取相应的动作,如终止、忽略或者执行特定的处理函数。

信号的作用:

  • 进程控制:终止进程、暂停进程、继续进程等。
  • 异常处理:处理程序错误、硬件故障等异常情况。
  • 进程间通信:在进程之间传递信息。

常用信号:

  • SIGINT:中断信号,通常由Ctrl+C产生,用于终止前台进程。
  • SIGKILL:终止进程信号,无法被忽略或捕获。
  • SIGALRAM:定时器信号,用于实现定时功能。
  • SIGCHLD:子进程状态改变信号,当子进程终止或停止时,父进程会收到该信号。
  • SIGHUP:终端挂起或控制进程终止。通常用于通知进程重新读取配置文件。
  • SIGINT:中断信号,由Ctrl+C发送,用于终止前台进程。
  • SIGQUIT:由Ctrl+\发送,通常用于生成核心转储并终止进程。
  • SIGUSR1、SIGUSR2:由用户定义的信号,可以由用户和程序自行使用。

进程可以通过以下几种方式处理信号:

  • 忽略信号:不做任何处理。
  • 捕获信号:定义信号处理函数,当接收到信号时,执行该函数。
  • 默认处理:系统默认的处理方式,通常是终止进程。

使用kill命令/函数向指定进程发送信号,硬件中断可以产生信号。

Linux系统中的七种主要文件类型

  1. 普通文件(-):最常见的文件类型,用于存储各种类型的数据,包括文本、图形、音频、视频等。
  2. 目录文件(d):用于组织其它文件和目录,形成树状的文件系统结构。/etc、/home、/usr
  3. 链接文件(l)又称符号链接,指向另一个文件或目录的指针,分为软链接和硬链接。软链接相当于Windows的快捷方式,指向文件的路径。源文件删除后,软链接失效。硬链接:指向文件的inode节点,多个硬链接指向同一个inode。ln -s /etc/passwd mypasswd创建一个指向/etc/passwd的软链接
  4. 块设备文件(b)用于访问块设备,如硬盘、U盘等。块设备以固定大小的块为单位进行数据传输。如/dev/sda、/dev/sdb。
  5. 字符设备文件(c)用于访问字符设备,如键盘、鼠标、串口等,字符设备以字节为单位进行数据传输。/dev/tty
  6. 管道文件(p):用于进程间通信,提供一个单向的数据流。mkfifo mypipe创建一个名为mypipe的管道文件。
  7. 套接字文件(s):用于网络通信,实现进程间通过网络进行数据交换。/tmp/mysocket。

使用ls -l查看文件类型,输出的第一个字符就是。
file

/usr目录

在Linux系统中,/usr目录是一个非常重要的目录,是Unix System Resource的缩写。

  • /usr/bin:存放用户和系统管理员使用的大多数可执行文件,这些文件并不是系统启动时必须的,而是日常操作和应用软件需要用到的命令。
  • /usr/sbin:存放系统管理员使用的管理命令,这些命令通常用于系统维护和管理。

#include <head.h> 和 #include “head.h” 的区别

#include 指令用于包含头文件,将头文件的内容复制到当前源文件中。

#include <head.h>

  • 编译器会优先在系统指定的标准头文件目录中查找名为head.h的文件。这些目录通常包含标准库的头文件,如stdio.h,stdlib.h等。

#include “head.h”

  • 编译器会首先在当前源文件所在的目录中查找名为head.h的文件,如果找不到,再按系统指定的规则到其它目录中查找。

Linux线程间的同步与互斥方法

在Linux系统中,多线程编程非常常见,但多个线程同时访问共享资源时,很容易引发数据竞争问题。为了确保程序的正确性和稳定性,必须采用合适的同步与互斥机制。

  • 同步:指多个线程按照一定的顺序执行,确保某些特定的处理顺序。
  • 互斥:指在某一特定时间段内只允许一个线程访问共享资源。

互斥锁
一次只能被一个线程持有。

信号量
信号量是一个计数器,可以实现多个线程对多个共享资源的访问。

条件变量
条件变量与互斥锁配合使用,允许线程等待某个特定的条件的发生。实现线程间的同步,一个线程可以等待另一个线程通知它某个条件已经满足。

读写锁
读写锁允许多个线程同时读取共享资源,但同一个时间只允许一个线程写入。

自旋锁
自旋锁是一种忙等待的锁,当一个线程试图获取已经持有的锁时,会一直忙等待,直到释放。

互斥锁:适合保护单个共享资源,确保互斥访问。
信号量:适合控制多个线程对有限数量资源的访问。
条件变量:适合实现线程间的同步,等待特定条件。
读写锁:适合读操作远多于写操作的场景。
自旋锁:适合锁持有时间较短的场景,但过度使用可能导致CPU空转。

线程拥有自己的堆栈和局部变量

排序算法中哪些是不稳定的

不稳定的排序算法是指排序过程中,无法保证相同值的元素的相对顺序不会改变。

  • 快速排序
  • 选择排序
  • 希尔排序
    将序列分为若干子序列,分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
  • 堆排序
    在堆调整的过程中,可能会破坏相等元素的相对顺序。

对于大量数据的传输,共享内存通常是进程间同步的最佳选择。

共享内存直接映射到进程的地址空间,省去了内核态和用户态的切换,数据传输效率极高。
共享内存可以支持非常大的数据传输,不受限制。
进程可以直接对共享内存进行读写操作,就像访问自己的内存一样。

  1. 一个进程创建一个共享内存段,并指定其大小。
  2. 其它进程通过共享内存段的标识符获取到该共享内存段,并将其映射到自己的地址空间。
  3. 各个进程可以直接对映射的共享内存进行读写操作,实现数据交换,
  4. 为了保证多个进程对共享内存的访问是同步的,通常会结合信号量等同步机制来实现。

管道:单向数据流,适合用于父子进程间的通信。

用C++写一个单例类

编写一个单例类(Singleton)在C++中非常常见,单例模式确保一个类中只有一个实例,并提供一个全局访问点。

class Sigleton{
private:
	//私有构造函数,防止直接实例化
	Singleton(){
		std::cout << "Singleton istance created." << std::endl;
	}

	//防止拷贝构造和赋值操作
	Singleton(const Sigleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;

public:
	//获取单例实例的静态方法
	static Sigleton& getInstance(){
		static Singleton istance;
		return instance;
	}

	void doSomething(){
		std::cout << "Doing something with the Singleton instance." << std::endl;
	}
};

int main(){
	// 获取单例实例,并调用其方法
    Singleton& instance = Singleton::getInstance();
    instance.doSomething();

    // 再次获取单例实例,验证是否是同一个对象
    Singleton& anotherInstance = Singleton::getInstance();
    anotherInstance.doSomething();
}

C++中重载与覆盖的区别

重载
在同一个作用域内,多个函数具有相同的名字,但是参数列表不同(参数的个数、类型或顺序不同)。
通过不同的参数列表来实现功能的重用。
编译器根据函数调用时的实参列表来选择合适的函数。

覆盖
在继承体系中,子类重新定义了基类中的虚函数,函数名、参数列表和返回值类型都相同。

实现多态性,根据对象的实际类型来调用不同的函数。
基类中的函数必须声明为虚函数(virtual),子类中重写该函数。

  • 作用域:重载在相同作用域。覆盖在不同作用域(基类和子类)。
  • 函数名:都相同。
  • 参数列表:重载不同,覆盖相同。
  • 返回值:重载可以不同,覆盖相同。
  • 覆盖实现多态性。
  • 重载是编译时确定,覆盖是运行时确定。

全局变量和局部变量在内存中的区别

存储位置

  • 全局变量:通常存储在全局数据区(静态存储区)。这区域在程序编译时就分配了内存,直到程序结束后才释放。
  • 局部变量:存储在栈区。当函数被调用时,栈会为局部变量分配内存;当函数执行完毕后,这些内存会释放。

生命周期

  • 全局变量:从程序运行开始到程序结束,整个生命周期都存在于内存中。
  • 局部变量:只在函数或代码块执行时存在。当函数执行结束或代码块退出后,局部变量的内存会释放。

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

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

相关文章

VS2017+QT不能正常添加资源文件

is not in a subdirectory of the resource file.You now have the option to copy this file to a valid location. . 该错误原因是项目路径英文导致的&#xff0c;换成全中文路径就没问题了 具体步骤&#xff1a; 双击qrc文件&#xff0c;先添加前缀&#xff0c;然后添加图片…

机器学习之监督学习(一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 机器学习之监督学习&#xff08;一&#xff09; 1.监督学习定义2.监督学习分类2.1回归 regression2.2 分类 classification 3.线性回归 linear regression3.1 单特征线性回归…

Android 突破边界:解密google Partner机制获取Resource

在 Android 应用开发中&#xff0c;除了可以查找系统中的特定 APK 并获取其信息外&#xff0c;还可以通过 Partner 机制获取 Partner APK 的资源文件&#xff0c;同时这种机制也是一种跨进程的通信方式。本文将进一步探讨这些内容。 1.Partner apk注册特定的action广播 /** M…

Windows上编译GTest并执行测试用例

目录 0 背景1 环境2 生成GTest动态库2.1 下载最新GTest库2.2 编译GTest2.2.1 cmake gtest2.2.1.1 遇到问题&#xff1a;target参数不对2.2.1.2 遇到问题&#xff1a;xxx thread 编译报错 2.2.2 用VS2015编译依赖库 3 依赖库部署3.1 遇到问题 4 编写测试用例5 效果展示 0 背景 …

python中列表的复制亦有区别

python中 对列表的复制可以直接新变量名字等于原有列表名字&#xff0c;或者 创建新的列表从原有列表一个个复制进来。他们的区别在于下面 两个图中&#xff1a;

Codeforces 1304C - Air Conditioner(1500)

Air Conditioner 题面翻译 一个餐馆中有个空调&#xff0c;每分钟可以选择上调 1 1 1 个单位的温度或下调 1 1 1 个单位的温度&#xff0c;当然你也可以选择不变&#xff0c;初始的温度为 m m m 。 有 n n n 个食客&#xff0c;每个食客会在 t i t_i ti​ 时间点到达&am…

【maven】阿里云仓库配置

阿里云公共仓库的配置看起来有多种类型的仓库: 配置指南 我的maven是idea 自带的:D:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\plugins\maven\lib\maven3\</

突破编程 C++ 设计模式(组合模式)详尽攻略

在软件开发中&#xff0c;设计模式为程序员提供了解决特定问题的最佳实践。设计模式不仅提高了代码的可复用性和可维护性&#xff0c;还能帮助团队更好地进行协作。在这篇文章中&#xff0c;我们将深入探讨组合模式——一种结构型设计模式。 组合模式允许你将对象组合成树形结…

哪里能免费申请IP SSL证书

一、选择可信赖的证书颁发机构 首先&#xff0c;需要选择一个可信赖的证书颁发机构&#xff08;CA&#xff09;。知名的CA机构如JoySSL、Symantec、GlobalSign等提供IP SSL证书服务。这些机构能够提供符合国际标准的SSL证书&#xff0c;确保数据传输的安全性和服务器的身份验证…

Docker 安装 SqlServer

摘要&#xff1a;我们工作当中经常需要拉取多个数据库实例出来做集群&#xff0c;做测试也好&#xff0c;通过 Docker 拉取 SqlServer 镜像&#xff0c;再通过镜像运行多个容器&#xff0c;几分钟就可以创建多个实例&#xff0c;效率是相当的高。 1. docker 拉取镜像 注意&am…

C++与OpenCV联袂打造:智能视觉识别技术的实践与探索

C与OpenCV联袂打造&#xff1a;智能视觉识别技术的实践与探索 1. 环境设置与准备工作1.1 安装OpenCV和配置开发环境1.1.1 下载OpenCV1.1.2 安装OpenCVWindows系统Linux系统 1.1.3 配置OpenCV库 1.2 C编译器的选择与配置1.2.1 Windows系统1.2.2 Linux系统1.2.3 编译器配置 1.3 选…

浏览器中的开源SQL可视化工具:sqliteviz

sqliteviz&#xff1a; 在浏览器中&#xff0c;即刻开启数据可视化之旅。- 精选真开源&#xff0c;释放新价值。 概览 sqliteviz是一个专为数据可视化而设计的单页离线优先PWA&#xff0c;它利用了现代浏览器技术&#xff0c;让用户无需安装任何软件即可在本地浏览器中进行SQL…

助力外骨骼机器人动力学分析

目录 一、动力学分析 二、拉格朗日方程 三、参考文献 一、动力学分析 动力学是考虑引起运动所需要的力&#xff0c;使执行器作用的力矩或施加在操作臂上的外力使操作臂按照这个动力学方程运动。 目前机器人动力学分析中主要采用牛顿-欧拉动力学方程和拉格朗日动力学方程 […

Leetcode面试经典150题-13.罗马数字转整数

解法都在代码里&#xff0c;不懂就留言或者私信&#xff0c;这个是相对简单点的&#xff0c;感觉会在低职级面试的时候考 class Solution {/**罗马数字转整数还是比较简单的&#xff0c;基本思路&#xff1a;把罗马数字字符串转成字符数组同时创建一个int型数组&#xff0c;遍…

直线公理使初等数学一直将各异直线误为同一线 ——数集相等定义凸显初数一直将各异假R误为R

黄小宁&#xff08;通讯&#xff1a;广州市华南师大南区9-303 510631&#xff09; [摘要]任何图≌自己这一几何最起码常识凸显初等数学一直将无穷多各异直线&#xff08;平面&#xff09;误为同一线&#xff08;面&#xff09;。数集相等的定义凸显&#xff1a;初数应有几何起码…

linux文件——文件系统——文件系统深度理解、学习inode

前言&#xff1a;本篇内容讲解文件系统的细节问题。 在本篇内容中&#xff0c; 我们在学习文件系统的过程中&#xff0c; 我们可以理解inode的原理&#xff0c; 理解如何在文件系统的概念下新建文件&#xff0c; 删除文件&#xff0c; 查找文件&#xff0c; 修改文件等等问题。…

商圣集团:数字创新,引领智慧生活新篇章

在全球化经济不断演进的大潮中&#xff0c;数字经济已成为推动社会进步的关键引擎&#xff0c;重塑着我们的生产与生活模式。商圣集团&#xff0c;以服务社会、创新驱动为核心价值观&#xff0c;致力于利用数字化技术&#xff0c;为个人和企业带来高效、便捷的服务体验&#xf…

【高阶数据结构】秘法(一)——并查集:探索如何高效地管理集合

前言&#xff1a; 前面我们已经学习了简单的数据结构&#xff0c;包括栈与队列、二叉树、红黑树等等&#xff0c;今天我们继续数据结构的学习&#xff0c;但是难度上会逐渐增大&#xff0c;在高阶数据结构中我们要学习的重点是图等 目录 一、并查集的原理 二、并查集的基本操作…

嘉兴银行业绩上涨却市值下滑,新任行长背后的辛酸

撰稿|芋圆 2024年3月6日&#xff0c;秦山核电有限公司&#xff08;以下简称“泰山核电”&#xff09;在上海联合产权交易所转让其所持有的嘉兴银行股份有限公司&#xff08;下称“嘉兴银行”&#xff09;的全部股份630万股的&#xff0c;占嘉兴银行总股本的0.3272%&#xff0c…

【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、类的概念及定义 1. 类的定义格式 2. 访问限定符 二、类域 三、类的实例化--对象 1. 实例化的概念 2. 对象的内存大小 四、this指针 …