- 博客(74)
- 收藏
- 关注
原创 笔试面试——逻辑题
小明走进房间,发现所有灯全熄着,;3. S先生,P先生,Q先生他们知道桌子的抽屉里面有16张扑克牌,红桃A,Q,4 , 黑桃 J,8,4,2,7,3 草花 K,Q,5,4,6 方块 A,5。活动内容除了吃喝玩之外。8.1,3,9,10,经过(1+10)*3-9即可等于24,那么,1,7,8,8,10如何利用+-*/等于24____________________.。8. 套马,有25匹马,每次只能5匹马进行比赛,比赛只能得到5匹马之间的快慢程度,而不是速度,请问,最少要比几次,才能获得最快的前5匹马()
2025-02-12 19:21:20
432
原创 C++习题1——24、30—
这是不正确的,因为友元函数不是类的成员,这种改动会改变类的接口,导致二进制不兼容__declspec(dllexport) 是Microsoft Visual C++中的一个特定于编译器的扩展,它用于在编译时指示编译器,随后的声明或定义应该被导出,使其在生成的动态链接库(DLL)中对外部可见。是错误的,因为它的语法不正确。所以输出为(1)temp的无参构造(5)类型转换,形参的有参构造(2)返回值(临时对象)的拷贝构造(4)形参的回收(3)临时对象给temp赋值(4)临时对象的回收(4)temp的回收。
2025-02-12 19:14:12
718
原创 C++习题1——1—11
7、两个互相独立的类classA和classB,都各自定义了非静态的公有成员函数PublicFunc()和非静态的私有成员函数PrivateFunc();D正确 多继承:一个子类存在多个父类,子类同时含有多个父类的特性,子类可能存在多个虚表,派生类自己的虚函数会被添加到第一个直接基类的虚表中。B 父类指针指向子类对象,如果是虚函数,就是子类的,不是,就是父类的。A)类中的成员默认是private的,但是可以声明为public。成员函数在A类里,因此A类里的都可以用,B类里的只能用公有的。
2025-02-11 20:55:45
786
原创 C语言面试题1——1—20
strcpy(a,b),如果b的长度大于a能存的空间长度,就会溢出,也就是这个函数没有识别目标缓冲区长度的功能。大小端避免方式:识别大小端是否一致,写判断大小端的函数,如果大小端不一致,写一个转换大小端的函数,进行转换。如果在外面定义一个全局整型变量g_val,想在main中再定义一个,先使用{},int+变量名再次定义。(3)使用do{ }while(0);PFUN为指向函数的指针类型的新名称,PFUN为int(*) (int,int)的别名。
2025-02-10 16:10:20
893
原创 Leetcode——链表:143.重排链表
设置循环处理全部链表中的节点,将当前元素的后继改为原链表的前驱(此时当前元素与原链表的后继断开,造成后继链表中全部节点丢失)更新三个变量,处理下一个节点,将当前元素变为prev,将next改为当前元素,将next向后移动一个节点。找到中间位置,将后半部分的链表翻转,得到新链表,将后半部分链表的节点交替插入原链表。先将第二个链表的头节点插入第一个链表中,尾向后移动,第二个链表的头节点向后移动。当移动到最后一个元素时,把当前节点直接插入到原链表的头,更新并返回新链表的头。传出值:后半部分链表的头节点。
2025-01-17 16:06:48
686
原创 数据结构与算法——1202—排序&&递归
如果有序元素比当前保存的元素大,那么说明当前保存的元素应该再向前比较,有序元素应该向后移动一个,再重复当前步骤。如果遍历有序元素的下标到达-1的位置上,应该把当前元素放在有序元素数组下标为0的位置上。(2)从右向左遍历有序数组,比较有序元素和当前元素的大小关系。插入排序是一个元素从无序数组向有序数组中插入的过程。4、计算结果会沿着原路依次返回。如果有序元素小,此次遍历结束。1、解决方案完全相同。3、必须有明确的终点。
2024-12-06 15:07:34
254
原创 Linux高阶——1124—
在服务器程序中,我们对网络IO的处理应该是分离的,具备一定的顺序逻辑,过程。2、开始监听(Select or Poll or Epoll)3、监听就绪,监听到sock有数据可读,或者有连接待处理’4、处理就绪,读写sock,或者三次握手。1、准备监听(IN、OUT、ERR)5、处理完毕,数据读取完毕,连接成功。1、多路IO转接技术。
2024-11-30 16:04:34
311
原创 Linux高阶——1124—多进程多任务&&多线程多任务&&多路IO转接技术
首先是稳定性问题,多进程模式较为稳定,某个进程异常退出与其他进程无关,但是多线程中,如果某个线程异常可能会导致进程退出。但当前的单进程和多进程均为主动处理IO,但这种主动方法不合理,当sock无事件时,不应该主动读取,浪费开销。等问题,在一些用户级线程下,线程无法得到时间片,所以在并发模型选择时要仔细斟酌,而后选择多进程亦或多线程。多线程模型,可以在内存调度开销更小的情况下,完成并发任务,提高CPU使用率,加快执行效率。代码层面与多进程也比较相似,当用户递达,为客户端创建处理线程,处理线程随客户端持续。
2024-11-29 20:47:21
334
原创 Linux高阶——1123—单进程多任务&&多进程多任务(阻塞IO)服务器
为了让服务端有更好的处理能力,单进程无法满足需求,所以要提升处理单元的数量,为每个客户端分配一个处理单元(Process),让客户端与处理单元绑定,有一个比较好的处理效果避免阻塞冲突,因为每个处理进程都会分配一个客户端,相互之间没有影响。
2024-11-24 14:48:50
352
原创 数据结构与算法——1122—复杂度总结&&检测相同元素
1、复杂度与其具体的常系数无关(即:常数项的系数不要)2、多项式级复杂度相加的时候,把其高项作为结果(即:多项式只保留最大项3、O(1)含义为:某个任务通过有限可数的资源即可完成注:有限可数与输入的数据量n无关——常量复杂度。
2024-11-23 21:35:20
493
原创 Linux高阶——1123—服务器基础&&服务器设备&&服务器基础能力
在CS架构下,client and server下,工程师研发服务器,经典的后端程序,为前端(客户端)提供数据处理支持、数据中转、数据持久化等功能,在互联网中,几乎所有的软件都需要服务器,作为服务器研发工程师,必须要了解服务器的运行模式,基本职责,掌握实现服务器能力。
2024-11-23 20:44:55
501
原创 Linux高阶——1117—TCP客户端&&服务端
ACCEPT(服务端socket,客户端的网络信息结构体,客户端网络信息结构体长度) ——客户端接收数据。BIND(需要绑定的socket,网络信息结构体的地址,网络信息结构体的长度)RECV(套接字sockfd,数据buf,数据长度size,选项,发送的长度)CONNECT(用于连接的socket,目标信息结构体,目标信息结构体长度)client_info——定义的结构体——包含port,ip,和创建的套接字。SEND(发送的人的sockfd,数据buf,数据包长度)成功后,可以直接使用。
2024-11-19 12:03:54
663
原创 Linux高阶——1116—SOCKET套接字基础
3、int sockfd,套接字描述符,后续用于数据传输,recv(int sock),send(sockfd),sendto(sockfd),recvfrom(sockfd)2、int sockfd,包含网络信息,默认下包含默认地址0.0.0.0与随机端口,因此sockfd创建后可以立即使用。1、在Linux操作系统中,sock为整型,也称int sockfd,sock描述符,后续网络通信都是用此描述符。套接字函数适用于各个语言和平台,除了API可以不同,其他概念理论或流程逻辑都相同。
2024-11-17 16:51:49
433
原创 Linux高阶——1116—环形队列&&生产者消费者
相比于线性队列,环形队列可以有效避免访问越界问题,使用下标访问队列元素时,到达末尾后下标归0,返回起始位置,使用下标运算即可array[5],下标为0、1、2、3、4,下标使用(index+1)%array_len计算环形队列构成:1、存储容器(数组)2、Front(头索引)——用于入队,向数组执行下标赋值3、Rear(尾索引)——用于出队,从数组中获取资源3、队列大小QUEUE_SIZE4、已用大小Size5、环形队列遍历依然采用环形遍历,尾追头。
2024-11-17 11:08:47
519
原创 C++——视频问题总结
1、C和C++的区别 C C++ 面向 过程 对象 注重 程序的实现逻辑 程序的整体设计 内容 C语言采用了一种有序的编程方法——结构化编程:将一个大型程序分解为一个个小型的,易于编写的模块,所有模块有序调动,形成了一个程序的完整的运行链 C++将问题分解为各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题中的行为,更注重程序的整体设计,方便程序的后期维护、优化和管理,让一个功能尽可能的通用。应对需求的变化,本意是
2024-11-14 21:42:11
534
原创 Linux高阶——1110—死锁问题&&原子访问&&线程控制与调度线程同步
与互斥锁高度相似,一个线程占用资源后,其他线程无法访问如果是互斥锁会陷入阻塞(放弃cpu)等待,但是自旋锁不阻塞(不放弃cpu),重复申请,直到获取锁为止一般使用旋转锁时,线程是运行态的旋转锁的优势:线程使用锁的效率好,一些快速响应的场景比较适合使用旋转锁,但是线程开销比较大,持续占用cpu。
2024-11-13 18:49:30
2014
原创 Linux高阶——1110—线程安全问题&&解决方法
同步过程:发起调用,调用者需要等待被调用者的结果异步过程:发起调用,无需等待被调用的结果,当有结果后,此结果传出,无需主动获取阻塞和非阻塞:发起到产生结果,中间的等待过程阻塞:放弃cpu非阻塞:不放弃cpu。
2024-11-12 21:22:54
668
原创 Linux高阶——1109—线程函数&&线程属性&&线程分类
pthread_cancel(pthread_t tid)——传入目标线程tid,杀死取消线程如果目标线程没有系统调用事件,那么此线程无法被取消如果目标线程回收到-1,表示该线程是被cancel杀死的线程返回值不允许为-1,保留给cancel。
2024-11-12 19:00:32
1132
原创 Linux高阶——1109—线程概念&&线程函数
进程是最小的分配资源单位,线程是最小的调度单位1、进程与线程是包含的关系,一般情况下进程包含线程,各个线程间独立,拥有独立的代码与任务2、进程中分为主控线程和普通线程,主控线程是进程自带的默认的执行单元,普通线程都是后续创建的3、蜕变概念,如果线程中只有一个调度单元,独占资源,我们只关注进程但是如果某一刻,很多调度单位同时共享资源,我们关注线程4、每个进程都有PCB,线程有TCB,每个线程有独立的id5、主控线程——pid==LWP6、进程自带主控线程,后续主线程可以创建普通线程。
2024-11-09 13:16:13
485
原创 Linux高阶——1103—修改屏蔽字&&信号到达及处理流程&&时序竞态问题
sleep是系统函数,会触发系统调用,到内核层,在内核层处理信号后,再去调用pause时,因为信号被处理掉了,因此pause函数不会运行,会被挂起。函数中不包含全局变量和静态资源的使用,并且不访问共享资源,只使用临时或局部变量,这种函数是安全的,称为可重入资源。一般情况下,带有信号捕捉的进程,永远是main函数先执行,但是执行过程触发信号,永远是捕捉函数先一步执行完毕。——执行立即挂起,察觉信号唤醒,接触屏蔽字。系统到内核层,不能直接先处理信号,需要先处理上切的原因,如中断异常等,完成后才能处理信号。
2024-11-04 21:33:51
723
原创 Linux高阶——1103——Signal信号机制
处理动作:自定义动作捕捉函数捕捉函数需要开发者自行定义与实现,但是只有信号触发抵达进程,系统自动调用行为1中的忽略动作与行为2的忽略行为相比,结果一致,但是优先级不同,行为的优先级比动作高每个信号拥有自己的信号行为结构体,struct sigaction,自己定义修改结构体,对进程原有的结构体进行替换,因为所有默认信号行为结构体中的行为都是默认的。
2024-11-04 16:32:09
750
原创 Linux高阶——1102—创建多进程拷贝程序
并发程序开发,大多数时候并发程序相比传统的单进程,执行速度更快,更合理利用资源,效率更好,所以必须了解掌握并发应用开发1、如果一个执行单元得到的cpu越多,那它完成任务的时间越短,多进程可以获得更多的时间片缩减任务完成速度2、如果是多进程程序,当某个进程因为阻塞挂起放弃时间片,就近原则,会转移到相邻进程,提高cpu使用效率。
2024-11-04 14:41:31
791
原创 Linux高阶——1027—实现守护进程&&实现守护进程的开机启动
守护进程是孤儿进程,但是是工程师人为创建的孤儿进程,低开销模式运行,对系统没有压力将STDERROR重定向到文件中,避免屏幕抛出异常信息,避免在使用前台时,后台的守护进程输出到屏幕上需要把标准出错也要关闭,STDERR_FILENO,标准出错指的是,当使用open函数打开一个不存在文件时,会在终端上显示出来的错误重定向函数dup和dup2错误信息会通过STDERR_FILENO将异常抛出到显示器上,因此需要将错误信息重定向,不使用STDERR_FILENO流,而使用输出错误文件的文件描述符fd流。
2024-11-03 21:18:51
1288
原创 Linux高阶——1026—验证内存映射&&mmap函数使用
先创建一个映射文件,写入数据分为四个步骤1、打开映射文件设文件描述符,使用open函数获取文件大小,作为映射大小2、进行共享映射3、映射成功,关闭描述符close(fd);4、修改映射内存munmap释放映射的函数。
2024-10-31 14:16:11
689
原创 Linux——1026—进程间通信技术&&管道&&内存映射
有四个文件描述符指向管道,父进程的fds[0]和fds[1],以及子进程的fds[0]和fds[1],因此管道的引用计数为4,每close一次,引用计数会-1,直到引用计数为0时,系统会自动释放管道空间。第一次读端向管道内部写入3000,管道内容量变为1069,如果读端一直未读,下一次写端想要再次写入3000时,不能成功,系统会将写端强制挂起,等管道内容量>要写入数量时,唤醒写端。一个线程读取就可以,其他线程不会等待读取,避免多个线程同时阻塞,保留单个线程读取,其他线程执行其他任务,节省开销,提高效率。
2024-10-28 21:17:54
865
原创 Linux高阶——1020—计算进程数题&&僵尸进程的回收
进程结束以后,系统会把用户层所有的数据全部清空释放,内核层会把除PCB以外的数据释放掉,PCB的残留可能造成内存泄漏。调用第一行的fork,调用第二行的三个,和最后一行的一个fork,创建出4个进程。调用第二行第一个fork,调用第二行后两个和第三行的fork,创建出3个进程。调用第二行第二个fork,调用第二行第三个和第三行的fork,创建出2个进程。调用第二行第三个fork,调用第三行fork,创建出1个进程。2、僵尸进程占用PCB,影响创建进程的数量,影响进程创建。2、父进程是子进程的责任人。
2024-10-25 21:07:53
294
原创 Linux高阶——1020—进程状态&&进程原语
就绪态只能向运行态和终止态转化,不可以转化为其他状态。挂起和阻塞可以转化为就绪态,不可以直接转化为运行态。就绪和运行可以相互转化,相差的是时间片。父进程调用fork,创建一个子进程。运行态可以转化为任意一种其余状态。fork函数返回值为pid_t。任何状态都可以转化为终止。
2024-10-25 21:06:27
425
原创 Linux高阶——1019——进程基础
软件工程师一般使用高级语言进行软件开发客户端一般为前端,服务器研发为后端,但此时编写出来的一般均为程序当的运行起来时,将会变为的,程序是进程的前置状态程序占用磁盘空间,进程占用资源较多:内存、cpu、磁盘...如果程序执行后出现的进程对程序文件没有依赖,可以删除程序文件,删除后不影响进程执行。
2024-10-22 21:20:27
398
原创 Leetcode——数组:螺旋矩阵&59.螺旋矩阵
对于每层,从左上方开始以顺时针的顺序填入所有元素。假设当前层的左上角位于 (top,left),右下角位于 (bottom,right),按照如下顺序填入当前层的元素。从左到右填入上侧元素,依次为 (top,left) 到 (top,right)。从上到下填入右侧元素,依次为 (top+1,right) 到 (bottom,right)。
2024-10-16 21:18:55
611
1
原创 Linux高阶——1013—正则表达式练习
问号放在+或者*后面,表示切换成非贪婪模式[^>]表示非右尖括号的都能匹配,直到找到href="为止[^"]表示向右匹配,到"为止因此,三个都能匹配。
2024-10-16 20:50:12
214
原创 Leetcode——数组:滑动窗口&209.长度最小的子数组
当找到可行解后,对其进行优化,本题优化方式为将左边界向右移动,使滑动窗口内的数字个数减小,直到不符合条件为止。先将滑动窗口的长度设置为0,先将左侧固定,右边界向右移动,同时计算需要找的条件,直到找到可行解为止。当需要查找数组中某些连续的数字之和,适合使用滑动窗口。最后,将优化后的最优解返回,作为结果返回。
2024-10-15 21:00:26
602
原创 第四次论文问题知识点及问题
罚函数是一种在求解最优化问题(包括线性约束优化和非线性约束优化)时使用的技术。它通过在原有目标函数中加入一个障碍函数,形成一个增广目标函数。罚函数的主要功能是对非可行点或企图逃离可行域的点赋予一个极大的值,从而将有约束的最优化问题转化为无约束的最优化问题。罚因子(或罚参数)在罚函数中起到惩罚作用,确保解满足约束条件。
2024-10-11 20:41:32
1145
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人