计算机操做系统

计算机操做系统

一、简单说下你对并发和并行的理解?算法

  1. 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生;
  2. 并行是在不一样实体上的多个事件,并发是在同一实体上的多个事件;

二、同步、异步、阻塞、非阻塞的概念数组

同步:当一个同步调用发出后,调用者要一直等待返回结果。通知后,才能进行后续的执行。
异步:当一个异步过程调用发出后,调用者不能马上获得返回结果。实际处理这个调用的部件在完成后,经过状态、通知和回调来通知调用者。
阻塞:是指调用结果返回前,当前线程会被挂起,即阻塞。安全

非阻塞:是指即便调用结果没返回,也不会阻塞当前线程。并发

  1. 进程和线程的基本概念

进程:进程是系统进行资源分配和调度的一个独立单位,是系统中的并发执行的单位。异步

线程:线程是进程的一个实体,也是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程。函数

四、进程与线程的区别?高并发

1. 进程是资源分配的最小单位,而线程是 CPU 调度的最小单位;性能

2. 建立进程或撤销进程,系统都要为之分配或回收资源,操做系统开销远大于建立或撤销线程时的开销;
3. 不一样进程地址空间相互独立,同一进程内的线程共享同一地址空间。一个进程的线程在另外一个进程内是不可见的;测试

4. 进程间不会相互影响,而一个线程挂掉将可能致使整个进程挂掉;spa

五、为何有了进程,还要有线程呢?

 进程可使多个程序并发执行,以提升资源的利用率和系统的吞吐量,可是其带来了一些缺点:

1. 进程在同一时间只能干一件事情;
2. 进程在执行的过程当中若是阻塞,整个进程就会被挂起,即便进程中有些工做不依赖与等待的资源,仍然不会执行。

基于以上的缺点,操做系统引入了比进程粒度更小的线程,做为并发执行的基本单位,从而减小程序在并发执行时所付出的时间和空间开销,提升并发性能。

  1. 进程的状态转换
    进程包括三种状态:就绪态、运行态和阻塞态。

       

1. 就绪 —> 执行:对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进程便由就绪状态变为执行状态;

2. 执行 —> 阻塞:正在执行的进程因发生某等待事件而没法执行,则进程由执行状态变为阻塞状态,如进程提出输入/输出请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)得不到知足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等;

3. 阻塞 —> 就绪:处于阻塞状态的进程,在其等待的事件已经发生,如输入/输出完成,资源获得知足或错误处理完毕时,处于等待状态的进程并不立刻转入执行状态,而是先转入就绪状态,而后再由系统进程调度程序在适当的时候将该进程转为执行状态;

4. 执行 —> 就绪:正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。

七、进程间的通讯方式有哪些?

进程间通讯(IPC,InterProcess Communication)是指在不一样进程之间传播或交换信息。IPC 的方式一般有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams 等。其中 Socket 和 Streams 支持不一样主机上的两个进程 IPC。

  • 管道
  1. 它是半双工的,具备固定的读端和写端;

2. 它只能用于父子进程或者兄弟进程之间的进程的通讯;
3. 它能够当作是一种特殊的文件,对于它的读写也可使用普通的 read、write  等函数。可是它不是普通的文件,并不属于其余任何文件系统,而且只存在于内存中。

  • 命名管道
  1. FIFO 能够在无关的进程之间交换数据,与无名管道不一样;

2. FIFO 有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

  • 消息队列
  1. 消息队列,是消息的连接表,存放在内核中。一个消息队列由一个标识符 ID 来标识;
  2. 消息队列是面向记录的,其中的消息具备特定的格式以及特定的优先级;

3. 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除;
4. 消息队列能够实现消息的随机查询,消息不必定要以先进先出的次序读取,也能够按消息的类型读取。

  • 信号量

1. 信号量(semaphore)是一个计数器。用于实现进程间的互斥与同步,而不是用于存储进程间通讯数据;

2. 信号量用于进程间同步,若要在进程间传递数据须要结合共享内存;

3. 信号量基于操做系统的 PV 操做,程序对信号量的操做都是原子操做;
4. 每次对信号量的 PV 操做不只限于对信号量值加 1 或减 1,并且能够加减任意正整数;
5. 支持信号量组。

  • 共享内存
  1. 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区;
  2. 共享内存是最快的一种 IPC,由于进程是直接对内存进行存取。

