# 征战bat,后台开发面试题(五)——操作系统篇

2018-04-18  本文已影响0人  NeverLee

题目列表

题解

什么是孤儿进程僵尸进程,如何避免僵尸进程

怎样创守护进程(附加)

指针对应的地址是不是物理地址

不是,是虚拟地址

物理地址和虚拟地址通常叫做什么?缩写是什么

操作系统的寻址方式

linux使用分页寻址的方式
linux的虚拟地址和线性地址直接对应

linux 中如何计算可用内存

free命令查看
可用内存=free+cached+buffers=total-used

top 的输出中哪些是表明了内存

top中指标:

用 top 看耗性能的线程

top -H

epoll 与 select 比较

epoll 的缺点,如何克服缺点

epoll适用于有大师空闲连接的情况,假如网络中只有少数连接,并且都很活跃

说说同步与异步的区别

同步和异步关注的是消息通信机制。
同步是A发出一个调用后等待B完成返回结果再继续向下执行;
异步是A不需等待返回结果,继续处理其他事情,等B完成后再取回结果。

进程间的通信有哪些机制?在资源内存方面比较如何

如何判断系统在哪些地方耗费性能

内存:top,free,sar,pmap,vmstat,mpstat,iostat,
cpu:top,vmstat,mpstat,iostat,sar
I/O:vmstat,mpstat,iostat,sar
进程:ps,top,ipcs,ipcrm
系统运行负载:uptime,w

cpu 调度的单位是什么

线程

如何让多核 cpu 更好的利用资源

什么是缺页

缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问

linux的内存管理采取的是分页存取机制,即程序的地址空间被划分成固定大小的区域,称为页,内存空间分成若干个与页大小相同的物理块。通过映射的方式将页离散分布到块中。为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据页自动交换到虚拟内存的交换空间中,而将经常使用的信息保留到物理内存。
当进程访问到不在物理内存中的页时,便会触发缺页中断

如何控制两个进程对一个数据的访问?怎么处理加锁问题

说一说协程

协程是由
• 调度算法对于程序来说都是“被动”式的。比如调度算法会把CPU的时间分配给还在IO等待中的程序,虽jk然可以立即检查并交出CPU,但是这里还是有一个切换的过程。
• 协程可以说是“主动式”的,由程序来告诉计算机,我要进行等待IO行为了,可以把CPU的控制权交给别人,这个实现的基础是用户态的。所以,协程就是在用户态线程中,两个程序协商好了,通过某种方式协作运营,共享CPU控制权的方法。一般来说,这个协商的方法通用的关键字就是yield。

是否了解 netstat

netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态,masquerade 连接,多播成员等等。
常用的netstat选项包括:
-a : 所有socket信息,-l : 监听的socket
-t -u -x : 分别为TCP端口,UDP端口,UNIX端口
-r : 显示路由信息
-i : 显示网卡借口统计
-s : 显示网络协议统计
-p : 输出中显示 PID 和进程名称

在 shell 中用 ./a.out | wc -l 结果是多少?管道的输入是哪个进程的

输出一个整数,结果为a.out执行后标准输出的行数,管道输入为a.out的标准输出。

谈谈 Linux 的文件权限。让只有拥有者才能读写?让拥有者只能读和执行? 删除文件需要什么权限

文件权限 所有者的rwx,所在组的rwx,其他的rwx(rwx分别对应421)

假如一个进程在对文件进行读写,管理员把文件删除了怎么办

被程序打开的文件会在/proc/<pid>/fd/下,删除文件仅删除了文件在磁盘上的inode引用减少了1,/proc/<pid>/fd/还有该文件的引用,并且可以通过lsof查看到该文件对应的fd后,可以从/proc/<pid>/fd/找到这个fd恢复该文件内容。

协程与进程线程比较有什么优势

进线程由操作系统进行调度,协程则由用户程序调度

计算机从电源加载开始的启动过程

启动引导程序BIOS-自检-启动引导程序-加载操作系统(从磁盘读到RAM中)-读取配置文件)

什么是中断调用?中断程序的分类

内核态和用户态的区别

•当进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核态。此时处理器的特权级为0级。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈
•当进程在执行自己的代码时,则称其处于用户态。即此时处理器在特权级最低的3级。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。

为什么需要内核态

进程处于内核态时,特权级最高,才能使用某些指令。在CPU的有些指令非常危险。所以,设计出用户态进行隔离,而一些必要时候就需要进入内核态执行这些指令

什么时候进入内核态

多线程需要加锁的变量

加锁通常针对的是一系列操作,而这一系列并非原子操作,这一系列操作并非并发安全。则需要加锁。
常见的有一些共享的有写操作的变量,一些不可重入函数等

什么是死锁,如何防止死锁(附加)

死锁是指多个进程相互对方释放共享资源的僵持形态,无外力作用下会无限的等待。
死锁的四个条件禁止抢占,持有和等待,互斥,循环等待
破坏死锁四个必要条件中的一个即可避免死锁,如资源有序分配等

程序在内存中的布局

从高地址到低地址依次是:

lsof作用和使用(附加)

列出当前系统打开文件(普通文件、目录、管道、socket等)

strace作用和使用(附加)

跟踪一个进程产生的系统调用(包括参数,返回值,执行消耗的时间)

ptrace作用和使用(附加)

提供了一种机制使得父进程可以观察和控制子进程的执行过程,同时提供查询和修改子进程的镜像和寄存器的能力。主要用于执行断点调试和系统调用跟踪。使用示例:

// long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
// request:请求执行的行为,
// pid:目标进程标识。
// addr:执行 peek 和 poke 操作的目标地址。
// data:对于 poke 操作,存放数据的地方。对于 peek 操作,获取数据的地方。

#include <sys/ptrace.h>
#include <stdio.h>
#include <unistd.h>

int main () {
    pid_t fpid = fork();

    if (fpid < 0) {  // fork出错
        printf("error in fork!");
    } else if (fpid == 0) { // 子进程
        ptrace(PTRACE_TRACEME, 0, NULL, NULL); // 当前进程需要被trace
        execve(...); // 启动需要被跟踪的进程
    } else { // 父进程
        wait(); // 先等子进程准备好
        ptrace(...); // ... 对子进程干想干的事吧
    }
    return 0;
}

作者原创,转载请注明出处

上一篇 下一篇

猜你喜欢

热点阅读