性能优化

iOS面经问题汇总之21道操作系统面试题

2021-11-15  本文已影响0人  iOS丶lant

1.什么是操作系统?

  1. 操作系统(OS)是管理计算机硬件与软件资源的程序,是计算机的基石。
  2. 操作系统本质上是运行在计算机的软件程序,其他应用程序都需要通过操作系统来调用系统的资源,如内存、CPU、GPU、磁盘;
  3. 操作系统的存在屏蔽了硬件和硬件层面的复杂性;
  4. 操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存、硬件、文件系统、应用程序的管理。

2.讲一讲用户态和系统态

  1. 用户态:用户态运行的进程可以访问用户程序的数据;
  2. 系统态:几乎可以访问任意的计算机资源,不受限制

3.讲一讲系统调用

  1. 设备管理:设备的请求或释放,如视频电话启动摄像头;
  2. 文件管理:文件的修改、创建、删除等;
  3. 进程控制:进程的创建、撤销、阻塞、唤醒等;
  4. 进程通信:完成进程间的消息或信号传递;
  5. 内存管理:内存分配(malloc 函数)、回收(free)、地址转换(将逻辑地址转化为物理地址等)

4.进程和线程的区别和联系?

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换;从一个进程的线程切换到另一个进程的线程时,会引起进程的切换。

进程的开销更大,线程的开销小。

线程间可以通过直接读写同一进程中的数据进行通信,但进程间的通信需要借助IPC。

5.进程和线程的切换哪个带来的资源消耗大?为什么线程的消耗比较小?

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前进程CPU的保存及新调度进程CPU环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。最主要的一个区别在于进程切换涉及虚拟地址空间的切换而线程不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。
说法2:CPU上下文切换就是把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,来运行新任务。一次系统调用的过程,其实是发生了两次 CPU 上下文切换。(用户态代码-系统态代码-用户态代码)。系统调用过程中,并不会涉及到虚拟内存等进程用户态的资源。进程上下文切换就比系统调用时多了一步:在保存内核态资源之前,需要把用户态资源(虚拟内存、栈等)保存下来;而由于同一进程的线程共享堆和方法区,因此同一进程的线程切换时,只需要切换线程的私有数据即可,而不同进程的线程切换过程就跟进程上下文切换是一样的。

6.线程共享哪些内存空间?

一个进程中的所有线程共享该进程的地址空间,但它们有各自独立的(私有的)栈(stack);同一进程内的线程共享本进程的资源如虚拟内存、描述符等,但是进程之间的资源是独立的。

7.进程和线程各自分配了哪些资源?

8.讲一下各种锁

9.死锁的各种问题

死锁的必要条件

每个资源要么已经分配给了某个进程,要么就是可用的

已经得到了某个资源的进程可以再请求新的资源

已经分配给某个进程的资源不可被强制性抢占,它只能被占有它的进程显式的释放

有两个或两个以上的进程组成一条环路,该环路中每一个进程都在等待下一个进程占有的资源

处理方法

如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

10.谈一谈同步和异步

同步方式指的是添加任务后阻塞当前线程直到任务被加入队列并且执行结束;
异步方式指的是加入任务队列后,不必等待任务执行,函数立即返回
同步与异步只与线程有关,和队列无关,不要混淆;队列的串行和并行与同步、异步并无关联;
同步与异步是准备抛任务的线程 与 执行任务线程的关系;抛任务的线程是否等待这个任务执行完成,若等待就是同步,不等待就是发起了异步。
如何深入理解同步异步只与线程有关而和队列无关?
举个例子:主线程往串行队列异步抛100个任务,这100个任务是在串行队列里串行执行的,但主线程在抛完之后就不关心任务执行的怎么样了。串行是这100个任务的串行,和主线程没关系。

dispatch_queue_t queue = dispatch_queue_create("serial",null);
for(int i = 0; i < 100; i ++ ){
    dispatch_async(queue, ^{
        NSLog(@"current:%d", i);
    });
}

此处感谢@Fater7的精彩讲解。

