当前位置: 首页 > news >正文

做网站在线支付系统多少钱?上海优化公司

做网站在线支付系统多少钱?,上海优化公司,用dw做网站怎么添加音乐,花灯彩灯制作公司目录 一、调度场景分析 不支持内核抢占的内核 支持内核抢占 二、如何让新进程执行 三、调度的本质 一、调度场景分析 假如内核只有3个线程,线程0创建线程1和线程2.当系统时钟到来时,时钟中断处理函数会检查是否有进程需要调度。当有进程需要调度时…

目录

一、调度场景分析

不支持内核抢占的内核

支持内核抢占

二、如何让新进程执行

三、调度的本质


一、调度场景分析

假如内核只有3个线程,线程0创建线程1和线程2.当系统时钟到来时,时钟中断处理函数会检查是否有进程需要调度。当有进程需要调度时,调度器会选择线程1或者线程2。

执行流程:start_kernel运行在线程0里,线程0创建线程1和线程2。函数调用关系start_kernel()->kernel_debug()->do_fork 创建新线程,并把新线程添加到调度器的就绪队列中。线程0创建线程1和线程2后,进入while线程,线程0不会退出,等待被调度出去。

1、产生时钟中断。处理器采用定时器来周期性地执行。调度器利用时钟中断来定时检测当前运行的线程是否需要调度。当需要调度时,设置need_resched标志位

2、当时钟中断返回,根据linux内核是否支持内核抢占来确定是否需要调度:

不支持内核抢占的内核

不会检查是否调度。即使线程0的need_resched标志位置位了,linux内核也不会调度线程1或者线程2。只有发生在用户态的中断返回或者系统调用返回用户空间时,才会检查是否需要调度。

1)发生时钟中断。触发时钟中断时 当前进程有可能在用户态执行,也可能在内核态执行。

如果进程运行在用户态发生了中断,那么会进入异常向量表的el0_irq汇编函数;

如果进程运行在内核态时发生了中断,会进入异常向量表的el1_irq汇编函数中。

进入中断时,CPU会自动关闭中断。

2)在el1_irq汇编函数里,首先会保存中断现场到当前进程的栈中,使用pt_regs数据结构来实现pt_regs栈,保存中断现场。

中断处理程序过程包括切换到linux内核中断栈、硬件中断号的查询、中断服务程序处理等

3)当确定中断源时时钟中断后,scheduler_tick()函数会检查当前进程是否需要调度。如果需要调度,设置当前进程need_resched标志位(TIF_NEED_RESCHED),

4)中断返回。这里需要给中断控制器返回一个中断结束信号

5)在el1_irq汇编函数恢复中断现场。2)的对应操作

在不支持内核抢占的系统里,汇编函数不会检查是否需要调度。在返回时,CPU打开中断,然后从中断的地方继续执行线程0

支持内核抢占

1)中断返回会检查当前进程是否设置了need_resched表示位,如果置位,调用preempt_schedule_irq函数以调度其他进程并运行。

2)在el1_irq汇编函数即将返回中断现场时,判断当前进程是否需要调度。如果需要调度,调度器会选择下一个进程,并且进行进程的切换。

3)如果选择现场1,则从线程1的pt_regs中恢复中断现场并打开中断,然后继续执行内核线程1的代码。

二、如何让新进程执行

如果线程1是新创建的,它的栈应该是空的,第一次运行时如何恢复中断现场呢?如果不能从线程1的栈中恢复中断现场,那是不是线程1一直在关闭中断的状态下运行?

对于内核线程来说,在创建时会对如下两部分内容进行设置与保存。copy_thread()函数

  1. 进程的硬件上下文。保存在进程的cpu_context数据结构。
  2. pt_regs
