- 相干保举
Linux体系下的历程切换的剖析
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情况中所起的背景正在运转或被挂起的使命信息。
【Linux体系下的历程切换的剖析】相干文章:
剖析Linux体系中的历程调剂03-05
解读Linux体系中的历程调剂03-04
Linux体系中的保护历程讲授03-05
Linux体系若何检查历程的线程数02-14
Linux体系下的uname号令03-02
linux体系中疾速检查历程pid的方式11-19
在Linux体系下装置QQ的方式03-06
linux 切换途径怎样利用03-01
window下若何装置linux双体系02-25