嵌入式面试笔试刷题(day14)

news2024/12/26 2:44:20

文章目录

  • 前言
  • 一、进程控制块
    • 1.PCB控制块的作用
    • 2.PCB的存储位置
  • 二、进程的三级映射
  • 三、return , exit, pthread_exit
  • 四、pthread_join作用
  • 五、互斥锁和信号量的区别
  • 六、怎么判断链表是否有环
  • 总结


前言

本篇文章继续我们的刷题之路。

一、进程控制块

这里只讲解进程的PCB控制块,线程的TCP控制块作用和进程PCB控制块作用类似。

1.PCB控制块的作用

进程控制块(Process Control Block,PCB)是操作系统中用于管理和跟踪进程信息的数据结构。每个进程在操作系统中都有一个对应的 PCB,它存储了与进程执行和管理相关的各种信息。PCB 在进程的创建、切换和终止等操作中起着重要的作用。

PCB 通常包含以下信息:

1.进程标识符(Process ID,PID):用于唯一标识一个进程。

2.进程状态(Process Status):表示进程当前的执行状态,例如运行、就绪、阻塞等。

3.寄存器内容(Register Context):保存进程的寄存器状态,包括程序计数器(PC)、堆栈指针(SP)等。当进程切换时,这些寄存器的状态会被保存到 PCB 中,以便在切换回来时进行恢复。

4.进程优先级(Process Priority):用于调度和确定进程的执行顺序。

5.程序计数器(Program Counter,PC):记录下一条要执行的指令的地址。

6.内存管理信息:包括进程的地址空间、页表、分配的物理内存等。

7.文件描述符表(File Descriptor Table):记录进程打开的文件和网络连接的信息。

8.资源使用信息(Resource Usage):统计进程使用的 CPU 时间、内存、文件描述符等资源的使用情况。

9.父子关系和进程关系(Process Relationships):记录进程的父进程、子进程、兄弟进程等关系。

10.同步和通信信息(Synchronization and Communication):用于进程之间的同步和通信,如信号量、互斥锁、管道等。

PCB 是操作系统在进程创建时分配的数据结构,用于存储和管理进程的各种状态和信息。当操作系统进行进程切换时,它会保存当前进程的状态到其对应的 PCB 中,然后加载下一个进程的 PCB,从而实现进程之间的切换和调度。

PCB 在保证进程状态的正确性和执行的顺序上起着关键的作用,操作系统通过维护和管理 PCB 来实现进程的调度、资源分配和进程通信等功能,从而提供了一个稳定和可靠的多任务环境。

2.PCB的存储位置

PCB 被存储在内核的内存空间中,而不是进程的用户空间。这是为了确保 PCB 的安全性和可靠性,避免进程对其进行非法访问或篡改。

二、进程的三级映射

在操作系统中,进程的三级映射(Three-level Page Table Mapping)是一种虚拟内存管理技术,通过使用多级页表来实现大规模的内存映射。它是现代操作系统中常见的内存管理方案之一。

传统的两级页表结构由一个单一的页表来管理虚拟地址到物理地址的映射关系。然而,当系统的物理内存非常大时,这种单级页表会占据较大的内存空间,并且遍历页表以查找映射关系的时间也较长。为了解决这些问题,引入了三级页表。

三级页表的结构由三个层次的页表构成,每个层次都有一个页表。其中,每个页表通过索引来决定下一个页表的地址,从而实现逐级查找的快速内存映射。

具体来说,三级页表的结构如下:

1.顶级页表(PML4,Page Map Level 4):顶级页表是三级页表的最高级别,在这一级别上进行虚拟地址到物理地址的映射。顶级页表结构包含了多个页表项,每个页表项指向下一级的页目录表。

2.页目录表(PDPT,Page Directory Pointer Table):页目录表是三级页表的中间级别,包含了多个页目录项。每个页目录项指向下一级的页表。

3.页表(PD,Page Directory):页表是三级页表的最低级别,包含了多个页表项。每个页表项最终映射到物理页面。

通过三级页表,系统可以将大型的虚拟地址空间分割成更小的块进行管理。只有在需要的情况下,才会加载或创建实际的页表项和物理页面,从而实现了懒加载和按需分配的内存管理机制。这样可以节省内存空间,并提高内存访问的效率。

总结起来,进程的三级映射是一种虚拟内存管理技术,通过三层级联的页表结构实现了大规模的内存映射。它提供了更灵活的内存管理和更高效的映射查找,适用于大型内存系统和需要管理大量虚拟地址空间的场景。

在这里插入图片描述

三、return , exit, pthread_exit

1.return : 返回调用者

2.exit : 退出进程

3.pthread_exit : 退出线程

四、pthread_join作用

使用pthread_join()函数等待子线程的结束,并且释放包括堆栈空间和其他系统资源。

五、互斥锁和信号量的区别

旋锁(Spin Lock)和信号量(Semaphore)是同步机制中常用的两种方式,它们有以下区别:

