操作系统知识点总结(笔试面试用)

操作系统知识点总结(笔试面试用)_第1张图片

进程管理

1.进程和线程以及他们的区别
进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发性
线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发
一个程序至少有一个进程,一个进程至少有一个线程,线程依赖于进程为存在;
进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。从操作系统的角度来看,进程=程序+数据+PCB(进程控制块)
2.进程有哪几种状态

  • 就绪状态:进程已获得处理机以外的所需资源,等待分配处理机资源
  • 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数
  • 阻塞状态:进程等待某种条件,在条件满足之前无法执行
    操作系统知识点总结(笔试面试用)_第2张图片
    孤儿进程,僵尸进程?产生的原因,这两种进程对系统的影响(如:会不会消耗系统资源,如何处理这两种进程,在编程时如何避免这两种进程)
    3.线程有哪几种状态
  • new:在这个状态中,一个线程还没有开始
  • runable:在这个状态中,线程在java虚拟机上执行
  • blocked:在这个状态线程被阻塞
  • waiting:等待状态,等待被唤醒
  • time waiting:等待时间满后自动环形
  • terminated:停止
    线程的状态转换如下:
    操作系统知识点总结(笔试面试用)_第3张图片
    4.进程间的通信
    进程之间的信息交换成为进程通信。根据交换信息量的多少,进程通信分为两种类型:低级通信高级通信。低级通信传送的信息量少,主要用于控制信息的传送;高级通信是指进程间大批量的数据交换。
    进程通信的类型
    (1)共享存储器通信:交互进程之间有一个可以直接访问的共享存储区,并发进程通过对这个共享存储区的读和写进行信息交换。如基于共享数据结构的通信方式(如公用数据结构,只适合传递少量数据,如信号量,低级);基于共享存储区的通信方式(如公共内存块,高级),在这种通信方式下,操作系统只负责为通信进程提供可使用的存储空间和进程同步工具,数据交换由用户进程通过读、写命令来完成。
    (2)消息传递系统高级):进程之间的数据交换以格式化的消息为单位,放在内核中。这种通信方式可以进一步划分为:直接通信方式(通过发送和接受原语来实现)和间接通信方式(如邮箱通信方式)。
    操作系统知识点总结(笔试面试用)_第4张图片
    邮箱通信方式
    备注:一般地,把系统态下执行的某些具有特定功能的程序段成为原语;原语的执行必须是连续的
    (3)管道(pipe)及命名管道(named pipe,FIFO)通信方式:管道:是指连接一个读进程和一个写进程之间用以实现通信的共享文件,也称pipe文件。UNIX中的管道是一个环形的缓冲区,允许两个进程以生产者/消费者模型进行通信。管道可用于具有亲缘关系的父子进程间的通信,命名管道除了具有管道所具有的功能外,他还允许无亲缘关系进程间的通信。
    (4)信号(signal)信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生,信号产生的条件:按键、硬件异常,进程调用kill函数将信号发送给另一个进程、用户调用kill命令将信号发送给其他进程,传递的消息比较少用于通知接收进程某个时间已经发生
    (5)信号量:主要作为进程之间(系统西濠梁)及同一种进程的不同线程之间(私有信号量)的同步和互斥手段;
    (6)套接字(Socket):这是一种更为一般得进程间的通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。(网络上的两个程序通过一个双向的通信连接实现数据的交换,这个链接的一端称为一个socket)
    几种方式的比较:
    管道:速度慢、容量有限
    消息队列:容量收到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
    信号量:不能传递复杂信息,只能用来同步。
    共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全。
    5.进程同步的方式
    原子操作、信号量机制、临界区、自旋锁管程、会合、分布式系统
    各方法的大致原理,详细理解至少一种,尝试用伪代码实现一种

6.线程同步的方式
(1)互斥量(Synchronized/Lock):采用互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问
(2)信号量(Semphare):它允许同一时刻多个线程访问同一资源,但需要控制同一时刻访问此资源的最大线程数量
(3)事件(信号),wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作
(4)临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问。
操作系统知识点总结(笔试面试用)_第5张图片
线程池的原理及作用
线程池与一般的多线程由什么区别、优点及使用场景,尝试用代码实现

进程调度

  • FCFS(先来先服务,队列实现,非抢占的):先请求CPU的进程先分配到CPU
  • SJF(最短作业优先调度):平均等待时间最短,但难以指导下一个CPU区间长度
  • 优先级调度算法(可以是抢占的,也可以是非抢占的):优先级越高越先分配到CPU,相同优先级先到先服务,存在的主要问题是:低优先级进程无穷等待CPU,会导致无穷阻塞或饥饿;解决方案:老化
  • 时间片轮转调度算法(可抢占的):队列中没有进程被分配超过一个时间片的CPU时间,除非他是唯一可运行的进程。如果进程的CPU区间超过了一个时间片,那么该进程就会被抢占并放回就绪队列
  • 多级队列调度算法:将就绪队列分成多个独立的队列,每个队列都有自己的调度算法,队列之间采用固定优先级抢占调度。其中,一个进程根据自身属性被永久地分配到一个队列中。
  • 多级反馈队列调度算法:与多级队列调度算法相比,其允许进程在队列之间移动;若进程使用过多的CPU时间,那么它会被转移到更低的优先级队列;在较低优先级队列等待时间过长的进程会被转移到更高优先级队列,以防止饥饿发生。

