Openstack前传二(操作系统原理)

来源:互联网 发布:ubuntu 备份系统 编辑:程序博客网 时间:2024/06/05 11:27

1. 进程是通过一个双向量表管理的。每个进程都是通过数据结构task_struct来管理的,也被叫做进程描述符。

每个进程的描述符是有关联性的,是个双向链表。 创建一个进程必须先建立一个描述符;如果删除的话,则从双向链表删除,则进程无法被跟踪了。

这个进程描述符包含:

1.进程状态;

2.线程信息;

3.内部标志;

4.内存映射相关信息;

5.父进程

6.tty

7.fs

8.signal

etc....


2.进程如何进行切换。

也叫做上下文切换。 A->B , A的进程描述符被挂起,则在CPU维持的信息被保存,这个过程是现场保存。这个信息是被保存在进程描述符中了。

B进程被调用为恢复现场,将堆栈信息或者指令指针重写入CPU。


3.Linux支持进程抢占

 根据优先级来排队。当然不是随时可以抢的,不然没天理了。Linux有内部的时钟tick,每一次tick上升沿产生一次时钟中断。

优先级低的一直不被运行,怎么办?那么首先看下进程类别:

1.Linux 进程类别:

交互型,IO密集型的。一般是优先级比较高的。

 批处理进程,主要是CPU密集型的。优先级不太高,一般做守护进程。

 实时性的,优先级特别高,必须马上运行。

分配策略:批处理类的,优先级低,但是CPU时间片高。

   交互性的,优先级高,但是每次获得的时间很少。

优先级(Priority)

实时优先级(1-99),数字越小,优先级越低。通常与内核相关的。

    静态优先级(100-139)数字越小,优先级越高。

    所有的实时优先级比静态优先级都高。即(1-99 > 100-139) 利用TOP可以查看每个进程的PR。


调度类别: FIFO (实时)

     RR (轮转)   (实时)

     Other:用来调度100-139的进程。  (用户)

如何让进程达则兼济天下,所以引入动态优先级。如有一个进程长久未被运行,则【临时】调动其优先级。主要是对于100-139优先级的进程而言。

动态优先级算法:dynamic priorty = max (100 , min(static prority - bonus + 5 , 139));

手动调整用户优先级:       nice N COMMAND.

renice   -n   # PID

调整实时(内核)进程优先级:

chrt  --fifo

chrt   --rr

 

系统启动:

Kernel -->init

然后使用fork()来创建子进程。最重要的是创建进程描述符(task_struct).

刚创建的时候,是和父进程指向同一位置。写时复制(COW),大大的减少进程创建的开销。但是实际上还是需要不少资源的。









  










0 0
原创粉丝点击