硬件
1.CPU、MPU、MCU、SOC联系与差别
Cpu是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶 段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。 CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码,并执行指令。所谓的计算机的可编程性主要是指对CPU的编程
MPU (Micro Processor Unit),叫微处理器,通常代表一个功能强大的CPU
MCU(Micro Control Unit),叫微控制器,是指随着大规模集成电路的出现及其发展,将计算机的 CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的芯片,MCU MPU 最主要的区别就是能否直接运行代码。MCU有内部的RAM ROM,而MPU是增强版的CPU,需要添加外部RAM ROM才可以运行代码。
SOC(System on Chip),指的是片上系统,MCU只是芯片级的芯片,而SOC是系统级的芯片,它既MCU(51,avr)那样有内置RAM,ROM同时又像MPU(arm)那样强大的,不单单是放简单的代码,可以放系统级的代码,也就是说可以运行操作系统(将就认为是MCU集成化与MPU强处理力各优点二合一)。
2.什么是交叉编译
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。
3.左值和右值是什么?
左值是指可以出现在等号左边的变量或表达式,它最重要的特点就是可写(可寻址)。也就是说,它的值可以被修改,如果一个变量或表达式的值不能被修改,那么它就不能作为左值。
右值是指只可以出现在等号右边的变量或表达式。它最重要的特点是可读。一般的使用场景都是把一个右值赋值给一个左值。通常,左值可以作为右值,但是右值不一定是左值。
Linux
进程
1.进程和线程有什么区别?
1、根本区别
进程是资源分配的基本单位,线程是程序执行的最小单位
2、资源开销
进程有自己独立地址空间(代码空间和数据空间),每启动一个进程,系统会为它分配地址空间。
线程没有自己独立的地址空间,线程共享进程中的数据,使用相同的地址空间。每个线程都有自己的堆栈。
线程切换的资源开销要比进程小。涉及频繁切换,就选择线程。
线程开销小,但是不利于进行资源包含;进程开销大,但是有利于资源保护。
3、关于通信
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。(ftok函数)
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
4、执行过程
进程是独立的任务执行单元,而线程是在进程内的任务执行单元。一个进程可以有多个线程,但一个线程只能属于一个进程
每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
2.何时使用多进程,何时使用多线程?
对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程
3.进程的几种状态?
关于IO:
用户程序进行IO的读写,会用到read&write两大系统调用。read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。
同步IO
是指用户空间线程是主动发起IO请求的一方,内核空间是被动接受方。
异步IO
是指内核kernel是主动发起IO请求的一方,用户线程是被动接受方。
4.进程间通信方式有哪些?有什么优缺点?
一、管道(Pipe)
-
优点:
-
易于实现和使用,适用于具有亲缘关系的进程之间的通信(如父子进程)。
-
-
缺点:
-
只能用于单向通信,无法进行双向通信。
-
局限于具有亲缘关系的进程间使用。
-
缓冲区有限,可能导致数据丢失或阻塞。
-
二、命名管道(Named Pipe)
-
优点:
-
可以在不具有亲缘关系的进程之间进行通信。
-
提供一个唯一的名称,可以在文件系统中进行访问。
-
-
缺点:
-
长期存于系统中,使用不当容易出错。
-
缓冲区有限,可能导致数据丢失或阻塞。
-
三、消息队列(Message Queue)
-
优点:
-
可以实现任意进程间的通信。
-
消息的接收和发送没有严格的先后顺序,支持异步处理。
-
可以通过系统调用函数来实现消息发送和接收之间的同步,无需考虑同步问题。
-
-
缺点:
-
信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。
-
消息类型比较单一,可能无法满足复杂的数据传输需求。
-
四、共享内存(Shared Memory)
-
优点:
-
速度最快,因为多个进程可以直接访问同一块物理内存。
-
可以进行大量数据的传输,无需复制数据。
-
-
缺点:
-
需要额外考虑同步机制,以避免数据竞争和不一致性问题。
-
同步问题可能导致程序复杂性和出错率的增加。
-
只能同一个计算机系统中的诸多进程共享,不方便网络通信。
-
五、信号量(Semaphore)
-
优点:
-
可以用于多个进程之间进行同步和互斥控制。
-
计数器机制可以有效地管理共享资源的访问。
-
-
缺点:
-
容易出现死锁问题,如果信号量的使用不当。
-
信号量有限,可能无法满足大量并发访问的需求。
-
六、套接字(Socket)
-
优点:
-
可以进行网络通信,适用于不同主机之间的进程通信。
-
传输数据为字节级,传输数据可自定义,数据量小效率高。
-
传输数据时间短,性能高。
-
适合于客户端和服务器端之间信息实时交互。
-
可以加密,数据安全性强。
-
-
缺点:
-
通信开销相对比较大,需要建立和维护网络连接。
-
需对传输的数据进行解析,转化成应用级的数据。
-
5.僵尸进程的危害?
浪费资源、降低系统性能,进程号枯竭:在进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号PID,退出状态,运行时间等)。直到父进程通过wait / waitpid 来取时才释放。 如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
6.如何清理僵尸进程?
当系统中出现了僵尸进程时,我们是无法通过 kill 命令把它清除掉的。但是我们可以杀死它的父进程, 让它变成孤儿进程,并进一步被系统中管理孤儿进程的进程收养并清理。
7.什么是堆,栈,内存泄漏和内存溢出?
堆(Heap)和栈(Stack)是计算机内存管理中的两个重要概念,而内存泄漏和内存溢出则是与内存管理相关的两个问题。
堆(Heap):堆是一种动态分配的内存区域,它由程序员分配和释放。堆的大小受系统限制,通常位于栈的顶部。在程序运行过程中,当需要分配大块内存时,可以通过调用malloc等函数从堆中分配。堆的优点是可以灵活地分配和释放内存,但需要注意的是,由于堆是动态分配的,可能会存在内存碎片和内存泄漏的问题。
栈(Stack):栈是一种静态分配的内存区域,它由系统自动分配和释放。栈的大小也受系统限制,通常位于内存的底部。在程序运行过程中,当需要分配局部变量或函数参数时,系统会自动从栈中分配内存。栈的优点是分配和释放内存的速度较快,但缺点是空间有限且大小固定,无法分配大块内存。
内存泄漏(Memory Leak):内存泄漏指的是程序中的某些代码由于某些原因未能释放已经不再需要的内存,导致内存无法被再次使用。这通常会导致程序运行过程中出现内存不足的情况,从而导致程序性能下降或崩溃。
内存溢出(Out of Memory):内存溢出指的是程序在运行过程中所需的内存超过了系统所能提供的内存大小。这通常会导致程序崩溃或出现不可预测的行为。为了解决内存溢出问题,程序员需要优化程序的内存使用,避免无谓的内存占用和泄漏。
8.堆和栈的区别
1) 申请方式不同:栈由系统分配和释放,存放函数的参数值、局部变量的值等;而堆需要程序员自己申请和释放,堆中的具体内容也由程序员自己安排;
2) 申请大小的限制:栈空间有限,栈是向下生长的一块连续的内存区域,栈顶的地址和栈的容量已经设定好了,若申请的空间大于栈的剩余空间,则会报栈溢出错误。堆是向上生长的不连续的内存区域,系统中使用链表来管理空闲的内存地址,堆的大小受限于计算机系统中有效的的虚拟内存(链表的遍历方向是由低地址向高地址,当系统收到程序的申请时,会遍历链表,寻找第一个空间大于所申请空间的堆节点,然后将节点从内存空闲节点链表中删除,并将该节点的空间分配给程序)。可见,堆的空间比较灵活,通常比栈的空间要大。
栈通常位于内存的底部,大小固定,而堆位于栈的顶部
3) 申请效率:栈由系统分配,效率较高,但程序员无法控制;相比之下堆的申请效率就比较低,而且容易产生内存碎片,但是用起来比较方便。
9.栈区放什么?栈区有多大?
栈区主要用于存储函数调用时的局部变量、函数形参以及返回地址等,linux下默认8M,可以用ulimit -s修改
网络
TCP、UDP的区别
TCP 有连接 一对一 有缓冲区 字节流 可靠 效率低 应答机制
UDP 无连接 一对多 无缓冲区 数据报 不可靠 效率高
3次握手的过程是怎么样的?
描述端口号的作用,概念,两边都有还是只有一边
端口号在网络通信的双方都存在。
TCP为啥安全可靠?
一、校验和
TCP在数据传输过程中,会对传输的数据进行校验和计算。这是通过将数据当作一个16位整数,把所有数据加起来(最前面的进位补到最后一位),然后取反得到的。
发送方和接收方都会进行校验和的计算与验证。如果接收方计算出的校验和与发送方的不一致,那么数据就被认为是传输有误的,接收方会丢弃这个TCP段,并可能请求重发。
二、序列号与确认应答
TCP给发送的每一个数据包分配一个序列号,接收方根据序列号对数据包进行排序,确保数据按序到达。
接收方在成功接收数据后,会返回一个确认应答(ACK),告知发送方已正确接收的数据序列号。这一机制确保了数据的完整性和传输的可靠性。
三、超时重传
当TCP发出一个数据包后,会启动一个定时器等待接收方的确认应答。
如果在定时器超时前未能收到确认应答,TCP会认为数据包已丢失或损坏,并重新发送该数据包。这一机制有效应对了数据包在网络传输过程中的丢失问题。
四、连接管理
TCP在数据传输之前会进行三次握手连接过程,确保双方都已准备好进行数据传输。
数据传输结束后,还会进行四次挥手断开连接过程,以节约系统资源并确保双方都已正确结束数据传输。
五、流量控制与拥塞控制
TCP使用滑动窗口协议实现流量控制,确保发送方不会发送超过接收方处理能力的数据。
拥塞控制则通过慢启动、拥塞避免、快重传和快恢复等算法,动态调整发送速率,避免网络拥塞。
六、面向连接的特性
TCP是一个面向连接的协议,这意味着在数据传输之前必须先建立连接。
这种面向连接的特性使得TCP能够提供更可靠的数据传输服务,因为它可以在连接建立阶段就进行一系列的参数协商和准备工作