常见的同步模型

  • 生产者消费者模型,尝试用代码实现

7.什么是死锁?死锁产生的条件?
(1)死锁的概念
在两个或多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。
(2)死锁产生的四个必要条件
互斥:至少有一个资源必须属于非共享模式,即一次只能被一个进程使用;若其他申请使用该资源,那么申请进程必须等到该资源被释放为止;
占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。
非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放
循环等待:若干进程之间形成一种头尾相接的环形等待资源。当每类资源数量只有1个时,有环不一定有死锁!
(3)死锁的处理基本策略和常用方法
解决死锁常用的方法主要有:预防死锁、避免死锁、检测死锁、解除死锁、鸵鸟策略 等。
1)死锁预防
死锁预防的基本思想是只要确保死锁发生的四个必要条件中至少有一个不成立,就能预防死锁的发生,具体方法包括:

  • 打破互斥条件:允许进程同时访问某些资源。但是,有些资源是不能被多个进程所共享的,这是由资源本身属性所决定的,因此,这种办法通常无实用价值。
  • 打破占有并等待条件:可以实行资源预先分配策略(进程在运行前一次性向系统申请它所需要的全部资源时,才一次性将所申请资源分配给该线程)或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用他们,但是在当前进程申请更多资源前,它必须释放当前所占有的资源)。 **缺点:**在很多情况下,无法预知一个进程执行前所需的全部资源,因为进程是动态执行,不可预知的;同时,会降低资源利用率,导致降低了进程的并发性。
  • 打破非抢占条件:当一个进程占有了一部分资源,在其申请新的资源得不到满足时,它必须释放所有占有的资源。**缺点:**实现困难,会降低系统性能。
  • 打破循环等待:实行资源有序分配策略。对所有资源排序编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,即只有占用了小号资源才能申请大号资源,这样就不会产生环路,预防死锁的发生。这种方法也称“有序资源分配法”。
    2)死锁避免的基本思想
    死锁避免的基本思想是动态的检测资源分配状态,以确定循环等待条件不成立,从而确保系统处于安全状态。所谓的安全状态是指:如果系统能按某个顺序为每个进程分配资源(不超过其最大值),那么系统状态的状态是安全的,换句话说就是,如果存在一个安全序列,那么系统处于安全状态,资源分配图算法和银行家算法是两种经典的死锁避免的算法,其可以确保系统始终处于安全状态。其中,资源分配图算法应用场景为每种资源类型只有一个实例(申请边,分配边,需求边,不形成环才允许分配),而银行家算法应用于每种资源类型可以有多个实例的场景。
    3)死锁解除
    死锁解除的常用两种方法为进程终止和资源抢占。所谓的进程终止是指简单地终止一个或多个进程以打破循环等待,包括两种方式:终止所有死锁进程和一次只终止一个进程直至取消死锁循环位置;所谓资源抢占是指从一个或多个死锁进程哪里抢占一个或多个资源,此时必须考虑三个问题:
  • 选择一个牺牲品
  • 回滚:回滚到安全状态
  • 饥饿(在代价因素加上回滚次数,回滚的越多则越不可能继续被作为牺牲品,避免一个进程总是被回滚)
    计算:
    x*(m-1)_1=n
    n为总资源数 m为进程需要数,x为允许的进程数

存储器管理&文件系统、IO

windows下的内存是如何管理的
3种

  • 虚拟内存 最适合用来管理大型对象或者结构数组
  • 内存映射 最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据
  • 内存堆栈 最适合用来管理大量的小对象

物理内存与虚拟内存