八、进程的调度算法有哪些?
调度算法是指:根据系统的资源分配策略所规定的资源分配算法。经常使用的调度算法有:先来先服务调度算法、时间片轮转调度法、短做业优先调度算法、最短剩余时间优先、高响应比优先调度算法、优先级调度算法等等。

  • 先来先服务调度算法

先来先服务调度算法是一种最简单的调度算法,也称为先进先出或严格排队方案。当每一个进程就绪后,它加入就绪队列。当前正运行的进程中止执行,选择在就绪队列中存在时间最长的进程运行。该算法既能够用于做业调度,也能够用于进程调度。先来先去服务比较适合于常做业(进程),而不利于段做业(进程)。

  • 时间片轮转调度算法

时间片轮转调度算法主要适用于分时系统。在这种算法中,系统将全部就绪进程按到达时间的前后次序排成一个队列,进程调度程序老是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片。

  • 短做业优先调度算法

短做业优先调度算法是指对短做业优先调度的算法,从后备队列中选择一个或若干个估计运行时间最短的做业,将它们调入内存运行。 短做业优先调度算法是一个非抢占策略,他的原则是下一次选择预计处理时间最短的进程,所以短进程将会越过长做业,跳至队列头。

  • 最短剩余时间优先调度算法

最短剩余时间是针对最短进程优先增长了抢占机制的版本。在这种状况下,进程调度老是选择预期剩余时间最短的进程。当一个进程加入到就绪队列时,他可能比当前运行的进程具备更短的剩余时间,所以只要新进程就绪,调度程序就能可能抢占当前正在运行的进程。像最短进程优先同样,调度程序正在执行选择函数是必须有关于处理时间的估计,而且存在长进程饥饿的危险。

  • 高响应比优先调度算法

高响应比优先调度算法主要用于做业调度,该算法是对 先来先服务调度算法和短做业优先调度算法的一种综合平衡,同时考虑每一个做业的等待时间和估计的运行时间。在每次进行做业调度时,先计算后备做业队列中每一个做业的响应比,从中选出响应比最高的做业投入运行。

  • 优先级调度算法

优先级调度算法每次从后备做业队列中选择优先级最髙的一个或几个做业,将它们调入内存,分配必要的资源,建立进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。

九、什么是死锁?

死锁,是指多个进程在运行过程当中因争夺资源而形成的一种僵局,当进程处于这种僵持状态时,若无外力做用,它们都将没法再向前推动。 以下图所示:若是此时有一个线程 A,已经持有了锁 A,可是试图获取锁 B,线程 B 持有锁 B,而试图获取锁 A,这种状况下就会产生死锁。

十、产生死锁的缘由?

因为系统中存在一些不可剥夺资源,而当两个或两个以上进程占有自身资源,并请求对方资源时,会致使每一个进程都没法向前推动,这就是死锁。

竞争资源

例如:系统中只有一台打印机,可供进程 A 使用,假定 A 已占用了打印机,若 B 继续要求打印机打印将被阻塞。

系统中的资源能够分为两类:

  1. 可剥夺资源:是指某进程在得到这类资源后,该资源能够再被其余进程或系统剥夺,CPU 和主存均属于可剥夺性资源;

2. 不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行收回,只能在进程用完后自行释放,如磁带机、打印机等。

  • 2. 进程推动顺序不当

例如:进程 A 和 进程 B 互相等待对方的数据。

十一、死锁产生的必要条件?

1. 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。

2. 请求和保持条件:当进程因请求资源而阻塞时,对已得到的资源保持不放。

3. 不剥夺条件:进程已得到的资源在未使用完以前,不能剥夺,只能在使用完时由本身释放。

4. 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。

十二、解决死锁的基本方法?
1. 预防死锁
2. 避免死锁
3. 检测死锁

4. 解除死锁

1三、怎么预防死锁?

1. 破坏请求条件:一次性分配全部资源,这样就不会再有请求了;

2. 破坏请保持条件:只要有一个资源得不到分配,也不给这个进程分配其余的资源:

3. 破坏不可剥夺条件:当某进程得到了部分资源,但得不到其它资源,则释放已占有的资源;

4. 破坏环路等待条件:系统给每类资源赋予一个编号,每个进程按编号递增的顺序请求资源,释放则相反。

1四、怎么避免死锁?

  • 银行家算法

