精华内容
下载资源
问答
  • 进程切换与模式切换
    千次阅读
    2020-12-22 00:51:42

    2.4.3进程切换

    中断
    • 普通中断
    • timeout:进程时间片耗尽
    • I/O中断:I/O就绪,OS决定该唤醒哪个进程
    • 内存失效(缺页):阻塞当前进程
    • 陷阱(自陷)
    • 进程错误或异常
    进程切换原因
    • 普通中断:对外部事件的反应
    • 陷阱:处理异常
    • 系统调用:调用内核程序
    中断过程

    save context(P1)–>renew pcb(P1)–>move pcb(P1) in queue–>change process(P1->P2)–>renew pcb(P2)–>renew storage、data structure–>reload context(P1)

    注意:中断不一定导致进程切换
    • 一个例子:I/O中断后,系统决定仍由先前进程继续执行(比如因为该进程priority更高)
    模式切换

    用户模式<==>内核模式

    原因
    • 系统调用:调用内核服务
    • 中断:调用中断处理程序
    模式切换与进程切换

    模式切换不一定导致进程切换,要进程切换一定要模式切换

    更多相关内容
  • 进程切换分两步: 1.切换页目录以使用新的地址空间 2.切换内核栈和硬件上下文 对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。 切换的性能...
  • 进程切换一定发生在中断/异常/系统调用处理过程中,常见的有以下情况: 时间片中断、IO中断后 更改优先级进程;(导致被中断进程进入就绪态); 阻塞式系统调用、虚拟地址异常;(导致被中断进程进入等待态) 终止...

    进程切换一定发生在中断/异常/系统调用处理过程中,常见的有以下情况:

    • 时间片中断、IO中断后 更改优先级进程;(导致被中断进程进入就绪态);
    • 阻塞式系统调用虚拟地址异常;(导致被中断进程进入等待态
    • 终止用系统调用不能继续执行的异常;(导致被中断进程进入终止态

    举例说明:

    • 时钟中断:操作系统确定当前正在运行的进程的执行时间是否已经超过了最大允许时间段,如果超过了,进程必须切换到就绪态,调度另一个进程;
    • I/O中断: 操作系统确定是否发生了I/O活动。如果I/O活动是一个或多个进程正在等待的事件,操作系统就把所有相应的阻塞态转换到就绪态,操作系统必须决定继续执行当前处于运行态的进程,还是让具有高优先级的就绪态进程抢占这个进程。
    • 虚拟地址异常(内存失效):处理器访问一个虚拟内存地址,且此地址单元不在内存中,操作系统必须从外存中把包含这个引用的 内存块(页或段)调入内存中。在发出调入内存块的I/O请求之后,操作系统可以会执行一个进程切换,以恢复另一个进程的执行,发生内存失效的进程被置为阻塞态,当想要的块调入内存中时,该进程被置为就绪态;
    • 对于陷阱:操作系统确定错误或异常条件是否是致命的。如果是,当前正在运行的进程被转换到退出态,并发生进程切换;如果不是,操作系统 的动作取决于错误的种类 和操作系统的设计,其行为可以是试图恢复或通知用户,操作系统可能会进行一次进程切换或者继续执行当前正在运行的进程。
    • 最后操作系统可能被来自正在执行的程序的系统调用激活。例如,一个用户进程正在运行,并且正在执行一条请求I/O操作的指令,如打开文件,这个调用导致转移到作为操作系统代码一部分的一个例程上进行。通常,使用系统调用会导致把用户 线程置为阻塞态;
    展开全文
  • 进程切换与线程切换

    千次阅读 2020-09-07 21:44:56
    进程切换分两步: 切换页目录以使用新的地址空间 切换内核栈和硬件上下文 对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。 切换的性能...

    为了更好的了解上下文切换,需要我们了解虚拟内存的概念。

    虚拟内存是操作系统为每个进程提供的一种抽象,每个进程都有属于自己的、私有的、地址连续的虚拟内存,当然我们知道最终进程的数据及代码必然要放到物理内存上,那么必须有某种机制能记住虚拟地址空间中的某个数据被放到了哪个物理内存地址上,这就是所谓的地址空间映射,也就是虚拟内存地址与物理内存地址的映射关系,那么操作系统是如何记住这种映射关系的呢,答案就是页表,页表中记录了虚拟内存地址到物理内存地址的映射关系。有了页表就可以将虚拟地址转换为物理内存地址了,这种机制就是虚拟内存。

    每个进程都有自己的虚拟地址空间,进程内的所有线程共享进程的虚拟地址空间。

    进程切换

    切换虚拟地址空间,切换内核栈和硬件上下文

    线程切换

    切换内核栈和硬件上下文

    上下文切换的开销

    1. 最显著的性能损耗是将保存寄存器中的内容

    2. CPU高速缓存失效

    3. 页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个cache就是TLB.当进程切换后页表也要进行切换,页表切换后TLB就失效了,cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢

    更详细的来说

    进程切换分两步:

    1. 切换页目录以使用新的地址空间

    2. 切换内核栈和硬件上下文

    对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。

    切换的性能消耗:

    1. 线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。

    2. 另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。

    系统调用:处于进程上下文

    系统调用是在进程上下文中,并没有tasklet之类的延迟运行,系统调用本身可以休眠,这些可以参见内核代码

    虽然系统调用实与其他中断实现有点类似,通过IDT表查找入口处理函数,但是系统调用与其他中断最大的不同是,系统调用是代表当前进程执行的,所以current宏/task_struct是有意义的,这个休眠可以被唤醒

    系统调用,异常,中断(其中中断是异步时钟,异常时同步时钟),也可以把系统调用成为异常

    中断上下文:

    在中断中执行时依赖的环境,就是中断上下文(不包括系统调用,是硬件中断)

    进程上下文:

    当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文

    1、首先,这两个上下文都处于内核空间。

    2、其次,两者的区别在于,进程上下文与当前执行进程密切相关,而中断上下文在逻辑上与进程没有关系。

    进程上下文主要是异常处理程序和内核线程。内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做。例如,系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态等。所以在进程上下文中引用current是有意义的。

    内核进入中断上下文是因为中断信号而导致的中断处理或软中断。而中断信号的发生是随机的,中断处理程序及软中断并不能事先预测发生中断时当前运行的是哪个进程,所以在中断上下文中引用current是可以的,但没有意义。事实上,对于A进程希望等待的中断信号,可能在B进程执行期间发生。例如,A进程启动写磁盘操作,A进程睡眠后现在时B进程在运行,当磁盘写完后磁盘中断信号打断的是B进程,在中断处理时会唤醒A进程。

    上下文这个词会让人想到进程的CPU寄存器状态,但好像进入进程上下文(异常处理系统调用)和进入中断上下文(中断处理),内核所做的工作没有太大区别。所以,这两个上下文的主要区别,我认为在于是否与进程相关。

    运行于进程上下文的内核代码是可抢占的,但中断上下文则会一直运行至结束,不会被抢占。因此,内核会限制中断上下文的工作,不允许其执行如下操作:

    (1) 进入睡眠状态或主动放弃CPU;

    由于中断上下文不属于任何进程,它与current没有任何关系(尽管此时current指向被中断的进程),所以中断上下文一旦睡眠或者放弃CPU,将无法被唤醒。所以也叫原子上下文(atomic context)。

    (2) 占用互斥体;

    为了保护中断句柄临界区资源,不能使用mutexes。如果获得不到信号量,代码就会睡眠,会产生和上面相同的情况,如果必须使用锁,则使用spinlock。

    (3) 执行耗时的任务;

    中断处理应该尽可能快,因为内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。在中断处理例程中执行耗时任务时,应该交由中断处理例程底半部来处理。

    (4) 访问用户空间虚拟内存。

    因为中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在中断上下文无法访问用户空间的虚拟地址

    (5) 中断处理例程不应该设置成reentrant(可被并行或递归调用的例程)。

    因为中断发生时,preempt和irq都被disable,直到中断返回。所以中断上下文和进程上下文不一样,中断处理例程的不同实例,是不允许在SMP上并发运行的。

    (6)中断处理例程可以被更高级别的IRQ中断。(不能嵌套中断)使用软中断,上部分关中断,也就是禁止嵌套,下半部分使用软中断

    如果想禁止这种中断,可以将中断处理例程定义成快速处理例程,相当于告诉CPU,该例程运行时,禁止本地CPU上所有中断请求。这直接导致的结果是,由于其他中断被延迟响应,系统性能下降。

    软中断是一种延时机制,代码执行的优先级比进程要高,比硬中断要低。相比于硬件中断,软中段是在开中断的环境中执行的(长时间关中断对系统的开销太大), 代码是执行在中断/线程上下文的,是不能睡眠的,虽然每个cpu都有一个对应的ksoftirqd/n线程来执行软中断,但是do_softirq这个函数也还会在中断退出时调用到,因此不能睡眠(中断上下文不能睡眠的原因是由于调度系统是以进程为基本单位的,调度时会把当前进程的上下文保存在task_struct这个数据结构中,当进程被调度重新执行时会找到执行的断点,但是中断上下文是没有特定task_struct结构体的,当然现在有所谓的线程话中断,可以满足在中断处理函数执行阻塞操作,但是实时性可能会有问题。还有就是中断代表当前进程执行的概念,个人感觉有点扯淡,毕竟整个内核空间是由所有进程共享的,不存在代表的概念)

    上面我们介绍的可延迟函数运行在中断上下文中(软中断的一个检查点就是do_IRQ退出的时候),于是导致了一些问题:软中断不能睡眠、不能阻塞。由于中断上下文出于内核态,没有进程切换,所以如果软中断一旦睡眠或者阻塞,将无法退出这种状态,导致内核会整个僵死。但可阻塞函数不能用在中断上下文中实现,必须要运行在进程上下文中,例如访问磁盘数据块的函数。因此,可阻塞函数不能用软中断来实现。但是它们往往又具有可延迟的特性。

    展开全文
  • 进程切换

    千次阅读 2016-05-24 19:45:31
    一个进程的上下文 可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。 用户级上下文: 正文、数据、用户堆栈以及共享存储区; 寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)...

    一个进程的上下文
    可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。
    用户级上下文: 正文、数据、用户堆栈以及共享存储区;
    寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP,SS);
    系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈

    发生进程调度时,进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的是模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。
    不需要保存的有:通用寄存器(EAX,EBX….)这些由中断服务例程保存。控制寄存器()CR0,CR3…

    对TCB的全面了解和分析。
    最终创建一个内核线程,hello world显示。
    关键数据结构:
    线程控制块 TCB:
    struct proc_struct{
    int pid;//唯一的ID

    //运行管理调度的信息
    enum proc_state state;
    int runs;
    volatile bool need_resched;
    uint32_t flags

    //内存管理
    uintptr_t ksatck; //内核的堆栈
    uintptr_t cr3;
    strutc mm_struct *mm;//管理线程或者进程的内存空间,缺页异常,检查mm结构判断是否是合法的地址
    {
    list_entry_t mmap_list;
    struct vma_struct * mmap_cache;
    pde_t * pgdir;
    int map_count;
    void * sm_priv;
    } //进程需要额合法的内存空间

    struct vma_struct {
    struct mm_struct * vm_mm;
    uintptr_t vm_start
    uintptr_t vm_end
    uint32_t vm_flags
    list_entry_t list_link
    }
    //与硬件紧密相关
    struct context context; //进程运行的上下文
    {
    uint32_t eip;
    uint32_t esp;
    uint32_t ebx;
    uint32_t ecx;
    uint32_t edx;
    uint32_t esi;
    uint32_t edi;
    uint32_t ebp;

    }//切换上下文,就是切换寄存器的内容,为什么FS,ES,DS不需要保存?:这些值是常量不需要保存,eax同样没有保存,系统调用的返回值存在eax, eax代表返回值。

    struct trapframe *tf;{ //中断产生的时候,硬件会把下面的信息放入内核堆栈
    //产生中断异常或者系统调用
    //硬件保存
    uint32_t tf_err;
    uintptr_t tf_eip;
    uint16_t tf_cs;
    uint16_t tf_padding4;
    uint32_t tf_eflags;
    uintptr_t tf_esp ; 特权级切换,也压入到栈里面
    uint16_t tf_ss; 特权级切换,也压入到栈里面,确保可以从ring 0回到ring3
    uint16_t tf_padding5;
    }
    //创建进程时,如果父进程先去世,会把子进程挂在到上一级父进程。
    struct proc_struct *parent;父进程的信息
    list_entry_t list_link;
    list_entry_t hash_link;

    }线程控制列表:list_link
    环境初始化:
    虚拟内存初始化
    内核线程初始化
    创建内核线程
    切换内核线程
    initproc 内核线程输出字符串

    switch(from,to)//from:idleproc 的context,intiproc的context
    movel 4(%esp),%eax //exp+4是 from的context

    pushl 0(%eax) //push eip eip是fork rnt的地址
    ret //跳转,执行完之后,到了fork的执行点开始执行 forkret
    static void forkret(void){
    forkrets(current->tf); //在trapentry.s 里面you forkrets的入口地址

    //forkret:
    movel 4(%esp),%esp
    jmp _trapret //恢复被中断的过程

    trapret返回后,跳转到kernel_thread_entery:
    ebx存储的是fn , fn是函数的名字

    }

    展开全文
  • 进程切换过程

    2020-12-07 16:13:01
    进程进行切换的时候 1.保存当前的进程状态,包括程序计数器,寄存器保存在PCB中 2.更新PCB的信息,例如更新进程的状态,加入阻塞队列 3.然后选择另外一个进程进行执行,更新PCB信息,例如从就绪转为运行状态 4....
  • 进程切换分两步: 1.切换页目录以使用新的地址空间 2.切换内核栈和硬件上下文 对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。 切换...
  • 进程切换和线程切换

    千次阅读 2019-08-11 09:52:12
    这种行为被称为进程切换(process switch)、任务切换(task switch)或上下文切换(content switch)。 原文 :https://www.cnblogs.com/kkshaq/p/4547725.html 进程切换分两步: 1.切换页目录以使用新的地址...
  • 进程切换与中断

    千次阅读 2020-03-21 10:15:28
    进程切换指从正在运行的进程中收回处理器,让待运行进程来占有处理器运行。 实质上就是被中断运行进程与待运行进程的上下文切换。 进程切换必须在操作系统内核模式下完成,这就需要模式切换。 模式切换又称处理器...
  • 进程切换和进程调度的区别

    千次阅读 2020-07-20 15:42:41
    进程切换和进程调度的区别 调度是决定将系统资源分配给哪个进程,进程切换是实际分配系统资源。另外需要注意进程切换一定会产生中断,进行处理器模式切换,即从用户态进入内核态,之后又回到用户态;但处理器模式...
  • 首先,我们要了解,进程切换是个什么过程? 进程切换概念   其实很简单,进程切换就是从正在运行的进程中,收回CPU的使用权利,交给下一个要运行的进程。   实际上,因为被切换的进程下一次可能还要继续运行,...
  • 进程切换与线程切换的区别?

    万次阅读 多人点赞 2019-07-25 17:00:04
    注意这个题目问的是进程切换与线程切换的区别,不是进程与线程的区别。当然这里的线程指的是同一个进程中的线程。 这个问题能很好的考察面试者对进程和线程的理解深度,有比较高的区分度。 要想正确回答这个问题,...
  • 为什么用多线程或多进程? 程序的大部分耗时在等待IO上,瓶颈不在CPU上时,可以提高CPU利用率 需要集中快速处理大量数据,并且不受先后顺序影响 评论区还可补充ing 线程和线程 线程的实现可以分为两类: 用户级...
  • 进程切换开销大的原因

    千次阅读 2021-02-28 21:24:28
    进程的切换时需要进行保护现场 进程开销比线程大的原因 进程切换的方式 进程的切换方式
  • 在threadA执行时,被调度了执行了threadB, 那么在threadB执行完之后是如何恢复threadA进程能够继续执行的呢? 我们从代码中去寻找答案, 系统调度是schedule()函数,那么我们就从schedule()函数看起 schedule() -->...
  • 线程切换与进程切换以及开销

    千次阅读 2019-07-26 17:42:45
    虚拟内存是操作系统为每个进程提供的一种抽象,每个进程都有属于自己的、私有的、地址连续的虚拟内存,当然我们知道最终进程的数据及代码必然要放到物理内存上,那么必须有某种机制能记住虚拟地址空间中的某个数据...
  • 分析: TSS作用 找到当前内核栈:进程内核栈在线性地址空间中的地址是由该任务的TSS段中的ss0和esp0两个字段指定的,依靠TR寄存器就...TSS是沟通用户栈和内核栈的关键桥梁,这一点在改写成基于内核栈切换进程切...
  • 1.进程切换的时机 这个简单说说,进程切换主要分为两种,主动的放弃处理器和被动的放弃处理器。 其中主动放弃处理器的场景是 1. 进程正常结束,主动放弃。 2. 进程在执行时发生了异常。 被动放弃处理器的场景是...
  • 进程上下文VS中断上下文 1.内和空间和用户空间 内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而用户态应用程序运行在用户空间。它们代表不同的级别,而对系统资源具有不同的访问权限...
  • 进程切换分析(2):TLB处理

    千次阅读 2017-02-09 21:08:12
    进程切换是一个复杂的过程,本文不准备详细描述整个进程切换的方方面面,而是关注进程切换中一个小小的知识点:TLB的处理。为了能够讲清楚这个问题,我们在第二章描述在单CPU场景下一些和TLB相关的细节,第三章推进...
  • linux 基于时间片轮转的进程切换

    千次阅读 2019-03-11 22:12:51
    linux 基于时间片轮转的进程切换 学号:413 原创作品 转载注明出处 课程:《Linux操作系统分析》https://github.com/mengning/linuxkernel/ 内容:主要讲述Linux操作系统中时间片轮转调度方法中,进程切换的实现...
  • 实验环境:基于内核栈切换的进程切换 实验本质:将 Linux 0.11 中采用的 TSS 切换部分去掉,取而代之的是基于堆栈的切换程序。具体的说,就是将 Linux 0.11 中的 switch_to实现去掉,写成一段基于堆栈切换的代码。 ...
  • 哈工大操作系统实验---lab4:基于内核栈的进程切换

    千次阅读 多人点赞 2019-04-28 14:23:46
    将Linux0.11中采用的基于TSS进程切换去掉,取而代之的是基于堆栈的切换程序,具体地说,也就是将进程切换函数schedule()函数中的switch_to()函数从原本的基于TSS切换改写成基于堆栈的切换。 编写汇编程序switch_t.....
  • 操作系统之进程切换

    万次阅读 多人点赞 2017-06-22 22:36:50
    并不是所有的中断/异常都会引发进程切换
  • 进程切换过程之一:上下文切换

    千次阅读 2020-01-26 22:32:25
    进程切换过程之一:上下文切换 注:下面给出的源码均出自https://github.com/mit-pdos/xv6-public 在进程进行切换时,需要进行上下文切换,也就是寄存器的值的保存。 对于上下文的切换,有两种情况:硬件自动...
  • 进程切换与线程切换的代价比较

    万次阅读 多人点赞 2018-05-30 17:18:45
    http://www.jb51.net/article/102004.htm进程切换分两步:1....切换的性能消耗:1、线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两...
  • 某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为 1μs。在 T 时刻就绪队列中有 3 个进程 P1、P2 和 P3,其在就绪队列中的等待时间、需要的 CPU 时间和优先权,如下表所示...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 514,209
精华内容 205,683
关键字:

进程切换