进程管理-问答

  1. 什么是进程模型?
    所有的程序,包括操作系统,都被组织成若干顺序进程
  2. 进程怎么创建?
    (1)正在运行的进程创建(2)用户要求创建(3)系统初始化(4)批处理初始化
  3. unix可以直接创建进程吗?
    不行,得fork和execve连着来
  4. fork会做什么?
    fork会让子进程得到一个跟父进程一样的地址空间(副本),但是他们时间不会共享内存,要么是共享内存无法写入,要么是共享内存只能通过写时复制的方式
  5. 进程存在层次吗?
    在unix中存在,父进程和子进程之间有着继承关系形成进程组,当用户发出一个信号时,进程组所有成员都可以得到,windows中 不存在层次(有句柄,但是句柄可以赋值传递)
    6.进程的状态以及转换方式?
    阻塞,运行,就绪,操作系统发现无法运行就转入阻塞(比如说等待IO),调度程序负责运行和就绪之间的转换,如果等待的事情发生(比如说输入),那么阻塞会转为就绪
  6. 什么是进程表?作用是什么?
    进程表是操作系统为了可以再次启动进程而存储的信息, 也成为进程控制块(PCB)
  7. 线程和进程的区别?
    线程共享了地址空间
  8. 为什么设定了thread_yield
    因为线程没有办法通过时钟中断来强制让出CPU所以需要让线程自动交出CPU,而且进程之间互不认识需要竞争,而线程往往是由同一个程序员编写,可以协作
  9. 用户态的线程实现与核心态的线程实现的区别?
    优点:
    (1)用户态不依赖于操作系统,通用性强
    (2)用户态不需要陷入内核,不需要对内存高速缓存刷新,快
    (3)用户态可以控制自己的线程调度,比如说一个垃圾回收线程你可能不希望不经意的停止
    缺点:
    (1) 如何处理一个会导致阻塞的系统调用是一个问题,因为我们之所以用线程,就是希望说避免阻塞的线程影响其他线程,而一个会导致阻塞的系统调用是不可接受的,目前有两种方式,要么我就直接改写操作系统,实现非阻塞系统调用,但是这个成本很高,还需要修改系统,违背了我们之前的第一条,第二种办法适用于一些操作系统,它们会提供select语义让你知道这个系统调用是否会导致阻塞,如果有这个语义,我们就可以说在执行系统调用之前,先判断一下,如果会阻塞,那就切换运行另外一个线程,直到语义安全为止
    (2)第二个问题也有点像,就是缺页中断,由于程序的所有指令不是一次性放入的,所以如果内存发现没有,操作系统会中断这个,进行磁盘IO获取指令(页面故障)
    (3)单独进程里面是没有时钟中断的,因此没有办法用轮转调度,所以如果一个线程开始运行,那么没有任何办法中断(除非它自己放弃回归),一种解决办法是进程自己主动要时钟中断,但是效率不高,而且可能会导致破坏了进程自身的时钟(如果线程也有时钟中断)
    核心态线程的话就没有这些问题,最大的问题就是慢,即便如此,还是可能有其他潜在问题,比如说一个进程被fork之后,线程是否该被复制呢?
    11.列举一下实现互斥的几种方案
    (1)屏蔽中断,就是不对任何中断响应(包括时钟中断),那么就不会切换进程,就不用担心共享内存被修改,缺点在于,将屏蔽中断的权利交给用户不是一个让人放心的选择(不过在内核中倒是不错),而且对于多核CPU无助于是
    (2)锁,但是软件方案的锁没法处理(两进程同时看到,同时设置)的情景
    (3)严格的控制转入,严格按1,2,3,4来一次进入临界区,缺点是如果有一个很慢的进程,则需要等待(因为轮到它进去,而它在执行非临界区代码)
    (4) Peterson算法,可以保证严格意义上的软件方案的锁
    (5)硬件支持,有些多核cpu支持指令(测试并加锁test and set lock),该指令将会读取内存字,将其放入寄存器,然后对内存字写入,硬件保证了该读写过程是不可分割的(用锁住内存总线的方式),因此可以读取并设置为1,判断读取的前值是否是0,是就进入,否则就循环
    以上的算法都是忙等待的,需要浪费cpu时间,而且会有优先级反转的问题(A比B优先级高,只要有就绪态就一定会运行A,但是假设A先阻塞了,B进入了临界区,这时候A又就绪了,由于优先级高,A会一直获取时间,但是又在忙等待,而B呢因为没有CPU时间没法执行到退出)
  10. 管程是什么?作用是什么?

硬件时钟会提供一定频率的周期性中断,进程调度算法可以在每一个中断时间或者是每k个中断时间进行调度决策,调度算法可以分为两类,非抢占式和抢占式,非抢占式会随机挑选一个进程,然后允许长时间执行,直至被阻塞(IO或等待另一个进程)或者自动释放CPU,在时钟中断时,非抢占算法不会进行调度,处理完时钟中断后,没有优先级更高的进程等待
批处理系统的话希望吞吐量大,周转时间小,经常用的调度算法包括First ComeFirst Served和最短作业时间优先(需要都可以选择且知道时间)以及最短剩余时间(抢占式,选择剩下时间最短的,用于新的短作业)
交互式系统的话,一是轮转调度(round robin),分时间片,要考量时间片的长度,一般20-50ms,二是优先级调度,高优先级先运行,为了能让低优先级也运行,可以再每个时钟中断降低当前进程的优先级,然后如果什么时候优先级下降到没有其他高了,就切换进程,或者设置最长时间片,三是多级队列,就是说最高优先级一个时间片,次高2个,以此类推,每次进程用完,就降级,这样的话,随着时间退役,进程频率越来越低(因为优先级低)但是每次执行的时间片越来越长,第四种办法是最短进程优先,估算该进程要花的时间,然后越短越优先(估算办法可能是老化,比如说(prev+pres)/2 第五种办法是保证调度,比如说我有N个进程,那么每个就应该1/N,我就统计已经实现的时间片数,然后来判断应该要给多少 第六中办发就是彩票调度,优先级高的获得更多的彩票(有更多的可能获取时间)

  1. 实时调度的可调度性怎么判断?
    sum(处理时间/周期)<1

你可能感兴趣的:(进程管理-问答)