20135302魏静静——linux课程第八周实验及总结

时间:2016-04-13 23:55:51   收藏:0   阅读:537

linux课程第八周实验及总结

实验及学习总结

1. 进程切换在内核中的实现

linux中进程切换是很常见的一个操作,而这个操作是在内核中实现的。

实现的时机有以下三个时机:

linux内核中的线程切换主要通过schedule()这个函数实现。

schedule()函数

    • 切换时候,调用call schedule();来执行schedule()函数
    • 技术分享
    • 使用struct task_struct *tsk = current; 来获取当前进程;sched_ submit _work(tsk); 避免死锁;最后调用 _schedule()来处理切换过程
    • next = pick_ next _task(rq, prev);,_ schedule()中用来确定使用哪一种进程调度的策略。但总是选择了下一个进程来进行切换,即根据调度策略选择一个优先级最高的任务将其定为下一个进程,最后都是调用context _switch来进行进程上下文的切换过程。

context_switch

switch_to

进程切换:

进程的切换时需要保存要切换进程的相关信息,但是这与中断是不同的,因为中断是在一个进程当中,而切换进程需要在不同的进程间切换。

进程切换时需要保存的数据如下:

 

2.Linux系统的一般执行过程

最一般的情况:正在运行的进程X切换到运行进程Y的过程

                                  技术分享

          技术分享

 

几种特殊情况

3. 总结

  linux内核中实现进程的切换主要通过保存进程相关的信息实现,这里需要注意进程切换中内核级进程的切换和用户态进程切换的不同。内核态可以直接调用schedule函数并不需要陷入中断这个过程。而用户态则需要陷入内核态才能实现进程的切换。从switch_to这个函数当中也可以验证我们进程切换时会保存相关信息的推断。

     Linux是一个多进程的操作系统,所以,其他的进程必须等到正在运行的进程空闲CPU后才能运行。当正在运行的进程等待其他的系统资源时,Linux内核将取得CPU的控制权,并将CPU分配给其他正在等待的进程,这就是进程切换。内核中的调度算法决定将CPU分配给哪一个进程。

      Linux系统有一个进程控制表(process table),一个进程就是其中的一项。进程控制表中的每一项都是一个task_struct结构,在task_struct结构中存储各种低级和高级的信息,包括从一些硬件设备的寄存器拷贝到进程的工作目录的链接点。进程控制表既是一个数组,又是一个双向链表,同时又是一个树,其物理实现是一个包括多个指针的静态数组。系统启动后,内核通常作为某一个进程的代表。一个指向task_struct的全局指针变量current用来记录正在运行的进程。变量current只能由kernel /sched.c中的进程调度改变。

 

参考:

Linux下函数调用堆栈帧的详细解释 http://blog.chinaunix.net/uid-21237130-id-159883.html 
Linux中断一:初看Linux中断 http://blog.csdn.net/xuexingyang/article/details/7350420 
Linux用户态和内核态 http://blog.chinaunix.net/uid-1829236-id-3182279.html 
深入理解Linux下用户态与内核态切换 http://www.threeway.cc/sitecn/InformationInfo.aspx?pid=2578&tid=1382 
Linux操作系统是如何工作的?破解操作系统的奥秘
linux 内核原理——关于进程的简介 http://essayteam.blogbus.com/logs/3870611.html 

 

原文:http://www.cnblogs.com/20135302wei/p/5388498.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!