int copy_thread_tls(unsigned long clone_flags, unsigned long stack_start,unsigned long stk_sz, struct task_struct *p, unsigned long tls)
{} else {memset(childregs, 0, sizeof(struct pt_regs));childregs->pstate = PSR_MODE_EL1h;//5 处理器状态 第0位 栈指针选择符,1:选择栈之战寄存器SP_EL1 2:3 异常级别,值1表示异常级别1if (IS_ENABLED(CONFIG_ARM64_UAO) &&cpus_have_const_cap(ARM64_HAS_UAO))childregs->pstate |= PSR_UAO_BIT;if (arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE)set_ssbs_bit(childregs);if (system_uses_irq_prio_masking())childregs->pmr_save = GIC_PRIO_IRQON;p->thread.cpu_context.x19 = stack_start;//函数地址,用来创建内核线程的函数kernel_thread的第一参数p->thread.cpu_context.x20 = stk_sz;//参数 ,用来创建内核线程的函数kernel_thread的第二参数}p->thread.cpu_context.pc = (unsigned long)ret_from_fork;//子进程的程序计数器,调度入口p->thread.cpu_context.sp = (unsigned long)childregs;//sp指向内核栈底部pt_regs起始位置}

stack_start指向内核线程的回调函数

x20 指向回调函数的参数

PC寄存器 ret_from_fork  执行入口

三、调度的本质

系统中有一个用户进程A和一个内核线程B,在不考虑自愿调度系统调用情况下,请描述这两个进程是如何相互切换并运行的。

  • 进程A在用户空间运行;
  • 发生中断
  • CPU打断正在运行的用户进程A,处于异常模式。CPU会跳转到异常向量表的el0_irq里。在汇编函数el0_irq中,首先把中断现场保存到进程A的pt_regs
  • 处理中断
  • 调度滴答处理函数,返回el0_irq汇编函数里。即将返回现场前,ret_to_user汇编函数会检查当前进程是否需要调度。
  • 若当前进程需要调度,调用schedule()函数选择下一个进程并切换 ;(switch_to函数)
  • 切换函数返回,CPU开始运行内核线程B;进程需要为前一个进程做收尾工作,比如调用raw_spin_unlock_irq来释放锁并打开本地中断。见finish_task_switch函数。
  • CPU沿着内核线程B保存的栈帧回溯,一直返回。返回路径finish_task_switch->el1_preempt->el1_irq
  • 在el1_irq汇编函数里把上一次发生中断时保存在栈里的中断现场进行恢复,最后从上一次中断的地方开始执行内核线程B的代码。

以上涉及两个上下文切换,中断上下文(pt_regs),进程上下文(task_struct)

http://www.yayakq.cn/news/849269/

相关文章:

  • 网站不支持ie8做网站要的带宽是什么
  • 做有网被视频网站山东网站备案 论坛
  • 建设网站德州做网站服务器要用多大
  • php网站上传教程注册公司的七个步骤
  • 自己建网站需要什么软件wordpress上方登录
  • 网站建设psd模板建网站 几个链接
  • 网站前端开发网站功能策划书
  • 网站开发验收申请报告网站开发与管理共多少页
  • 做网站 excel网站换域名怎么办
  • html做网站项目案例软件开发人员犯罪
  • 织梦做淘宝客网站视频教程做网站和做app哪个容易
  • 文山知名网站建设报价政法大学 wordpress
  • 阿里云淘宝客网站建设教程百度推广官网
  • 娄底市建设网站wordpress速度优化简书
  • 网站模板预览企业做网站哪家网站好
  • 佛山网站优化运营青岛网站建设保山
  • 成都专业做网站公司有什么好的网站可以接单子做
  • 网站稳定性wordpress 中文采集
  • 东莞企业公司网站建设可视化网站建设
  • 中创高科官方网站杭州做网站的优质公司
  • 辽宁做网站哪家好泰安营销网站建设
  • 怎么在年报网站做简易注销腾讯做的购物网站
  • 能力建设和继续教育中心网站平台销售模式有哪些
  • 中华设计论坛网站优化技巧
  • 泰安百度做网站的双线网站选服务器
  • 公司企业网站建设目的seo价格查询公司
  • 做网站用哪个预装系统学校网站的建设费用
  • vs 网站开发教程相亲网站建设策划方案
  • 顺的网站建设策划网站快速优化排名官网
  • 网站如何做流量前端开发培训得多少钱