面试操作系统总结

1 进程和线程的区别

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配的一个独立单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其他相关资源,该进程就被运行起来。

线程是进程的一个实体,是CPU调度和分配的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。

引入线程主要有以下4个方面的优点:

1 易于调度

2 提高并发性。通过线程可以方便有效地实现并非

3 开销小。创建线程比创建进程要快,所需要的开销也更少。

4 有利于发挥多处理器的功能。通过创建多线程,每个线程都在一个处理器上运行,从而实现应用程序的并行,使每个处理器都得到充分运行。

需要注意的是,尽管线程与进程很相似,但两者也存在很大的不同,区别如下:

1)一个线程必定属于也只能属于一个进程;而一个进程可以拥有多个线程并且至少拥有一个线程

2)属于一个进程的所有线程共享该进程的所有资源,包括打开的文件、创建的socket等。不同的进程相互独立。

3)线程又被称为轻量级进程。进程有进程控制块,线程也有线程控制块。但线程控制块比进程控制块小很多。线程间切换代价小,进程间切换代价大。

4)进程是程序的一次执行,线程可以理解为程序中一段程序片段的执行。

5)每个进程都有独立的内存空间,而线程共享其所属进程的内存空间。

 

2 线程同步有哪些机制

现在流行的线程同步互斥的控制机制有4种方法实现:临界区、互斥量、信号量和事件。

1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。

2)互斥量:为协调共同对一个共享资源的单独访问而设计。只有拥有互斥对象的线程才有权去访问系统的公共资源,因为互斥对象只有一个,所以能够保证资源不会同时被多个线程访问。互斥不仅能实现统一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

3)信号量:为控制一个具有有限数量的用户资源而设计。它允许多个现在在同一时刻去访问同一资源,但一般需要限制同一时刻访问此资源的最大线程数目。

4)事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

1 临界区和互斥量与信号量的区别

临界区和互斥量与信号量的区别在于,互斥量和信号量在系统中任何进程里都是可见的,也就是说,一个进程创建了一个互斥量或信号量,另一个进程试图去获取该锁是合法的。然而,临界区的作用范围仅限于本进程,其他的进程无法获取该锁。除此之外,临界区具有和互斥量相同的性质。即两者的区别是mutex可以用于进程之间互斥,critical section是线程之间的互斥。

3 内核线程和用户线程的区别以及系统进程和用户进程的区别

根据对操作系统内核是否对线程感知,可以把线程分为内核线程和用户线程。

内核线程建立和销毁都是由操作系统负责、通过系统调用完成的,操作系统在调度时,参考各进程的线程运行情况作出调度决定。如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU。

和内核线程相对应的是用户线程,用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,用户进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

引入用户线程有以下4方面的优势:

1)可以在不支持线程的操作系统中实现。

2)创建和销毁线程、线程切换等线程管理的代价比内核线程少得多

3)允许每个线程定制自己的调度算法,线程管理比较灵活

4)线程能够利用的表空间和堆栈空间比内核级线程多

用户线程的缺点主要有以下两点:

1)同一进程中只能同时有一个线程在运行,如果一个线程使用了系统调用而阻塞,那么整个进程都会被挂起

2)页面失效也会产生类似的问题。

系统进程和用户进程

系统进程:可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
用户进程:通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。

4 用户态和核心态的区别

内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在0级特权级上时,就可以称之为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。通常来说,以下三种情况会导致用户态到内核态的切换:

1)系统调用

这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。

2)异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

3)外围设备的中断

当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

5 内核栈和用户栈的区别

操作系统中,每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。

内核栈是内存中属于操作系统空间的一块区域,其主要用途为:
1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;

2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。

PS:那么为什么不直接用一个栈,何必浪费那么多的空间呢?            

1)如果只用系统栈。系统栈一般大小有限,如果中断有16个优先级,那么系统栈一般大小为15(只需保存15个低优先级的中断,另一个高优先级中断处理程序处于运行),但用户程序子程序调用次数可能很多,那样15次子程序调用以后的子程序调用的参数、返回值、返回点以及子程序(函数)的局部变量就不能被保存,用户程序也就无法正常运行了。

2)如果只用用户栈。我们知道系统程序需要在某种保护下运行,而用户栈在用户空间(即cpu处于用户态,而cpu处于核心态时是受保护的),不能提供相应的保护措施(或相当困难)。

6 进程的调度算法

1)先来先服务调度算法。先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度, 也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业, 而不利于I/O繁忙型的作业(进程)。

2)短作业(进程)优先调度算法。短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度, 也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

3) 优先权调度算法的类型。为了照顾紧迫性作业,使之进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。

4) 高响应比优先调度算法

5)基于时间片的轮转调度算法

6)多级反馈队列调度算法

Windows内存管理的方式(块式、页式、段式、段页式)

块式管理

把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断载入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,但时易于管理。

页式管理

把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。

段式

把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。

段页式管理。(现在常用)

结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。

8 分段和分页的区别是什么

页是信息的物理单位,分页是为了实现离散分配方式,以消减内存的零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。

段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

9 什么是虚拟内存?

虚拟内存简称虚存,是计算机系统内存管理的一种技术。它是相对于物理内存而言的,可以理解为”假的“内存。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),允许程序员编写并运行比实际系统拥有的内存大得多的程序。

虚存比实存有以下好处:

1)扩大地址空间。

2)内存保护。每个进程运行在各自的虚拟内存空间,互相不能干扰对方。

3)公平分配内存。采用了虚存之后,每个进程都相当于有通用大小的虚存空间。

