• shell的性质
  • shell的性质

Linux Shell性质和行事规律,linuxshell性质

  • shell的性质

Linux系统的shell也就是操作系统的“一层外壳”,它是命令语言解释器,它为用户提供了使用操作系统的接口。它不属于基本,而是在基础之外以用户态格局运营。它的基本功效是表明并执行用户打入的各个吩咐,完成用户与Linux内核的接口。

个人明白:shell就是屡见不鲜的用户态程序,可以知道用户命令。是用户和种类的传信者。

  • shell工作规律

在运转Linux系统后,内核会为逐个终端用户建立3个历程去履行shell解释程序。

以下内容为个人知道:

1.shell检讨并预处理命令行后,使用fork或vfork创设子进程。

2.在子进度中调用execve执行命令。

3.在本进度当中待子进度处理落成(对于非后台进度),继续守候用户输入指令。

Shell性质和工作规律,linuxshell性质
shell的习性
Linux系统的shell约等于操作系统的“一层外壳”,它是命令语言解释器,它为用户提供了…

转自:

Linux系统的shell相当于操作系统的“一层外壳”,它是命令语言解释器,它为用户提供了动用操作系统的接口。它不属于基本,而是在根本之外以用户态情势运维。它的基本功用是表达并推行用户打入的各样吩咐,已毕用户与Linux内核的接口。

Linux系统的shell相当于操作系统的“一层外壳”,它是命令语言解释器,它为用户提供了应用操作系统的接口。它不属于基本,而是在基本之外以用户态形式运维。它的基本功用是解说并实施用户打入的种种吩咐,已毕用户与Linux内核的接口。

陈民禾 原创文章转发请注解出处
《Linux内核分析》MOOC课程 

私家掌握:shell就是日常的用户态程序,可以知情用户命令。是用户和连串的传信者。

私家知道:shell就是平凡的用户态程序,可以清楚用户命令。是用户和系统的传信者。

一.有关进度调度的基本知识

  • shell工作原理
  • shell工作规律

     
进程的三种差距分类:
第3种分类:类型一:I/O-bound:再三的拓展I/O,寻常会费用很多的岁月等待I/O操作的到位;类型二:CPU-bound:计量密集型
,必要大批量的CPU时间举办演算第三,种分类:类型一:Shell性质和劳作原理,进度的切换和种类的相似实施进程。批处理进度 ;类型二:实时进度;类型三:交互式进程。

在起步Linux系统后,内核会为逐个终端用户建立贰个历程去履行shell解释程序。

在开行Linux系统后,内核会为每一种终端用户建立八个进度去履行shell解释程序。

     
调度策略:
是一组规则,它们决定哪些时候以什么样的法子选取1个新的进度运转,Linux的调度基于分时和先行级:随着版本的浮动,分时技术在频频变动,Linux既接济普通的分时进度,也支撑实时进程,Linux中的调度是多样调度策略和调度算法的混合。

以下内容为个人理解:

以下内容为私家知道:

   
 Linux的经过依据优先级排队
:根据特定的算法计算出进程的优先级,用三个值表示,那么些值表示把进程怎么着合适的分配给CPU。

1.shell检查并预处理命令行后,使用fork或vfork成立子进度。

1.shell检讨并预处理命令行后,使用fork或vfork创造子进度。

   
 Linux中经过的先行级是动态的:
调度优先级会根据进度的表现周期性的调整进度的事先级:较长时间未分配到CPU的长河,日常上升;已经在CPU上运维了较长期的进程,平日下落。挂起正在CPU上实施的进度,与中断时保留现场是例外的,中断前后是在同三个进程上下文中,只是由用户态转向内核态执行

2.在子进度中调用execve执行命令。

2.在子进度中调用execve执行命令。

     进度上下文富含了经过执行所急需的持有音信。

3.在本进度当中待子进度处理完结(对于非后台进度),继续等待用户输入指令。

3.在本进度当中待子进程处理达成(对于非后台进度),继续伺机用户输入指令。

          用户地址空间:包涵程序代码,数据,用户堆栈等

          控制消息:进度描述符,内核堆栈等

          硬件上下文(注意中断也要保留硬件上下文只是保存的方法差别)

   
Linux系统的形似实施进程分析:
此时我们得以有了壹个规格来通晓linux系统的貌似运维情形,其中有三个用户态进度X须要切换成用户进度Y。从正值周转的用户态进度X切换来正在运维的用户态进程Y的经过

          1.正值运行的用户态进度X

          2.生出搁浅——save cs:eip/esp/eflags(current)to kernel
