操作系统-面试

什么是操作系统

管理硬件和软件的程序 是用户和计算机交互的接口

什么是管道

就是用来在不同进程中传递消息的 管道的作用就是不同进程可以通过管道将数据传递到内核的缓冲中 使这部分数据被进程共享 因为每个进程都是独享自己的数据 这样数据的传递就很麻烦 所以为了实现数据的传递 不同进程就可以通过管道将数据传递到内核的缓冲中 其他内存就从缓冲中获取自己想要的数据
管道分为
普通管道PIPE
只能在亲缘进(父子进程)间进行消息传递 具有固定的读写端 所以消息只能在一个方向流动
并且数据被读走了就没了 不可反复读取
命名管道FIFO
可以在无关的进程之间进行数据传递

IPC(进程间通信)

消息队列
就算发送与接受的进程终止了 消息队列中的消息也不会被删除 消息队列是面向记录的 可以实现消息的随机查询 按消息类型进行读取
信号量 控制进程对共享资源的访问
共享内存 多个进程访问同一个空间 可以及时看到对方进程的数据更新 最快的IPC 进程直接对内存进行读取 依赖于互斥锁和信号量
信号signal
套接字 socket 可用于不同主机之间的进程通信

信号

信号是一条小消息 这个小消息可以通知进程 告诉进程系统中有事件发生
信号一般由内核发送给进程

发送信号的原因

内核检测到一个系统事件,比如除零错误或者子进程终止。
—个进程调用了kill 函数, 显式地要求内核发送一个信号给目的进程。一个进程可以发送信号给它自己

什么是接受信号

目的进程被内核强迫以某种方式对信号的发送做出反应

虚拟内存

虚拟内存应该就是一个比物理内存大很多 然后可以通过段表或者页表与物理地址相映射的地址

作用

防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏
具体表现就是 每个进程加载创建的时候只是分配了虚拟内存 和建立好了虚拟内存和物理内存之间的映射 就算在malloc也还是分配的虚拟内存 只有真正访问到这个数据的时候才会真正引发缺页异常分配内存

优点

增大了地址内存 对内存进行了保护 方便了进程通信

缺点

虚存需要建立额外的数据结构 浪费了内存 虚存到物理内存增加指令执行时间
页面的换入换出需要时间

虚拟内存和物理内存如何对应的

能使用虚拟存储的原因

程序执行短时间内一般局限在存储空间的某个区域范围内 就是他不会东跑一下西跑一下 程序指令大部分情况下都是顺序执行 还有什么时间局限性和空间局限性 时间局限性说程序中某个指令被执行了 他没过多久就可能再被执行 空间就是某个存储单元被访问了 不久他附近的存储单元也可能被访问

什么是物理地址

与CPU链接的地址总线相对应 把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址

缺页中断

malloc()内存分配函并没有真正的分配物理内存 只是分配了虚拟地址空间 这些虚拟空间都没有建立映射关系 当访问到这些数据变量时就会产生一个缺页异常
缺页异常就会通过页表在外存中找到该页放入内存
缺页中断就是指令运行的时候需要一个数据 但是这个数据不在内存中就需要中断
普通中断就是这个进程需要中断了 例如父进程要求 或者最小化等
区别在于 缺页中断是执行产生缺页中断的那条指令 就是执行缺的数据的那条 而普通中断就是不执行这一条了 执行其他的

fork()和vfork()有时间看一下

fork:创建一个和当前进程映像一样的进程
fork缺点
fork后立刻执行exec所造成的地址空间的浪费
vfork
同样会产生进程 但是vfork( )会挂起父进程直到子进程终止或者运行了一个新的可执行文件的映像
fork和vfork的区别:

  1. fork( )的子进程拷贝父进程的数据段和代码段;vfork( )的子进程与父进程共享数据段
  2. fork( )的父子进程的执行次序不确定;vfork( )保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
  3. vfork( )保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
    4.当需要改变共享数据段中变量的值,则拷贝父进程。

并发和并行

并发宏观上 并行微观上
就是一个是假的一个是真的

页表寻址

有了进程为什么要线程

进程的作用是多个程序并发执行 提高资源利用率 如果没有线程则进程在同一个时间内只能做一件事 也就是如果进程中有一部分被堵塞了 则整个进程就被挂起了 但是有了线程后 这一部分线程被堵塞了 其他线程还是会继续运行的
线程提高了并发性 切换效率和资源上都有提升
使多CPU系统更加有效

多线程程序加线程锁的原因

可能导致共享数据修改发生冲突

进程和线程的区别