1.工作方式:自旋锁是一种忙等待的方式。当一个线程尝试获取自旋锁时,如果锁已被其他线程占用,该线程会一直循环检查锁的状态,直到锁可用。这种方式适用于锁的占用时间很短暂的情况。信号量是一种阻塞机制。当一个线程尝试获取信号量时,如果信号量计数为0,则线程会被阻塞,在计数不为0时才能继续执行。

2.CPU占用:自旋锁在获取锁失败时会进行忙等待,持有锁的线程可能长时间不释放锁,导致等待线程一直在循环检查,占用CPU资源。而信号量使用阻塞机制,等待线程会被挂起,不占用CPU资源,直到信号量可用才会被唤醒。

3.同步范围:自旋锁主要用于对临界区的保护,即一小段代码或一段操作。线程在进入临界区前先获取自旋锁,退出临界区后释放自旋锁。信号量可以用于限制资源的访问数目,可以对多个临界区进行保护,线程在资源可用时获取信号量,使用资源后释放信号量。

4.适用场景:自旋锁适用于锁的占用时间短暂、锁冲突的概率低、并发程度高的情况。当临界区的执行时间相对较短,忙等待的开销可以接受时,自旋锁是一个有效的选择。信号量适用于锁的占用时间较长、锁冲突概率高、并发程度低的情况。当临界区的执行时间较长或者需要限制资源的并发访问时,阻塞等待的方式可以有效避免忙等待造成的资源浪费。

六、怎么判断链表是否有环

1.创建两个指针,一个指针称为快指针(fast),另一个指针称为慢指针(slow),初始时都指向链表的头节点。

2.快指针每次向前移动两个节点,慢指针每次向前移动一个节点。

3.如果链表中存在环,那么快指针和慢指针最终会相遇。

4.如果链表中不存在环,那么快指针最终会先到达链表尾部,此时可以判断链表无环。

#include <stdbool.h>

// 定义链表节点
struct ListNode {
    int val;
    struct ListNode* next;
};

bool hasCycle(struct ListNode* head) {
    if (head == NULL || head->next == NULL) {
        return false;  // 链表为空或只有一个节点,不可能有环
    }
    
    struct ListNode* slow = head;  // 慢指针
    struct ListNode* fast = head->next;  // 快指针
    
    while (fast != slow) {
        if (fast == NULL || fast->next == NULL) {
            return false;  // 快指针已经到达链表尾部,没有环
        }
        
        // 快指针每次移动两步,慢指针每次移动一步
        fast = fast->next->next;
        slow = slow->next;
    }
    
    return true;  // 快指针追上慢指针,存在环
}

总结

本篇文章就介绍到这里。

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

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

相关文章

北京APP外包开发需要注意的问题

开发APP的过程中&#xff0c;由于开发APP需要投入大量的时间、精力和资源&#xff0c;所以在开始前一定要做好充足的准备和规划。您需要注意以下重点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

3D路径,控件

1控件拖入画板&#xff1a; 2属性配置&#xff1a; 1轨迹颜色 2 3 4

本地环境安装了node.js,vscode运行js代码出现乱码

本地环境安装了node.js,vscode运行js代码出现乱码 问题描述—vscode运行js代码出现乱码 报错信息&#xff1a; 问题原因 node.js的下载安排了&#xff0c;环境变量vscode没有识别导致的乱码 解决方法 安装Node.js&#xff0c;软件会自动将其配置到环境变量中&#xff0c;然…

Kotlin inline、noinline、crossinline 深入解析

主要内容&#xff1a; inline 高价函数的原理分析Non-local returns noinlinecrossinline inline 如果有C语言基础的&#xff0c;inline 修饰一个函数表示该函数是一个内联函数。编译时&#xff0c;编译器会将内联函数的函数体拷贝到调用的地方。我们先看下在一个普通的 kot…

题目有点太简单了,不知道怎么选了

有个公司给了下面一个题目&#xff0c;看了下太简单了&#xff0c;都怕选错了。 后来拿着程序跑了下&#xff0c;就是这个意思嘛。 结论 程序跑出来的结果就是对输入的列表进行倒序排列。 public void testGetPut() throws Exception {List<Integer> numbers List.of(…

【基于交叉注意力的泛锐化深度展开迭代网络】

CADUI: Cross-Attention-Based Depth Unfolding Iteration Network for Pansharpening Remote Sensing Images &#xff08;CADUI&#xff1a;基于交叉注意力的泛锐化深度展开迭代网络&#xff09; 全色锐化是遥感成像系统获取高分辨率多光谱图像的重要技术。它主要通过融合低…

异或和大小比较类问题——抓住最高位:CF1863F

https://codeforces.com/contest/1863/problem/F 因为有等于&#xff0c;所以考虑异或和为0的合法区间&#xff0c;它可以随意切现在考虑切开后左边大于右边&#xff0c;可以发现左右边最高位可以互相抵消&#xff0c;似乎不太可做&#xff1f;此时可以换个考虑&#xff0c;考…