stack,then load cs:eip(entry of a specific IS兰德酷路泽)and ss:esp(point to
kernel stack)

          3.SAVE_ALL//保存现场

         
4.中断处理进程中或刹车再次来到前调用了schedule(),其中的switch_to做了主要的历程上下文切换

         
5.标号1之后开始运行用户态进程Y(那里Y曾经通过以上步骤被切换出去过因而得以从标号1继续执行)

          6.restore-all//恢复生机现场

          7.iret -pop cs:eip/ss:eip/eflags from kernel stack

          8.持续运转用户态进度Y

 

二.进度调度关键代码分析

      我们还有众多的系统调用可以兑现进程的优先级,比如说以下的代码:

澳门金沙国际 1

    nice 
    getpriority
    sched_getscheduler/sched_setscheduler
    sched_getparam/sched_setparam
    sched_yield
    sched_get_priority_min/sched_get_priority_max
    sched_rr_get_interval

澳门金沙国际 2

     
调度算法策略只是2个国策算法而已,不管选用什么策略,都是从阵容中精选了下一个进程来执行,将调度算法与其余一些耦合了。

   
  经过调度的机会须知道以下四点:暂停处理进程(包括时钟中断、I\O中断、系统调用和丰富)中,直接调用schedule(),或许重临用户态的时依照need_resched标记调用schedule();内核线程可以直接调用schedule()举行进程切换,也得以在暂停处理进程进行调度,也等于说内核线程作为一类相当的长河可以积极,也足以被动调度;用户态进度无法完成主动调度,仅能通过陷入内核态的有些机会展开调度,即在暂停处理进度中展开调度;用户态只好被动调度,内核线程是只有内核态没有用户态的出格进度,内核线程可以积极调度也足以被动调度。

     
schedule函数
:schedule函数完毕调度,目标:在运作阵容中找到二个历程,把CPU分配给它,调用方法:直接行使schedule();松散调用,按照need_resched标记

澳门金沙国际 3

next = pick_next_task(rq, prev); //进度调度算法都打包这一个函数内部

澳门金沙国际 4

context_switch(rq, prev, next); //进度上下文切换

switch_to切换堆栈和寄存器的情形,利用了prev和next八个参数:prev指向当前进度,next指向被调度的进度

澳门金沙国际 5

 进度上下文调度相关代码分析:在switch()中:

澳门金沙国际 6

31#define switch_to(prev, next, last)                    
32do {                                 
33  /*                              
34   * Context-switching clobbers all registers, so we clobber  
35   * them explicitly, via unused output variables.     
36   * (EAX and EBP is not listed because EBP is saved/restored  
37   * explicitly for wchan access and EAX is the return value of   
38   * __switch_to())                     
39   */                                
40  unsigned long ebx, ecx, edx, esi, edi;                
41                                  
42  asm volatile("pushfl\n\t"      /* save    flags */          //保存当前进程的flags
43           "pushl %%ebp\n\t"        /* save    EBP   */       //把当前进程的堆栈基址压栈
44           "movl %%esp,%[prev_sp]\n\t"  /* save    ESP   */   //把当前的栈顶保存到prev->thread.sp
45           "movl %[next_sp],%%esp\n\t"  /* restore ESP   */   //把下一个进程的栈顶保存到esp中,这两句完成了内核堆栈的切换
46           "movl $1f,%[prev_ip]\n\t"    /* save    EIP   */   //保存当前进程的EIP,可以从这恢复
47           "pushl %[next_ip]\n\t"   /* restore EIP   */       //把下一个进程的起点位置压到堆栈,就是next进程的栈顶。next_ip一般是$1f,对于新创建的子进程是ret_from_fork
             //一般用return直接把next_ip pop出来
48           __switch_canary                   
49           "jmp __switch_to\n"  /* regparm call  */  //jmp通过寄存器传递参数,即后面的a,d。 函数__switch_to也有return把next_ip pop出来     
50           "1:\t"              //认为从这开始执行next进程(EIP角度),第一条指令是next_ip这个起点,但前面已经完成内核堆栈的切换,早就是next进程的内核堆栈(算prev进程,比较模糊)          
51           "popl %%ebp\n\t"     /* restore EBP   */  //next进程曾经是prev进程,压栈过ebp  
52           "popfl\n"         /* restore flags */  
53                                  
54           /* output parameters */                
55           : [prev_sp] "=m" (prev->thread.sp),     //当前进程的,在中断内部,在内核态,sp是内核堆栈的栈顶
56             [prev_ip] "=m" (prev->thread.ip),     //当前进程的EIP  
57             "=a" (last),                 
58                                  
59             /* clobbered output registers: */     
60             "=b" (ebx), "=c" (ecx), "=d" (edx),      
61             "=S" (esi), "=D" (edi)             
62                                       
63             __switch_canary_oparam                
64                                  
65             /* input parameters: */                
66           : [next_sp]  "m" (next->thread.sp),    //下一个进程的内核堆栈的栈顶     
67             [next_ip]  "m" (next->thread.ip),    //下一个进程的执行起点
68                                       
69             /* regparm parameters for __switch_to(): */  
70             [prev]     "a" (prev),               //寄存器的传递 
71             [next]     "d" (next)               
72                                  
73             __switch_canary_iparam                
74                                  
75           : /* reloaded segment registers */           
76          "memory");                  
77} while (0)

