【内核】05.阻塞非阻塞同步异步+内存资源管控
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
阻塞非阻塞同步异步
同步(Synchronous)和异步(Asynchronous)的理解和区别讲解_异步和同步_默 语的博客-CSDN博客
56.阻塞非阻塞同步异步
为了使硬件性能最大化,摄像头,内存,网卡,LCD,flash,传感器,马达
-
一对一
-
一对多:阻塞非阻塞
-
多对一:同步互斥
-
多对多:
-
多核CPU
-
云端分布式处理
同步
【操作系统中,相互协调且有工作次序】
需要双方有个配合即为同步
环形缓冲区,读写速度相差不大时可同时进行
异步通知也是(信号,软件中断)
死锁,你要我的我要你的,卡住了
异步
进程发起后去干其他事了,设备去运作,数据放在存储区,进程需要的时候去取
阻塞
【并发是多个进程访问一个设备时】
【阻塞是在一个进程访问多个设备时】
等,等待队列,设备忙时先把任务放在等待队列中等着
一个设备一个等待队列,能用了的时候挨个让进程用,不要抢
非阻塞
不等,轮询,可放在系统调用中,scedule()睡眠,根据系统繁忙程度决定回来的时间,而不是放在应用层死循环浪费CPU资源,不想太浪费的话,自己给睡眠时间,给多给少都不合适。
异步通知(信号驱动IO)
设备不忙的时候主动通知进程
IO多路复用
POLL函数,在系统调用中的轮询,阻塞+非阻塞+异步通知,适合特别多设备的时候。
poll函数在系统调用中轮询多个设备(非阻塞),放等待队列中(阻塞),轮询完睡眠,有设备空闲后,发送异步通知,poll再启动轮询查看是哪个好了。
好处,不做无意义轮询浪费CPU资源。
内存资源管控
结合【C/C++部分内存分配】与【操作系统内存管理】一起看
- 缓冲缓存一般系统就弄好了
- DMA
- SWAP
- 内存池,频繁申请释放,CPU不断操作,浪费时间,单独划出一片区域让别人随便用就行
- 内存泄漏
- 环形缓存区,如摄像头写,网卡/LCD读,也就是生产者消费者问题,环形缓存区大小与读取速度有关,可以做到不用等
- 映射MMU
- mmap,不需要频繁从内核拷到应用,指向同一块内存区域就行
- 通过MMU,将内存和其他物理设备地址映射到应用层和内核层,页表将对应关系写在一起
- 应用层:代码段、数据段、堆、栈
- 内核层:静态映射、动态映射
- 内核直接映射,直接对应内存中的空间
- 内核动态映射,可以把硬件地址映射过来
- 共享内存,让两进程指向同一内存空间,进程与进程间传数据最高效的方式
- 文件内存映射,让两进程指向同一存储空间,可以是任意地方
共享内存和文件内存映射都属于内存共享机制,但它们的实现方式和应用场景有所不同。
共享内存是一种内存共享方式,通过申请一块共享内存区域,多个进程之间可以共享该内存区域中的数据,从而实现进程间的通信。共享内存通常用于大量数据交换场景,比如传输图像、音频等大文件数据。共享内存的优点是速度快、延迟低,但由于操作系统没有提供文件系统的保护机制,因此需要应用程序自行处理同步和互斥的问题。
文件内存映射是一种以文件为基础的内存共享方式,通过将文件映射到进程的虚拟内存空间中,实现对文件的读写操作,多个进程之间可以共享该内存映射区域。文件内存映射通常用于处理文件数据、数据库等应用场景。文件内存映射的优点是易于使用、具有强大的保护机制,可以使用标准文件操作函数进行读写操作,且不需要自行实现同步和互斥问题,但由于需要经过文件系统的逻辑处理,因此速度相对较慢。
两缓,DS池漏环MMs
58.malloc的系统调用是什么?
malloc背后的调用机制-malloc内存分配过程详解_malloc 系统调用_linux大本营的博客-CSDN博客
在malloc分配空间时是在Heap上分配的,实质上, Linux维护一个break指针,这个指针指向堆空间的某个地址。从堆起始地址到break之间的地址空间为映射好的,可以供进程访问;而从break往上,是未映射的地址空间,如果访问这段空间则程序会报错。
由上文知道,要增加一个进程实际的可用堆大小,就需要将break指针向高地址移动。Linux通过brk和sbrk系统调用操作break指针。两个系统调用的原型如下:
int brk(void *addr);
void *sbrk(intptr_t increment);
brk将break指针直接设置为某个地址,而sbrk将break从当前位置移动increment所指定的增量。brk在执行成功时返回0,否则返回-1并设置errno为ENOMEM;sbrk成功时返回break移动之前所指向的地址,否则返回(void *)-1。
59.什么是MMU?为什么需要MMU?
MMU(Memory Management Unit)是一种硬件设备,主要用于实现虚拟内存管理。它的作用是将进程所使用的虚拟地址转换成对应的物理地址,并进行内存保护。
在没有MMU的系统中,所有进程共享同一块物理内存,因此进程间需要通过约定好的内存地址来进行通信,容易导致地址冲突和安全问题。而有了MMU之后,每个进程都有自己的虚拟地址空间,不会互相干扰。MMU还可以根据进程的访问权限,对虚拟地址空间进行访问控制和内存保护。
此外,MMU还可以通过虚拟地址和物理地址的映射关系,实现了虚拟内存技术,使得进程能够访问大于物理内存的虚拟地址空间,从而提高了内存利用率和系统性能。
60.内存管理MMU的作用?
-
地址映射。
-
内存分配和回收。
-
内存保护。
-
内存扩充。
6 1.如何设置MMU的页表
设置 MMU 的页表需要以下步骤:
- 在内存中分配页表所需的空间;
- 将物理地址和虚拟地址映射关系写入页表项;
- 将页表的基地址写入页表寄存器中,使 MMU 生效。
62.Linux 系统中,VSS、RSS 和 PSS的区别
在 Linux 系统中,VSS、RSS 和 PSS 是进程内存使用的三种不同指标。
- VSS(Virtual Set Size)指的是进程的虚拟内存大小,即进程正在使用的虚拟地址空间的大小。它包括了进程的代码段、数据段、堆、栈以及共享库等。
- RSS(Resident Set Size)指的是进程占用的物理内存大小,即实际分配给进程的内存大小,包括共享库和页面文件等。
- PSS(Proportional Set Size)是 RSS 的一种变体,它是指进程占用的物理内存大小除以进程所共享的页面数。它考虑到了共享内存的情况,可以更准确地反映出进程的实际内存使用情况。
简单来说,VSS 是进程正在使用的虚拟内存大小,而 RSS 是进程实际占用的内存大小,而 PSS 则是将 RSS 考虑了共享内存后的更准确的内存使用情况指标。
63.零拷贝内存
传统上,当数据需要从一个内存区域复制到另一个内存区域时,通常会涉及数据的拷贝操作,这会消耗时间和资源。
零拷贝内存的核心思想是将数据在内存之间传输时,避免将数据拷贝,而是直接在内存中传递数据的引用或指针。
使用零拷贝内存技术可以提高数据传输的效率,减少了数据拷贝所需的CPU和内存资源消耗。这对于处理大量数据、高速网络传输、文件系统等场景非常有用。
在操作系统和编程领域中,有多种技术可以实现零拷贝内存。其中一种常见的方法是使用内核缓冲区或共享内存,通过在用户空间和内核空间之间共享同一块物理内存来避免数据拷贝。这样,数据可以直接从输入缓冲区传递到输出缓冲区,而无需复制。
用户/内核的堆和栈
64.什么是用户栈和内核栈?
用户栈和内核栈是同一个区域吗?有什么区别?
栈是一种后进先出的数据结构,用于存储程序执行时的局部变量、函数调用、中断处理等信息。分为用户栈和内核栈两种。
用户栈是用于存储用户进程运行时的栈数据的区域,是每个用户进程独立拥有的。用户程序运行时,其栈的操作都在用户栈上进行。
内核栈是操作系统内核运行时使用的栈,其目的是为内核提供一块独立的存储区域,避免与用户栈产生冲突。当一个进程发生中断或者异常时,处理器会自动切换到内核栈上运行中断处理程序,或系统调用处理程序的栈。内核栈的大小通常比用户栈要大,因为内核需要保存更多的状态信息。
内核栈和用户栈是完全独立的,它们的大小和使用方式也不同。
区别:主要在于它们的使用范围和特权级别不同。用户栈是进程的私有空间,只能被进程本身使用,处于用户态权限下;而内核栈则是内核的私有空间,只能被内核使用,处于内核态权限下。当发生中断或系统调用时,CPU会自动切换到内核态,并使用内核栈来存储中断或系统调用处理程序的相关信息。
65.用户栈和内核栈,为什么不能共用一个栈?
- 如果只用系统栈,系统栈一般大小有限,用户程序调用次数可能很多。如果中断有16个优先级,那么系统栈一般大小为15(只需保存15个低优先级中断,另一个高优先级中断在运行)用户程序调用次数很多,那样15次子程序调用以后的子程序的参数,返回值,局部变量就不能保存,用户程序也就不能正常运行。
- 保证系统的安全性和稳定性,如果只用用户栈,系统程序需
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇 4.嵌入式Linux【本专栏】 (建议PC端查看)