分页与分段
页是信息的物理单位,分页是为了实现离散分配方式,以减少内存的外零头,提高内存的利用率。分页仅仅是由于系统管理的需要,而不是用户的需要。
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
页的大小固定且由系统确定,把逻辑地址分为页号和页内地址两部分,由机器硬件实现的。因此一个系统只能由一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编写程序对源代码进行编辑时,根据信息的性质来划分。
分页的作业地址空间是一维的,即单一的线性空间。
分段的作业地址空间是二维的,程序在标识一个地址时,既需要给出段名,又需要给出段内地址。
页面置换算法
(了解大致原理,并能详述其中一种)

  • 最佳置换算法(Optimal Page Replacement Algorithm) 是将未来最久不使用的页替换出去,这听起来很简单,但是无法实现,但是这种算法可以作为衡量其他算法的基准
  • 最近不常使用算法(Not Recently Used Replacement Algorithm) 算法给每个页一个标志位,R表示最近被访问国,M表示被修改果。定期对R进行清零。算法的思路是首先淘汰那些未被访问过R=0的页,其次是被访问过R=1,未被修改过M=0的页,最后是R=1,M=1的页。
  • 先进先出页面置换算法(First-In,First-Out Page Replacement Algorithm) 算法的思想是淘汰在内存中最久的页,算法的性能接近与随机淘汰。并不好。
  • 改进型FIFO算法(Second Change Page Replacement Algorithm) 算法是在FIFO的基础上,为了避免置换出经常使用的页,增加一个标志位,如果最近使用过将R置为1,当页将会淘汰时,如果R为1,则不淘汰页,将R置为0.而那些R=0的页将会被淘汰时,直接淘汰。这首那个算法避免了经常被使用的页被淘汰。
  • 时钟替换算法(Clock Page Replacement Algorithm) 虽然改进型FIFO算法避免置换出常用的页,但由于需要经常移动页,效率并不高。因此在改进型FIFO算法的基础上,将队列首位相连形成一个环路,当缺页中断产生时,从当前位置开始找R=0的页,而所经过的R=1的页被置0,并不需要移动页。
  • 最久未使用算法(LRU Page Replacement Algorithm) LRU算法的思路是淘汰最近最长未使用的页。这种算法性能比较好,但实现起来比较困难。

Linux基本操作

1.如何查看一个进程的详细信息,如何追踪一个进程的进行过程
通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:
#pstree -p 19135(进程号)
使用top命令查看(可以查看到线程情况)
#top -Hp 19135(进程号)
2.跟踪某个应用程序的运行过程
跟踪已运行的进程:strace -p pid
3.在linux系统下查看CPU、内存、磁盘、IO、网卡情况

#cat /proc/cpuinfo  #查看CPU信息
	#cat  /proc/cpuinfo | grep "physical id" |uniq |wc-|  #查看CPU个数
	uniq命令:删除重复行;wc -l 命令:统计行数
	#cat /proc/cpuinfo |grep "cpu cores" |uniq #查看CPU和数
	#cat /proc/cpuinfo |grep 'model name' |uniq
#ps -ef  #查看所有进程
#top      #实时显示进程状态
#hdparm -i /dev/hda  #查看磁盘参数
#grep MenTotal/proc/meminfo #查看内存总量
#hostname  #查看计算机名
#uptime  #查看系统运行时间、用户数、负载
#fdisk -l #查看所有分区

4.查看一个进程的端口号
如果直到进程ID的话,
#netstat -anp |grep 进程ID
不知道就用ps查询进程ID:
#ps -ef | grep 进程名
5.awk、sed等文件处理工具的使用
gerp 查找, sed 编辑, awk 根据内容分析并处理

  • sed 主要用于编辑
    1.sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作
    2.命令格式
    sed [-nefri] ‘command’ 输入文本
    常用选项:
    -n:使用安静(silent)模式。在一般的sed的用法中,所有来自STDIN的资料一般都会被列出到荧幕上。但如果加上-n参数后,则只有经过sed特殊处理的第一行(或者动作)才会被列出来。
    -e:直接在指令列模式上进行sed的动作编辑
    -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
    -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
    -i∶直接修改读取的档案内容,而不是由萤幕输出。
    常用命令:
    a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
    c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
    d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
    i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
    s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
#sed '1d' ab              #删除文件ab的第一行
# sed '$d' ab              #删除最后一行
# sed '2,$d' ab           #删除第二行到最后一行

# sed -n '1p' ab           #显示第一行 

# sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
# sed -n '/\$/p' ab        #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

 # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
 # sed '1c Hi' ab                #第一行代替为Hi
 替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)
  # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
  # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
  • awk 分析和处理
  • 使用方法
    awk ‘{pattern + action}’ {filenames}
1.命令行方式
awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk

3.将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
  • grep 截取
    文本搜集工具, 结合正则表达式非常强大
    主要参数 []
    -c : 只输出匹配的行
    -I : 不区分大小写
    -h : 查询多文件时不显示文件名
    -l : 查询多文件时, 只输出包含匹配字符的文件名
    -n : 显示匹配的行号及行
    -v : 显示不包含匹配文本的所有行(我经常用除去grep本身)
    基本工作方式: grep 要匹配的内容 文件名, 例如:
    grep ‘test’ d* 显示所有以d开头的文件中包含test的行
    grep ‘test’ aa bb cc 显示在 aa bb cc 文件中包含test的行
    grep ‘[a-z]{5}’ aa 显示所有包含字符串至少有5个连续小写字母的串

熟练使用一种linux下的编辑器
常见的linux文件系统有哪几种?有哪些区别

参考:
https://blog.csdn.net/xiongluo0628/article/details/81461053
https://blog.csdn.net/qq_22944825/article/details/77865214
http://www.imooc.com/article/11015
https://www.cnblogs.com/leedaily/p/8329445.html
https://www.cnblogs.com/ruanbo/p/9069500.html
https://www.cnblogs.com/yangjig/p/10040300.html

你可能感兴趣的:(笔试面试)