Jetpack业务架构—四件套(Lifecycle、ViewModel、LiveData、DataBinding)

Jetpack 是一个由多个库组成的套件&#xff0c;可帮助开发者遵循最佳做法、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码&#xff0c;让开发者可将精力集中于真正重要的编码工作。 Android Jetpack组件的优势&#xff1a; Jetpack推出的主要目的是为了能够…

【LeetCode75】第四十四题 省份数量

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个二维数组&#xff0c;表示城市之间的连通情况&#xff0c;连在一起的城市为一个省份&#xff0c;问我们一共有多少个省份。 这…

Python实现多子图绘制系统

文章目录 修改DrawTypeDrawType的调用逻辑绘图逻辑源代码 Python绘图系统&#xff1a; &#x1f4c8;从0开始的3D绘图系统&#x1f4c9;一个3D坐标系&#xff0c;多个函数图表类型和风格&#xff1a;&#x1f4c9;极坐标绘图&#x1f4ca;散点图和条形图&#x1f4ca;混合类型…

推进数据要素化,数据云为何是“加速器”?

数据要素化&#xff0c;一个世界性难题。 相比于传统生产要素&#xff0c;数据要素具有获得非竞争性、使用非排他性等独有特征&#xff0c;在流通、产权、安全和使用等方面需要法规制度与基础设施的双重保障。 我国无疑是最早探索数据要素化的国家之一。从早期成立的各种大数…

win10下的CLion控制台中文乱码终极解决方案

win10下的CLion控制台中文乱码终极解决方案 如果你也是&#xff0c;用Clion时候&#xff0c;CPP文件中有中文&#xff0c;然后终端运行会有乱码&#xff0c;改了设置发现&#xff0c;项目中的中文乱码了&#xff0c;但是终端又不乱码了&#xff0c;&#xff0c;&#xff0c;&am…

使用java代码给Excel加水印,保真,新鲜出炉

首先&#xff0c;往表格里贴透明图片&#xff0c;这个很智障&#xff0c;会严重干扰正常阅读和操作 设置文件背景图&#xff1b; 其次&#xff0c;其实就是给excel加一个背景图&#xff0c;但是问题就麻烦在java中基本没有这么干过的&#xff0c;可用方案很少&#xff0c;有spi…

基于java+springboot+vue的置换网站-lw

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql Webstorm Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; ssm mybatis Maven mysql5.7或8.0等等组成&#xff0c;B/S模式 Maven管理等等。 环境需要 1.…

Java-HashMap中put()方法是如何实现的,内含详细流程图

文章目录 Java中的HashMap什么是HashMap&#xff1f;对比其他Map中put()方法HashMap中put()方法使用示例 HashMap中put()源码解析手绘流程图实现原理源码探究&#xff08;JDK 1.8&#xff09; 设计put()的意义总结 Java中的HashMap 什么是HashMap&#xff1f; HashMap是Java中…

ARP欺骗

ARP欺骗定义 ARP欺骗&#xff08;英语&#xff1a;ARP spoofing&#xff09;&#xff0c;又称ARP毒化&#xff08;ARP poisoning&#xff0c;网络上多译为ARP病毒&#xff09;或ARP攻击&#xff0c;是针对以太网地址解析协议&#xff08;ARP&#xff09;的一种攻击技术&#x…

Qt —UDP通信QUdpSocket 简介 +案例

1. UDP通信概述 UDP是无连接、不可靠、面向数据报&#xff08;datagram&#xff09;的协议&#xff0c;可以应用于对可靠性要求不高的场合。与TCP通信不同&#xff0c;UDP通信无需预先建立持久的socket连接&#xff0c;UDP每次发送数据报都需要指定目标地址和端口。 QUdpSocket…

SpringCloudAlibaba Gateway(一)简单集成

SpringCloudAlibaba Gateway(一)简单集成 随着服务模块的增加&#xff0c;一定会产生多个接口地址&#xff0c;那么客户端调用多个接口只能使用多个地址&#xff0c;维护多个地址是很不方便的&#xff0c;这个时候就需要统一服务地址。同时也可以进行统一认证鉴权的需求。那么服…

vcs仿真教程(查看断言)

VCS是在linux下面用来进行仿真看波形的工具&#xff0c;类似于windows下面的modelsim以及questasim等工具&#xff0c;以及quartus、vivado仿真的操作。 1.vcs的基本指令 vcs的常见指令后缀 sim常见指令 2.使用vcs的实例 &#xff08;1&#xff09;新建文件夹&#xff1a; …

linux 开设端口

1&#xff0c;查看端口情况 firewall-cmd --list-all2&#xff0c;开设端口 firewall-cmd --zonepublic --add-port6379/tcp --permanent–zonepublic 表示作用域为公共的 –add-port6379/tcp 添加 tcp 协议的端口端口号为 6379 –permanent 永久生效&#xff0c;如果没有此参…