0%

EveryThing About Operation System

堆和栈的区别

  • 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些堆可以被看成是一棵树,如:堆排序。

  • 由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放。一种先进后出的数据结构

用户态,内核态以及如何切换。

  • 内核态:运行操作系统程序,控制计算机的硬件资源,并提供上层应用程序运行的环境,运行在高特权级上。内核态切换到用户态的途径——>设置程序状态字

  • 用户态:运行用户程序上层应用程序的活动空间,运行在低特权级别上。为了使上层应用能够访问到这些资源,内核为上层应用提供访问的接口。用户态切换到内核态的唯一途径(申请外部资源)——>中断/异常/系统调用(读写文件,申请堆内存,缺页(虚拟内存地址没有映射到物理内存地址,在Java中New一个对象))。系统调用 System, Callaccept:套接字的客户端连接套接字,bind套接字的服务端监听端口

信号和信号量的关系

  • 信号:(signal)是一种处理异步事件的方式。信号时比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。linux除了支持unix早期的信号语义函数,还支持语义符合posix.1标准的信号函数sigaction。
  • 信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

    进程和线程,进程之间的通信方式等

    啥是进程,啥是线程,他们的本质区别?我们运行一个程序时,数据放在哪里?代码放在哪里?咋就还要分堆和栈?线程切换时是上下文是啥意思?

虚拟地址是什么鬼东西?线程需要那么多种状态干啥子?什么是乐观锁、悲观锁?死锁是怎么造成的?解决死锁的策略有哪些?等等
2、进程、线程究竟是由什么组成的?有哪些数据?

3、内存管理,包括:虚拟内存(重点)、分页、分段、分页系统地址映射、内存置换算法(重点)。

安全系统不会死锁

进程是什么

进程是具有一定独立功能的程序,它是系统进行资源分配和调度的一个独立单位,重点在系统调度和独立的单位,也就是说进程是可以独立运行的一段程序。

线程是什么

线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,在运行时,只是暂用一些计数器,寄存器,和栈。

进程与线程的关系

  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  • 线程在执行过程中,需要协作同步,不同进程的线程间要利用消息通信的方法实现同步。
  • 处理机分配给线程,即真正在处理机上运行的是线程。
  • 线程是指进程内的一个执行单元,也是进程内的可调度实体。
  • 进程会释放资源,线程不会。

    从4个角度来分析进程与线程之间的区别

  • 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
  • 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行
  • 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源
  • 系统开销:创建或撤销进程时,系统都要为之分配或回收系统资源,如内存空间,I/O设备等,OS所付出的开销显著大于在创建或撤销线程时的开销,进程切换的开销也远大于线程切换的开销

    进程有几种状态

  • 就绪状态:进程已经获得除处理机以外的所有资源,等待分配处理机资源
  • 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数目
  • 阻塞状态:进程等待某种条件,在条件满足之前无法运行

    线程有几种状态

  • 执行状态:表示线程已经获得处理机而正在运行
  • 就绪状态:指线程已经具备了各种执行条件,只需再获得CPU便可以立即执行难
  • 阻塞状态:线程在执行过程中因某事受阻而处于暂停状态

    操作系统进程调度有哪几种

  • 非抢占式方式:采用这种调度方式时,一旦把处理机分配给某个进程后,就一直让它运行下去,决不会因为时钟中断或任何其它原因去抢占当前正在运行进程的处理机,直至该进程完成,或发生某种事件而被阻塞时,才把处理机分配给其他进程
  • 抢占式方式:这种调度方式允许调度程序根据某种原则,去暂停某个正在执行的进程,将已经分配给该进程的处理机重新分配给另一进程,在现代OS中广泛采用抢占方式。
    进程为什么需要同步
    进程同步机制的主要任务是对多个相关进程在执行次序上进行协调,使得并发执行的各个进程之间能按照一定的规则或时序共享系统资源,并能很好的相互合作,从而使得程序的执行具有可再现性

列举几种进程同步机制,并说明其优缺点

  • 硬件同步机制:
  • 信号量机制:
  • 管程机制:

    进程之间通信的途径

    进程之间通信方向
  • 管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常是指父子进程关系
  • 有名管道:有名管道也是半双工的通信方式,但是它允许无亲缘关系的进程间的通信
  • 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,因此,主要作为进程间以及同一进程内不同线程之间的同步手段
  • 消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点
  • 信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
  • 共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程通信方式运行效率低而专门设计的,它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信
  • Socket(套接字):套接字可以用于不同的进程间的通信

    线程之间通信的途径

  • 锁机制:包括互斥锁,条件变量,读写锁 互斥锁提供了以排他方式防止数据结构被并发修改的方法 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止,对条件的测试是在互斥锁的保护下进行的,条件变量始终与互斥锁一起使用 读写锁允许多个线程同时读共享数据,而对写操作是互斥的
  • 信号量机制:包括无名线程信号量和命名线程信号量
  • 信号机制:类似进程间的信号处理 注意:线程间的通信的目的主要是用于线程的同步,所以线程没有像进程通信中的用于数据交换的通信机制

多线程如何同步

临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别

临界区:

通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

互斥量:

采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。

信号量:

它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。

P操作申请资源:
  • S减1;
  • 若S减1后仍大于等于零,则进程继续执行;
  • 若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。   

    V操作释放资源:
  • S加1;

  • 若相加结果大于零,则进程继续执行;
  • 若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。   

    事件:

    通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 .

总结:

  • 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
  • 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
  • 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。  

死锁的定义

如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的

进程死锁的原因

多个进程对资源的争夺,包括对不可抢占资源和对可消耗资源