澳门金沙国际 7

三.Linux系统执行进程中的多少个优异情形:

1.透过暂停处理进度中的调度时机,用户态进程与根本线程之间互相切换和水源线程之间互相切换,与最相似的景况越发类似,只是内核线程运营进度中暴发中断没有经过用户态和内核态的转移;

2.内核线程主动调用schdule(),惟有经过上下文的切换,没有中断上下文的切换,与最相似的气象略简略;

3.创造子进程的系统调用在子进程中的执行起源及重返用户态,如fork;

4.加载2个新的可执行程序后回来到用户态的事态,如execve;

四.录像中的小统计:

 Linux操作系统架构概览大家在此间总括一下以此课学习的始末:

其它总计机体系都富含三个为主的主次集合,称为操作系统

-内核(进程管理,进程调度,进度间通信机制,内存管理,中断很是处理,文件系统,I/O系统,网络部分)

-其余程序(例如函数库,shell程序、系统程序等等)

操作系统的目标

-与硬件交互,管理全数的硬件能源

-为用户程序(应用程序)提供一个卓越的推行环境

那么我们能够看一张图:最尾部有磁盘管理,物理内存的治本,内存控制器还有控制台,这一个地点它有多个Kernel
速龙face to the hardware,

也等于对硬件财富的保管,然后呢在上一层就是水源的完成,内核的已毕相当于CPU调度,内存管理,按需调度,虚拟内存等等,还有其余的驱动,磁盘管理,文件系统等等,那个操作系统的基业,咱们那门课分析的基石只是总计机操作系统里面最最根本的一部分代码,实际上任何操作系统格外复杂,很多别样的一对都并未提到。那么呢,这么些地点有3个连串调用接口,那里涉及到区其他部分,基础软件约等于share共享库lib
,动态加载器这一个等等。

澳门金沙国际 8

2.ls命令——最简便易行与最复杂的操作

澳门金沙国际 9

3.从CPU和内存的角度来看Linux系统的实践

1.从在CPU执行命令的角度看:

澳门金沙国际 10

2.从内存的角度看

澳门金沙国际 11

五.尝试进度截图及分析

搭建实验环境:

cd LinuxKernel   
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs

澳门金沙国际,gdb调试

澳门金沙国际 12

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
gdb
file ../linux-3.18.6/vmlinux
target remote:1234
设置断点:
b schedule
b pick_next_task
b context_switch
b switch_to

澳门金沙国际 13

澳门金沙国际 14

澳门金沙国际 15

3.在schedule处设置断点,运转,并用list展开函数

澳门金沙国际 16

4.单步运维,直至__schedule()

澳门金沙国际 17

5.在context_switch处设立断点,执行

澳门金沙国际 18

六.知识总计

   
进程调度程序是根本主要的组成部分,因为运营着的经过首先在应用电脑(至少在大家一大半人看来)。但是,满足进度调度的各样要求绝不是不难的,很难找到“一刀切”的算棒,既顺应过多的可运营进程,又富有可伸缩性,仍是可以在调度周期和吞吐量之间求得平衡,同时还知足各样负载的须要。可是,
Linux 内核的新CFS
调度程序尽量满意了各样方面的急需,并以较周密的可伸缩性和新型的方挫提供了一级的解决方案。前边的章节覆盖了经过管理的连带内容,本章则考察了经过调度所遵守的基本原理、具体落到实处、调度算能以及当前Linux
内核所使用的接口。

相关文章