11.两个线程同时访问i并使之++一万次,i的结果

答:不可预期,具体要看线程如何调度。

12.手写一个线程安全的单例模式

@implementation Singleton

+ (instancetype)sharedInstance{
static Singleton * sharedInstance = nil;
      if(!sharedInstance){
      @synchronized(self){
        if(!sharedInstance){
          sharedInstance = [[Singleton alloc] init];
        }
      }
   }
    //NSLog(@"currentTime:%@", [NSDate date]);
    if(sharedInstance){
        NSLog(@"address:%@",[sharedInstance description]);
    }
  return sharedInstance;
}

@end
@implementation Singleton
+(instancetype)sharedInstance{
    static Singleton *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[Singleton alloc] init];
    });
    if(sharedInstance){
        NSLog(@"address: %@", [sharedInstance description]);
    }
    return sharedInstance;
}
@end

13.并发和并行

4月2日更新,清华大学操作系统课中给出的更清晰的概念:并发是指一段时间内多个程序(进程)可以运行,并行是指一个时刻上多个程序(进程)可以运行。单CPU可以实现并发(依靠进程切换),但不可以实现并行。
并发和并行并不是互斥的概念。
与并发执行对应的是顺序执行;
与并行相对应的是串行;
并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机;
并发和并行都可以是很多个线程,就看这些线程能不能同时被(多个)cpu执行;如果可以就说明是并行;而并发是多个线程被(一个)cpu轮流执行;

14.进程之间如何通信?

常见的通信方法有管道、信号、消息队列、信号量、共享内存、套接字;

如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

15.线程之间如何同步?

16.讲一讲进程切换调度的算法

  1. 先到先服务(FCFS):从就绪队列中选择最先进入的进程,为其分配资源;
  2. 短作业优先:选择估计运行时间最短的进程;
  3. 时间片轮转:为每个进程分配固定的运行时间段;
  4. 优先级调度:根据进程优先级进行分配,如果优先级相同使用FCFS进行调度;
  5. 多级反馈队列:既能使高优先级任务得到响应,又能让短作业迅速完成,Unix采用这种调度算法。

17. 讲一讲内存管理机制和内存管理方法

内存管理主要分为连续分配管理和离散分配管理。离散分配管理又分为页式管理、段式管理和段页式管理。

  1. 页式管理:将主存分为大小固定的相等的页,用页表来管理;
  2. 段式管理:根据用户需求,为每段定义逻辑信息,根据段来分配内存,用段表管理;
  3. 段页式管理:结合段式和页式的优点,先分为段,每段再分为页。

段式和页式的共同点:都是离散存储,为了提高内存利用率,减少碎片;
区别:分页式由系统完成,分段式由用户根据需求划分。一个指令可能会跨页但不会跨段,页式有内碎片而段式没有。

18.讲一讲快表和多级页表

  1. 快表提高了内存的时间性能,提高了虚拟地址到物理地址的转换速度,是一种高速的缓存,正常情况分页下需要访问两次主存,而使用快表命中的情况下只需要访问一次高速内存,一次主存即可。日常系统开发redis缓存就是借鉴了这一思想;
  2. 多级页表提高了内存的空间性能,通过使用多级页表映射的方式来替代把所有页表都放在内存中。

19.什么是虚拟内存?

比如某些软件运行时占用的内存要远远超出电脑本身的内存,这是通过虚拟内存来实现的。虚拟内存定义了一个连续的虚拟内存地址空间,把内存扩展到硬盘空间上(内存到外存)

20.说一说虚拟内存的局部性原理

局部性原理是虚拟内存技术的基础,它允许程序部分装入内存即可运行。

  1. 时间局部性:一条指令被执行或者一个数据被访问,那么不久之后这个指令或数据会再次被执行或访问;
  2. 空间局部性:一个存储单元被访问,则不久之后其附近的存储单元也将被访问,通过预存机制来实现高速缓存;

21.虚拟内存的实现技术有哪些?讲一讲常见的页面置换算法。

上一篇 下一篇

猜你喜欢

热点阅读