进程死锁的4个必要条件

  • 互斥条件:进程对所分配到的资源进行排它性使用,即在一段时间内,其资源只能被一个进程占用,如果此时还有其它进程请求该资源,则请求进程只能等待,直至占有该资源的进程用完释放
  • 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其它进程占有,此时请求进程被阻塞,但对自己已经获得的资源保持不放
  • 不可抢占条件:进程已经获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放
  • 循环等待条件:在发生死锁时,必然存在一个进程-资源循环链,即进程集合{P0,P1,……,PN}中的P0正在等待一个P1占用的资源,P1正在等待P2占用的资源,……,PN 正在等待P0占用的资源

    进程死锁的处理

  • 预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一种
  • 避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态
  • 检测死锁:通过检测机构及时检测出死锁的发生,然后采取适当的措施,把进程从死锁中解脱出来
  • 解除死锁:当检测到系统中已经发生死锁时,采取相应的措施,将进程从死锁状态解脱出来,常用的方法是撤销一些进程,回收他们的资源,将它们分配给已经处于阻塞状态的进程,使其能够继续运行

    描述实时操作系统的基本特征

    实时操作系统是指操作系统工作时,其各种资源可以根据需要随时进行动态分配,由于各种资源可以进行动态分配,因此,其处理事务的能力较强 换言之,在特定时间内完成特定的任务,具有实时性与可靠性

操作系统中断与轮询的基本特点

  • 轮询:对I/O设备的程序轮询的方式是早期的计算机系统对I/O设备的一种管理方式,它定时对各种设备轮流询问一遍有无处理要求。轮询占据了CPU相当一部分处理时间,因此,程序轮询是一种效率较低的方式,在现代计算机系统中已经很少应用
  • 中断:中断是指CPU在正常运行程序的过程中,由于发生的内部或外部的特定的事件,使得CPU中断正在运行的程序,而转到响应的服务程序去处理

    什么是临界区,如何解决冲突

    每个进程中访问临界资源的那段程序称为临界区,每次只准许一个进程进入临界区,进入后不允许其他进程进入 解决冲突的方法:

  • 如果有若干个进程要求进入空闲的临界区,一次仅允许一个进程进入

  • 任何时候,处于临界区内的进程不可以多于一个,如果已经有进程进入自己的临界区,则其他所有试图进入临界区的进程必须等待
  • 进入临界区内的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区
  • 如果进程不能进入自己的临界区,则应该让出CPU,避免进程出现“忙碌”现象。

    windows下内存是如何管理的

    windows操纵内存可以分为两个层面,物理内存和虚拟内存。

进程调度算法(长中短)

  • 时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。
  • 先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。
  • 优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。
  • 多级反馈队列调度算法:将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。
  • 高响应比优先调度算法:根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。高响应比优先算法在等待时间相同的情况下,作业执行的时间越短,响应比越高,满足段任务优先,同时响应比会随着等待时间增加而变大,优先级会提高,能够避免饥饿现象。优点是兼顾长短作业,缺点是计算响应比开销大,适用于批处理系统。

进程调度算法(长中短)

  • 长程调度,把作业后背队列调入内存,又称为作业调度或高级调度,这种调度将已进入系统并处于后备状态的作业按某种算法选择一个或一批,为其建立进程,并进入主机,当该作业执行完毕时,还负责回收系统资源,在批处理系统中,需要有作业调度的过程,以便将它们分批地装入内存,在分时系统和实时系统中,通常不需要长期调度。它的频率比较低,主要用来控制内存中进程的数量。
  • 中程调度,内外存阻塞进程来回切换,又称为交换调度。它的核心思想是能将进程从内存或从CPU竞争中移出,从而降低多道程序设计的程度,之后进程能被重新调入内存,并从中断处继续执行,这种交换的***作可以调整进程在内存中的存在数量和时机。其主要任务是按照给定的原则和策略,将处于外存交换区中的就绪状态或等待状态的进程调入内存,或把处于内存就绪状态或内存等待状态的进程交换到外存交换区。
  • 短程调度,把进程分配给CPU执行。又称为进程调度、低级调度或微观调度。这也是通常所说的调度,一般情况下使用最多的就是短期调度。它的主要任务是按照某种策略和算法将处理机分配给一个处于就绪状态的进程,分为抢占式和非抢占式。 可以从下图中清晰的看到这些调度之间的区别。

磁盘寻道算法

  • 先来先服务算法(FCFS)First Come First Service

这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。在单用户系统环境中,I/O队列的长度通常为1,因此,先来先服务FCFS算法是最经济实惠的磁盘调度算法.

先来先服务 (125)86.147.91.177.94.150.102.175.130

  • 最短寻道时间优先算法(SSTF) Shortest Seek Time First

该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。最短寻道时间优先(125)130.147.150.175.177.102.94.91.86

  • 扫描算法(SCAN)电梯调度

扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。电梯调度(125)102.94.91.86.130.147.150.175.177

  • 循环扫描算法(CSCAN)

循环扫描算法是对扫描算法的改进。如果对磁道的访问请求是均匀分布的,当磁头到达磁盘的一端,并反向运动时落在磁头之后的访问请求相对较少。这是由于这些磁道刚被处理,而磁盘另一端的请求密度相当高,且这些访问请求等待的时间较长,为了解决这种情况,循环扫描算法规定磁头单向移动。例如,只自里向外移动,当磁头移到最外的被访问磁道时,磁头立即返回到最里的欲访磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。循环扫描 (125)130.147.150.175.177.86.91.94.102

學長筆記連結