进程是分配资源的最小单位 不同进程独享资源
线程是CPU调度的最小单位 统一进程的不同线程共享资源空间
相较于进程 线程切换效率高占用资源少
但是一个进程中的线程崩了 该进程中其他线程也没办法运行 进程不会这样
多进程适用的区域是CPU数量比较多的 例如多机分布式场景、
多线程适用于IO密集型

进程什么时候会发生调度

1.进程运行结束
2.进程时间片用完
3.优先级更高的进程来了
4.进程阻塞了

不能进行进程调度的情况

在中断处理程序执行时。
在操作系统的内核程序临界区内。
其它需要完全屏蔽中断的原子操作过程中。

进程的调度策略

先到先服务调度算法 先来的就调度
短作业优先调度算法 时间越短的就优先调过来
优先级调度算法 优先级越高的优先过来
时间片轮转调度算法 给每个进程一定的时间片 时间片到了就换下一个
高响应比优先调度算法 通过计算响应比计算优先程度
多级队列调度算法 有多个队列 第一队列的优先级最高 每个时间片用完了就会掉到下一个队列的最后一个
多级反馈队列调度算法

多线程模型

这个多线程模型主要是内核线程和用户线程之间的对应
多对一模型 多个用户线程对应一个内核线程 这样如果这个内核线程崩了 这些多个用户线程都不能用了
一对一模型 就是一个用户线程对应一个内核线程 缺点就是没有那么多内核线程 但是Linux和windows都是用一对一
多对多 结合了上面两个

僵尸进程

父进程不知道子进程退出了 这个时候 系统还以为子进程在系统中

结构体为什么要字节对齐

一个原因是有的操作系统不能想访问哪个地址就访问哪个地址
另一个是方便快捷 如果不对齐有的数据可能要多次访问才能找到

互斥锁

保证只有一个线程访问该对象 当上了互斥锁后如果有线程在访问该对象 而其他线程想访问 此时访问会失败进入休眠状态 直到互斥锁被释放

读写锁

就是读可以大家一起读 写只能一个人写 开始写了其他人就不能读了

进程和线程同步的区别

进程和线程同步都是用那些锁
进程之间地址空间不同,不能感知对方的存在,同步时需要将锁放在多进程共享的空间。而线程之间共享同一地址空间,同步时把锁放在所属的同一进程空间即可

内存

bss段 存放未初始化的静态变量和全局变量 自动释放 不占用exe文件空间 连接器获取内存 bss段的大小可以从exe文件中获取 然后链接器得到这个大小的内存块,紧跟在数据段的后面。当这个内存进入程序的地址空间后全部清零
数据段 存放已经初始化的全局变量 静态分配内存
代码段 存放代码和一些只读的常量 运行前就确定了 Static修饰的成员函数,在代码区分配内存。
text段和data段在编译时就分配了空间

系统态和内核态

处理器的执行状态分为系统态和内核态
内核态是操作系统管理程序执行 能执行所有命令 访问所有空间
用户态就是用户程序执行时处理器的状态 不能执行特权命令 只能访问用户空间
内核态和用户态之间的转换方式:系统调用,异常和中断
系统调用是操作系统最小功能单位 软中断
异常是内中断 错误引起 文件损坏 页面故障
外部中断 硬中断

如何实现线程同步

使用互斥量 在访问共享资源的时候对互斥量加锁 其他想访问访问共享资源的都会被阻塞 直到锁被释放

windows消息机制

鼠标键盘的一些操作会转换成消息被放到消息队列中 应用程序循环从消息队列中获取消息进行操作

内存溢出,内存泄漏

内存溢出
你要的内存空间超过了系统实际分配给你的空间
原因
内存中加载数据过大
死循环产生太多实体
启动初始内存值设置太小
内存泄漏
没有释放掉不再使用的内存 失去了对这部分内存的控制

死锁

什么是死锁

每一个进程都在等其他进程完成任务

必要条件

有互斥资源临界资源
有进程在已获得部分资源的情况下还请求其他资源 然后这个资源正好被其他进程占有
自己在获取不到其他资源时不需要释放自己已有的资源
形成了一个循环 a缺的资源在b那 b缺的在c那 c缺的在a那

破坏死锁

只需要其中一个必要条件破坏就行
比如说允许抢占 或者要么就一次性把资源拿齐 要么就不拿挂起
破坏循环等待的话就是设置一个资源等级机制 例如 电视为1和遥控器为2 你需要先申请到电视1才有资格申请遥控器2
还有个什么银行家算法 有点太复杂了 不好记核心思想就是先分析所有进程还需要的资源 用空闲资源去减去需要资源 就是空余的资源 反正要保证空余资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值