4)当进程需要通信时,可采用虚存共享的方式实现。

不过,使用虚存也是有代价的,主要表现在以下几个方面:

1)虚存的管理需要建立很多数据结构,这些数据结构也占用额外的内存

2)虚拟地址到物理地址的转换,增加了指令的执行时间

3)页面的换入换出需要磁盘I/O,这是很耗时的

4)如果一页中只有一部分数据,会浪费内存

10 什么是内存碎片?什么是内碎片?什么是外碎片?

内存碎片是由于多次内存分配造成的,当进行内存分配时,内存格式一般为:(用户使用段)(空白段)(用户使用段),当空白段很小的时候可能不能提供给用户足够需要的空间,可能夹在中间的空白段的不能分配而产生空隙。

内碎片是处于区域内部或页面内部的存储块,占有这些区域或页面的进程并不使用这个存储块,而在进程占有这块存储块时,系统无法利用它,直到进程释放它,或进程结束时,系统才能利用这个存储块。

外部碎片是出于任何已分配区域或页面外部的空闲存储块,这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。

11 虚拟地址、逻辑地址、线性地址、物理地址有什么区别?

12 库函数与系统调用由什么不同

13 静态链接与动态链接有什么区别?

14 静态链接库与动态链接库有什么区别?

 

时间: 2024-10-11 19:12:31

面试操作系统总结的相关文章

[综合面试] 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

感谢IT面试群 S-北京-陈磊 的整理分享. 基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会写生产者.消费者问题,完全消化理解) 5. 线程的实现方式. (也就是用户线程与内核线程的区别) 6. 用户态和核心态的区别. 7. 用户栈和内核栈的区别. 8. 内存池.进程池.线程池.(c++程序员必须掌握) 9. 死锁的概念,导致死锁的原因. 10

《Java程序员面试秘笈》—— 面试题3 Linux操作系统下如何安装Java SE开发环境

面试题3 Linux操作系统下如何安装Java SE开发环境 考点:由于大部分的计算机用户都使用Windows作为操作系统,而Java语言是具有跨平台优势的,不同企业有不同的开发环境,本试题考察求职者是否有在Linux下开发Java的经验.Linux环境下的Java安装是一个基础问题. 出现频率: [面试题解析]该问题有两个关键点,一个是Linux版本Java SDK的文件类型,另外一个是Linux环境变量的配置. 参考答案: Oracle发布的Linux操作系统Java包有JDK和JRE两种版

软件测试员----面试,你准备好了么?

  最近有机会做一些面试工作,主要负责面试软件测试人员招聘的技术面试.   之前一直是应聘者的角色,经历了不少次的面试之后,多少也积累一点面试的经验,现在发生了角色转变.初次的面试就碰到个工作年限比我长的,也没有时间仔细了解对方的简历,再加上应聘者比较"强势".面试情况是比较糟糕的. 有同学会说,唉!不就失去了一个应聘者嘛.多面几个就好了!这不单单是失去应聘者,面试者对面试官的印象更重要.面试官的能力与表现对于初次面试者来说往往代表的是公司的,更具体点是测试团队的能力. 如果面试官都很

Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了

本文讲的是Google Interview University - 坚持完成这套学习手册,你就可以去 Google 面试了, 这是我为了从 web 开发者(自学.非计算机科学学位)蜕变至 Google 软件工程师所制定的计划,其内容历时数月. 这一长列表是从 Google 的指导笔记 中萃取出来并进行扩展.因此,有些事情你必须去了解一下.我在列表的底部添加了一些额外项,用于解决面试中可能会出现的问题.这些额外项大部分是来自于 Steve Yegge 的"得到在 Google 工作的机会&quo

程序员面试资源大收集(转)

资源一:<crack the code interview>--谷歌资深技术面试官经典之作 本书的中文目录如下,大部分内容由Hawstein君原创翻译,部分缺失的由快课网Jay13补充. 1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个单链表中返回倒数第n个元素 2.3 给定链表中间某结点指针,删除链表中该结点 2.4 求由两个链表结点组成的数

前端面试题目搜集

前端面试题目搜集 一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器得到html代码 e. 浏览器解析html代码,并请求html代码中的资源 f. 浏览器对页面进行渲染呈现给用户 参考<一次完整的HTTP事务是怎样一个过程>   1.2.谈谈你对前端性能优化的理解 a. 请求数量:合并脚本和样式表,CSS Sprites,拆分初始化负载,划分主

2018web前端面试总结

从今年3月份开始面试笔试找实习找校招到现在也半年多了,拿到了不少offer,也有了自己的一点心得体会,这里写出来分享一下,拙见勿喷. 注意一下,以下的观点仅代表我个人的体会不代表任何人任何组织和任何公司. 关于流程 一般的实习&校招招聘大体有这么一个流程:(这里我个人都是走的官网投递的渠道,没有经历过宣讲会的环节,这一部分我没啥经验) 笔试 笔试作为招聘的第一个环节,一般考察的都是专业基础知识,这里会着重考察你在学校的计算机相关基础,也就是很多人会发现,我明明考的是前端的卷子为啥前端的知识点考的

Java多线程和并发基础面试问答,看过后你不会后悔

第一:Java多线程面试问题 1:进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. 2:多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态.多个线程共享堆内存(heap

Java面试笔试题大汇总(最全+详细答案)

声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入.本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个题都自己测试给出了答案 ,如果你对某个题有疑问或者不明白,可以电脑端登录把题目复制下来然后发表评论,大家一起探讨,也可以电脑端登录后关注我给我发私信,我们一起进步! 以下内容来自这位前辈 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题