进程管理、内核级线程、用户级线程

2020-02-29  本文已影响0人  salix_

一:进程管理

1.进程本身的组织

每个进程都被封装在PCB里面(是一个数据结构),里面装有进程的信息。(比如数据段代码段的位置)

2.进程管理:PCB+进程状态+对应进程状态的队列。
3.多个进程之间如何进行切换?

当前进程启动磁盘读写,不适用CPU了,就把他放到等待队列里面,然后schedule(),schedule()函数先从等待队列里面取出一个进程的PCB。然后把原来进程的PCB转换成现在取出进程的PCB。


具体怎样转换呢?当前线程执行到一半结束了,肯定要保存当前线程使用的寄存器情况把?还要修改寄存器的状态吧?当然还需要记录代码执行到哪里了吧?答案是肯定的
//另外切换的时候不光要切换进程还要切换映射表(每个进程都有一个映射表,规划了这个进程在内存之中的分布,进程可以通过映射表访问到物理地址)
切换进程=切换指令流(线程切换)+切换资源(内存相关)
4.多个进程在内存中分离

通过映射表实现。

5.没有用户级进程

只有核心级进程,因为进程需要访问底层资源。

二: 用户级线程(yield线程)

1.线程切换
2.用户级线程也是就采用yield()进行切换,这个函数可以由我们自己的代码控制,不用到内核中。

也就是说用户级线程可以自己实现调度,不需要内核。

3.优缺点

优点

缺点

三:内核级线程

1.和用户级线程的区别

我们知道了用户级线程是通过yield()来实现切换的。切换的时候切换tcb,tcb有关联着用户栈。内核级线程切换tcb的时候不光到切换用户栈还要切换核心栈。
用户线程通过中断,可以变成内核线程。内核级线程也可以变成用户级线程

2.内核级别线程和用户级线程的切换
3.内核级线程之间的切换

当一个用户级线程需要IO读的时候,通过中断变成核心级线程。然后启动磁盘读,把自己阻塞。其他核心级线程趁机上位。把内核级线程cur变成next


那switch_to是怎样实现的呢?
switch_to仍然是通过TCB找到内核栈指针;然后通过ret切换到某个内核程序;最后再用CS:PC切换到用户程序。
上一篇 下一篇

猜你喜欢

热点阅读