欢迎登陆真网站,您的到来是我们的荣幸。 登陆 注册 忘记密码? ☆设为首页 △加入收藏
欢迎加入真幸福QQ群
电脑知识: 基础知识 网络技术 操作系统 办公软件 电脑维修 电脑安全 windows7 windows8 windows10 服务器教程 平板电脑 视频播放教程 网络应用 互联网 工具软件 浏览器教程 QQ技巧 输入法教程 影视制作 YY教程 wps教程 word教程 Excel教程 PowerPoint
云南西双版纳特产小花糯玉米真空包装


Linux系统下Git的基本配置和使用示例
Win8.1不激活可以使用多久
Win8.1系统不激活会怎样
如何关闭Word批注框
如何用好Windows 8.1视图重组
win8解决系统映像制作的麻烦
在Linux系统下使用Github的基本教程
win8系统如何彻底关闭用户账户控制
Win8下安装360后右键菜单多余选项怎么删除
win8下Flash Player无法正常运行怎么办
深入解析Linux系统下的进程切换
【 来源:网络 】【 点击:1 】 【 发布时间:2017_03_03 08:59:59 】

   Linux内核下进程切换

  Linux切换并没有使用X86CPU的切换方法,Linux切换的实质就是cr3切换(内存空间切换,在switch_mm函数中)+ 寄存器切换(包括EIP,ESP等,均在switch_to函数中)。这里我们讲述下switch_to主流程:

  1、 在switch_mm函数中将new_task->pgd设置到cr3寄存器中,实现页表切换,由于每个进程3-4G的页表映射机制完全一样(从内核页表中直接复制过来的),故这里虽然切换了pgd,但是并无影响,只是在任务回到用户空 间中时,才会发生变化,因为每个任务在0-3G中的页表映射都是各自独立的;

  2、 压入esi edi ebp到cur_task堆栈中;

  3、 将esp寄存器中的值保存到cur_task.task_struct.thread.esp中,也就是将cur_task切换时的堆栈指针保存起来;

  4、 将new_task.task_struct.thread.esp中的值设置到esp寄存器中,这里的new_task.task_struct.thread.esp中的值就是new_task上一次被换出时的堆栈指针,现在被恢复了,2和3结合实现了从cur_task到new_task的堆栈切换;

  5、 将1f地址设置到cur_task.task_struct.thread.eip中,当下次cur_task恢复运行时,将会从1f处开始运行,下面阐述了这种原理;

  6、 将new_task.task_struct.thread.eip压入到new_task的堆栈中,这里new_task.task_struct.thread.eip的值就是1f,因为从4中可知,new_task上一次被换出时,其也是和现在的cur_task类似,1f地址被设置到new_task.task_struct.thread.eip中;

  7、 随后CPU跳转到__switch_to函数中开始执行,注意这里使用的是jmp,不是call,call会pusheip,而jmp不会,由于__switch_to是函数,当CPU执行完该函数后,最后一条指令必然为iret,该指令会popeip,从5中可以知道,此时new_task堆栈中的镜像为[......., esi,edi,ebp,eip(&1f)],故popeip将值eip(&1f)设置到eip寄存器中,这样当iret执行完毕后,CPU将从eip处继续执行,也就是从1f处继续执行;

  8、 此时已经在new_task的执行环境中了,pop ebp, pop edi, popesi,回到schedule函数中,当返回用户空间中时,由于new_task用户空间的eip,ss,esp等均被从new_task的堆栈中弹出到对应寄存器中,从而new_task得以顺利执行。

  Linux 前后台进程切换

  当你用shell启动一个程序时,往往他是在前台工作的。 例如经常用PUTTY连接到远程服务器执行脚本的时候,如果本地网络中断后,这个时候前台进程就结束了,比较的懊恼,必须重新执行。因此有必要进行前后台进程的切换。

  例如直接在终端里输入firefox,那么会打开firefox,但当你关闭此终端或者ctrl+c强制终止时,firefox也随机关闭了。

  你可以在执行时后面加一个&,这样就在后台工作了。Shell支持作用控制,有以下命令:

  (1). command &让进程在后台运行

  (2). jobs –l 查看后台运行的进程

  (3). fg %n 让后台运行的进程n到前台来

  (4). bg %n 让进程n到后台去;

  PS:"n"为jobs查看到的进程编号。

  1、执行命令&切换至后台

  在Linux终端运行命令的时候,在命令末尾加上&符号,就可以让程序在后台运行

  代码如下:

  root@Ubuntu$ ./tcpserv01&

  2、切换正在运行的程序到后台

  如果程序正在前台运行,可以使用Ctrl+z 选项把程序暂停,然后用 bg %[number]命令把这个程序放到后台运行,这个步骤分为3步,如下:

  2.1暂停程序运行CTRL+Z

  ctrl + z跟系统任务有关的,ctrl + z可以将一个正在前台执行的命令放到后台,并且暂停。

  代码如下:

  [Oracle@linuxidc ~]$ sh ins.sh

  [1]+Stopped ins.sh

  2.2查看暂停的程序

  察看jobs使用jobs或ps命令可以察看正在执行的jobs。

  代码如下:

  [oracle@linuxidc ~]$ jobs -l

  [1]+ 4524Stopped ins.sh

  jobs命令执行的结果,+表示是一个当前的作业,减号表是是当前作业之后的一个作业。

  jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped,Terminated

  2.3切换程序至后台

  bg将一个在后台暂停的命令,变成继续执行如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出.

  代码如下:

  [oracle@linuxidc ~]$ bg %1

  [oracle@linuxidc ~]$ jobs -l

  [1]+ 4524Running ins.sh

  2.4切换程序至前台

  也可以用 fg %[number]指令把一个程序掉到前台运行

  代码如下:

  [oracle@linuxidc ~]$ fg %1

  ./tcpserv01

  2.5终止后台程序

  也可以直接终止后台运行的程序,使用 kill 命令

  代码如下:

  [oracle@linuxidc ~]$ kill %1

  但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识;也就是说,jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息。

本网站由川南居提供技术支持,fkzxf版权所有 浙ICP备12031891号
淳安分站 淳安分站