操作系统面经

用户态内核态

区别

  • 内核态: 一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态),内核态可以使用特权指令,运行操作系统程序。
  • 用户态: 一个任务(进程)执行自己的代码时,我们称进程运行在用户态,处于用户态的程序只能使用非特权指令

用户态切换内核态方法

  • 系统调用(主动):如调用open打开一个IO设备等
  • 异常: 如进程访问非法内存死机、使用内存时缺页中断等
  • 外围设备的中断: 磁盘IO完成等

切换代价

进程在内核态和应用态分别有自己独立的两个栈,当系统调用发生,进程切换到内核态栈,内核态为了安全起见会进行一系列安全检查,消耗资源;另外,切换到内核态时,需要保存用户态上下文,如寄存器的值,待内核态执行完成后还需要还原用户态的上下文,继续任务,这个过程也比较消耗资源。

内存管理

虚拟内存:

32位的linux系统每个进程有4个G的连续线性空间,其中低3G为用户态地址空间,高1G空间为内核态地址空间。用户地址空间又被划分为代码段、数据段、BSS段、堆、共享存储器映射段、栈段。这些虚拟地址空间一开始并未对应于物理地址上,只有当被使用时才会由内核的缺页中断映射到具体的物理地址上。

内存管理:

linux系统使用分页机制管理内存的,为了更高效和更经济的管理内存,进程线性地址被分为以固定长度为单位的组,称为页(一般为4K);页内部连续的线性地址空间被映射到连续的物理地址中。我们举一个例子来说明:


图片来源于网络

我们可以看到进程1和进程2的虚拟地址空间都被映射到了不连续的物理地址空间内(这个意义很大,如果有一天我们的连续物理地址空间不够,但是不连续的地址空间很多,如果没有这种技术,我们的程序就没有办法运行),甚至他们共用了一部分物理地址空间,这就是共享内存。
  进程1的虚拟页VP2和VP3被交换到了磁盘中,在程序需要这两页的时候,Linux内核会产生一个缺页异常,然后异常管理程序会将其读到内存中。

cache和buffer

  • cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到加快访问速度的作用。Cache是系统两端处理速度不匹配时的一种折衷策略。
  • buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数(比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,不然硬盘都要被你玩坏了)。buffer是系统两端处理速度平衡(从长时间尺度上看)时使用的。

进程和线程

区别

  • 进程是资源分配的最小单位,线程是CPU调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
  • 线程共享进程的地址空间,但每个线程又独自享有自己的栈空间,线程切换的时候实际上切换的是一个可以称之为线程控制块的结构,里面保存所有将来用于恢复线程环境必须的信息,包括所有必须保存的寄存器集,线程的状态等

进程通信方式

  • 信号量
    信号量用来管理临界资源的。它本身只是一种外部资源的标识,不具有数据交换功能,而是通过控制其他的通信资源实现进程间通信。

  • 管道:
    父子进程通信,打开一对pipe,父子进程一个读一个写,只能用于具有亲缘关系的进程间通信

  • 命名管道:
    命名管道是一个存在于硬盘上的文件,而管道是存在于内存中的特殊文件。所以当使用命名管道的时候必须先open将其打开, mkfifo("myfifo",S_IFIFO|0666); //创建一个存取权限为0666的命名管道
    命名管道可以用于任何两个进程之间的通信,不管这两个进程是不是父子进程,也不管这两个进程之间有没有关系

  • 消息队列

  • 共享内存
    int shmget(key_t key, size_t size, int shmflg);
    共享内存是这五种进程间通信方式中效率最高的。但是因为共享内存没有提供相应的互斥机制,所以一般共享内存都和信号量配合起来使用

  • 域套接字
    类似命名管道,也是会生成一个文件,只是该文件是socket文件,用于进程通信,如mysql

中断

硬中断

设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。----和IO外设有关

软中断

软中断是执行中断指令产生的,Linux为了满足实时系统的要求,中断处理应该是越快越好。因此设计了该机制,让硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。
常见软中断:网络包的收发、程序调度、高精度定时器、任务优先级管理等

CoreDump

core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. 我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息

mmap

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。

mmap优点共有一下几点:
1、对文件的读取操作跨过了页缓存,减少了数据的拷贝次数,用内存读写取代I/O读写,提高了文件读取效率。
2、实现了用户空间和内核空间的高效交互方式。两空间的各自修改操作可以直接反映在映射的区域内,从而被对方空间及时捕捉。
3、提供进程间共享内存及相互通信的方式。不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。同时,如果进程A和进程B都映射了区域C,当A第一次读取C时通过缺页从磁盘复制文件页到内存中;但当B再读C的相同页面时,虽然也会产生缺页异常,但是不再需要从磁盘中复制文件过来,而可直接使用已经保存在内存中的文件数据。
4、可用于实现高效的大规模数据传输。内存空间不足,是制约大数据操作的一个方面,解决方案往往是借助硬盘空间协助操作,补充内存的不足。但是进一步会造成大量的文件I/O操作,极大影响效率。这个问题可以通过mmap映射很好的解决。换句话说,但凡是需要用磁盘空间代替内存的时候,mmap都可以发挥其功效

你可能感兴趣的:(操作系统面经)