0%

操作系统相关

  • 进程为什么分那么多状态、为什么要分好多进程队列

    其实我们作为用户不太能理解为啥,进程会分很多状态,在某一瞬间只有一个进程或者几个进程在执行,我进程有执行和停止两种状态,一个链表就行了,然而对于一个正在请求io的进程,io操作还没结束就不能继续下去,cpu处于空闲状态,对于这种进程,在调度的时候,没必要选择这种进程,因为浪费资源,所以,和这种进程类似的进程应该分为一类,赋予一个状态叫做堵塞态,还有一些进程由于操作系统内存不足,把进程的内存镜像换到外存种,显然系统调度的时候倾向于优先调度内存的中进程,所以这一类进程也应该分为一类,赋予一个状态叫做挂起态,挂起状态还得分挂起就绪状态和挂起堵塞状态,因为,有一种比较极端的情况,当内存内的进程全部处于堵塞状态,那么操作系统更倾向于去从外存中换入一个进程执行,而不是运行一个新建的进程来增加操作系统的负担,那么如果挂起状态都是堵塞状态,那么就没有必要去换入进程,所以,需要两种状态,所以,进程最少有5种状态

    • 运行态
    • 就绪态
    • 堵塞态
    • 挂起堵塞态
    • 挂起就绪态

    操作系统应该把cpu的使用权交给就绪态的进程,切换完进程上下文就能执行的,这样才不会浪费资源

    那么为啥要多队列的呢,因为,操作系统的进程成千上万如果都弄成一个链表的话,调度的话,还好,但是,切换某一个进程的状态的时候,特别是堵塞态转变成就绪态,就要遍历整个链表,相当的浪费时间,应该把每一种状态弄个一个链表,甚至链表下面还要有子链表,特别是堵塞状态,最好每一个io设备一个链表,这样能够提高操作系统的调度速度

  • 操作系统的的执行

    其实我就一直在想在linux系统中,当我一个用户态程序调用一个系统调用的时候,这个进程被挂起,然后内核执行完之后,返回给用户态进程,那么内核运行的时候这个进程和用户态进程是不是同一个进程,那多个用户态进程进行系统调用的时候,是同一个进程响应,还是多个进程响应,其实,系统分三种

    • 无进程内核,就是所有的系统的调用都由内核(一个例程)响应
    • 在用户态运行,就一个进程有两种状态,内核态和用户态,当进行系统调用的时候,进程转变状态,运行系统调用
    • 基于进程操作系统,就是说每一种系统调用都有一个例程维护,当一个进程调用一个系统调用,相应的例程进行响应

    linux属于第二种

  • 线程分类及优缺点

    大概分为两种:

    • 第一种是用户级线程,这种线程创建、调度、销毁都在用户态执行,这样的优点在于内核不用额外的支持,就能支持多线程,缺点大概有两个,一个是如果一个多线程程序,其中一个线程,请求io堵塞之后,整个进程都会堵塞,而不是切换到另一个线程继续执行,这样的话,线程的优势不能完全发挥出来,切换线程的代价比切换进程要小的多,这样,也有解决方案,但是得内核添加额外支持,第二个缺点很致命,对于多核计算机,多线程程序,只能分配一个cpu,而不能多个线程并行执行
    • 第二种是内核级线程,优点是可以多个线程并行执行,但是会有用户态到内核态切换的代价

    现在的操作系统大多是结合这两种