上海龙凤419

操纵体系

Linux体系下的历程切换的剖析

时辰:2024-08-03 17:36:53 操纵体系 我要投稿
  • 相干保举

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