嵌入式软件工程师面试题——2025校招社招通用(十七)

说明:

  • 面试群,群号: 228447240
  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!
  • 操作系统篇

1.请问如何修改文最大柄?

答案:
linux 默认最大文件句柄数是 1024 个,在 linux 服务器文件并发量比较大的情况下,系统会报"too many open files"的错误。故在 linux 服务器高并发调优时,往往需要预先调优 Linux参数,修改 Linux 最大文件句柄数。
有两种方法:
1.ulimit n<可以同时打开的文件数>,将当前进程的最大句柄数修改为指定的参数(注:该方法只针对当前进程有效,重新打开一个 shel1 或者重新开启一个进程,参数还是之前的值)

2.对所有进程都有效的方法,修改 Linux 系统参数
vi /etc/security/limits.conf 添加
soft nofile 65536
hard nofile 65536
将最大句柄数改为 65536,修改以后保存,注销当前用户,重新登录,修改后的参数就生效了

2.请你说一说操作系统中的页表寻址

答案:
页式内存管理,内存分成固定长度的一个个页片。操作系统为每一个进程维护了一个从虚拟地址到物理地址的映射关系的数据结构,叫页表,页表的内容就是该进程的虚拟地址到物理地址的一个映射。页表中的每一项都记录了这个页的基地址。通过页表,由逻辑地址的高位部分先找到逻辑地址对应的页基地址,再由页基地址偏移一定长度就得到最后的物理地址,偏移的长度由逻辑地址的低位部分决定。一般情况下,这个过程都可以由硬件完成,所以效率还是比较高的。页式内存管理的优点就是比较灵活,内存管理以较小的页为单位,方便内存换入换出和扩充地址空间。

3.请你说一说有了进程,为什么还要有线程?

答案:
线程产生的原因:
进程可以使多个程序能并发执行,以提高资源的利用率和系统的吞吐量;但是其具有一些缺点:

  • 进程在同一时间只能干一件事
  • 进程在执行的过程中如果阻塞,整个进程就会挂起,即使进程中有些工作不依赖于等待的资源,仍然不会执行。

因此,操作系统引入了比进程粒度更小的线程,作为并发执行的基本单位,从而减少程序在并发执行时所付出的时空开销,提高并发性。和进程相比,线程的优势如下:

  • 从资源上来讲,线程是一种非常"节俭"的多任务操作方式。在 linux 系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式,
  • 从切换效率上来讲,运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需时间也远远小于进程间切换所需要的时间。据统计,一个进程的开销大约是一个线程开销的 30 倍左右。

除以上优点外,多线程程序作为一种多任务、并发的工作方式,还有如下优点:
1、使多 CPU 系统更加有效。操作系统会保证当线程数不大于 CPU 数目时,不同的线程运行于不同的 CPU 上。
2、改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序才会利于理解和修改。

4.请问单核机器上写多线程程序,是否需要考虑加锁,为什么?

答案:
在单核机器上写多线程程序,仍然需要线程锁。因为线程锁通常用来实现线程的同步和通信.在单核机器上的多线程程序,仍然存在线程同步的问题。因为在抢占式操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程如果这两个线程共享某些数据,不使用线程锁的前提下,可能会导致共享数据修改引起冲突。

5.请你说一下多线程和多进程的不同

答案:
进程是资源分配的最小单位,而线程是 CPU 调度的最小单位。多线程之间共享同一个进程的地址空间,线程间通信简单,同步复杂,线程创建、销毁和切换简单,速度快,占用内存少,适用于多核分布式系统,但是线程间会相互影响,一个线程意外终止会导致同一个进程的其他线程也终止,程序可靠性弱。而多进程间拥有各自独立的运行地址空间,进程间不会相互影响,程序可靠性强,但是进程创建、销毁和切换复杂,速度慢,占用内存多,进程间通信复杂,但是同步简单,适用于多核、多机分布。

6.请你说一说进程和线的区别

答案:

  1. 进程是 cpu 资源分配的最小单位,线程是 cpu 调度的最小单位
    2)进程有独立的系统资源,而同一进程内的线程共享进程的大部分系统资源,包括堆、代码段、数据段,每个线程只拥有一些在运行中必不可少的私有属性,比如 tcb,线程 Id,栈、寄存器。
  2. 一个进程崩溃,不会对其他进程产生影响;而一个线程崩溃,会让同一进程内的其他线程也死掉。
  3. 进程在创建、切换和销毁时开销比较大,而线程比较小。进程创建的时候需要分配系统资源,而销毁的的时候需要释放系统资源。进程切换需要分两步: 切换页目录、刷新 TLB 以使用新的地址空间;切换内核栈和硬件上下文(寄存器);而同一进程的线程间逻辑地址空间是一样的,不需要切换页目录、刷新 TLB。
    5)进程间通信比较复杂,而同一进程的线程由于共享代码段和数据段,所以通信比较容易

7.请你说一下多线程,线程同步的几种方式

答案:
进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;

线程是进程的子任务,是 CPU 调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发:线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。

线程间通信的方式:
1、临界区:
通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
2、互斥量 Synchronized/Lock:
采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有个,所以可以保证公共资源不会被多个线程同时访问
3、信号量 Semphare:
为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
4、事件(信号),Wait/Notify:
通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

8.请你回答一下软链接和硬链接区别

答案:
为了解决文件共享问题,Linux 引入了软链接和硬链接。除了为 Linux 解决文件共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若 1个 inode 号对应多个文件名,则为硬链接,即硬链接就是同一个文件使用了不同的别名,使用 ln 创建。若文件用户数据块中存放的内容是另一个文件的路径名指向,则该文件是软连接。软连接是一个普通文件,有自己独立的inode,但是其数据块内容比较特殊。

9.请你回答一下静态变量什么时候初始化

答案:
静态变量存储在虚拟地址空间的数据段和 bss 段,C 语言中其在代码执行之前初始化,属于编译期初始化。而C++中由于引入对象,对象生成必须调用构造函数,因此 C++规定全局或局部静态对象当且仅当对象首次用到时进行构造。

10.请你说一说多线程的同步,锁的机制

答案:
同步的时候用一个互斥量,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。在这种方式下,每次只有一个线程可以向前执行。

你可能感兴趣的:(嵌入式面试题,面试,嵌入式,操作系统)