当进程首次申请资源时,要测试该进程对资源的最大需求量,若是系统现存的资源能够知足它的最大需求量则按当前的申请量分配资源,不然就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源。若没超过则再测试系统现存的资源可否知足该进程尚需的最大资源量,若知足则按当前的申请量分配资源,不然也要推迟分配。

  • 安全序列

是指系统能按某种进程推动顺序(P1, P2, P3, ..., Pn),为每一个进程 Pi 分配其所须要的资源,直至知足每一个进程对资源的最大需求,使每一个进程均可以顺序地完成。这种推动顺序就叫安全序列【银行家算法的核心就是找到一个安全序列】。

  • 系统安全状态 

若是系统能找到一个安全序列,就称系统处于安全状态,不然,就称系统处于不安全状态。

1五、怎么解除死锁?

1. 资源剥夺:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其余死锁进程(但应该防止被挂起的进程长时间得不到资源);

2. 撤销进程:强制撤销部分、甚至所有死锁进程并剥夺这些进程的资源(撤销的原则能够按进程优先级和撤销进程代价的高低进行);

3. 进程回退:让一个或多个进程回退到足以免死锁的地步。进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。
1六、什么是缓冲区溢出?有什么危害?

缓冲区为暂时置放输出或输入资料的内存。缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区自己的容量,溢出的数据覆盖在合法数据上。形成缓冲区溢出的主要缘由是程序中没有仔细检查用户输入是否合理。计算机中,缓冲区溢出会形成的危害主要有如下两点:程序崩溃致使拒绝服务和跳转而且执行一段恶意代码。

  1. 分页与分段的区别?
  1. 段是信息的逻辑单位,它是根据用户的须要划分的,所以段对用户是可见的 ;页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的;
  2. 段的大小不固定,有它所完成的功能决定;页大大小固定,由系统决定;
  3. 段向用户提供二维地址空间;页向用户提供的是一维地址空间;
  4. 段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。
  1. 物理地址、逻辑地址、虚拟内存的概念
    1. 物理地址:它是地址转换的最终地址,进程在运行时执行指令和访问数据最后都要经过物理地址从主存中存取,是内存单元真正的地址。
    2. 逻辑地址:是指计算机用户看到的地址。例如:当建立一个长度为 100 的整型数组时,操做系统返回一个逻辑上的连续空间:指针指向数组第一个元素的内存地址。因为整型元素的大小为 4 个字节,故第二个元素的地址时起始地址加 4,以此类推。事实上,逻辑地址并不必定是元素存储的真实地址,即数组元素的物理地址(在内存条中所处的位置),并不是是连续的,只是操做系统经过地址映射,将逻辑地址映射成连续的,这样更符合人们的直观思惟。
  1. 虚拟内存:是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它一般是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在须要时进行数据交换。

1九、页面置换算法有哪些?

请求调页,也称按需调页,即对不在内存中的“页”,当进程执行时要用时才调入,不然有可能到程序结束时也不会调入。而内存中给页面留的位置是有限的,在内存中以帧为单位放置页面。为了防止请求调页的过程出现过多的内存页面错误(即须要的页面当前不在内存中,须要从硬盘中读数据,也即须要作页面的替换)而使得程序执行效率降低,咱们须要设计一些页面置换算法,页面按照这些算法进行相互替换时,能够尽可能达到较低的错误率。经常使用的页面置换算法以下:

  • 先进先出置换算法(FIFO)

先进先出,即淘汰最先调入的页面。

  • 最佳置换算法(OPT)

选将来最远将使用的页淘汰,是一种最优的方案,能够证实缺页数最小。

  • 最近最久未使用(LRU)算法

即选择最近最久未使用的页面予以淘汰

  • 时钟(Clock)置换算法

时钟置换算法也叫最近未用算法 NRU(Not RecentlyUsed)。该算法为每一个页面设置一位访问位,将内存中的全部页面都经过连接指针链成一个循环队列。

20、谈谈你对动态连接库和静态连接库的理解?

静态连接就是在编译连接时直接将须要的执行代码拷贝到调用处,优势就是在程序发布的时候就不须要的依赖库,也就是再也不须要带着库一块发布,程序能够独立执行,可是体积可能会相对大一些。

动态连接就是在编译的时候不直接拷贝可执行代码,而是经过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操做系统,操做系统负责将须要的动态库加载到内存中,而后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时链接的目的。优势是多个程序能够共享同一段代码,而不须要在磁盘上存储多个拷贝,缺点是因为是运行时加载,可能会影响程序的前期执行性能。

相关文章
相关标签/搜索