Linux进程

基本概念

  • 进程(process):程序执行的一个实例,分配系统资源的最小单元。进程可以产生一个或多个子进程,每个子进程只有一个父进程。在Linux中,常把进程称为task或thread
  • 线程:即轻量级进程(Linux不区分进程与线程,均用task_struct描述),两个轻量级进程之间可以共享一些资源,每个轻量级进程均由内核独立地调度
  • 线程组:实现了多线程应用的一组轻量级进程
  • CPU特权指令:为了安全起见,一些指令不能随意开放给应用程序使用,因此将CPU指令划分为不同的等级,高等级的特权指令只能由内核使用
  • 系统调用:内核为用户提供服务的接口,系统调用会使CPU由用户态转变为内核态,系统调用完成后再由内核态回到用户态。(中断和异常也会使CPU由用户态转变为内核态)
  • 库函数:对系统调用进行了封装,屏蔽了一些底层细节,便于应用程序员使用
  • 用户级线程(进程):存在于用户地址空间,对内核是透明的(内核不知道它的存在),内核不能直接调度,需要绑定内核线程才能执行。可以理解为使用库函数(由编程语言提供的)去模拟一个线程的创建、撤销、线程之间的同步与通信等功能,不是使用系统调用真正在操作系统创建一个线程,例如java中的线程就是用户线程。
  • 内核级线程(进程):存在于内核地址空间,对内核是可见的,内核可以直接调度。可以理解为真正在操作系统创建一个线程。例如使用fork函数创建的线程就是内核线程,你可以使用ps命令查看相关线程。本文所描述的线程均为内核线程。
  • 用户进程:由用户创建的进程,每个进程有独立的用户地址空间
  • 内核进程:由内核创建的进程,所有内核进程共用内核地址空间
  • 注:用户态和内核态是描述CPU状态的,与用户线程和内核线程没有关系

CPU运行状态

  • 用户态:CPU的一种状态,在这种状态下,仅能执行普通指令
  • 内核态:CPU的一种状态,在这种状态下,可以执行特权指令

从用户态切换到内核态有三种方式

  • 中断是用户态切换到内核态的唯一方式
  • 系统调用这是用户态进程主动要求切换到内核态的一种方式。用户态进程通过系统调用申请使用操作系统提供的服务程序来完成工作(软中断,陷入)。
  • 异常当 cpu 在执行运行在用户态的程序时,发生了一些没有预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关进程中,也就是切换到了内核态(软中断,异常)
  • 外围设备的中断当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序中去执行。如果前面执行的指令是用户态下的程序,那转换自然就是由用户态到内核态的转换(硬件中断)

进程描述符(task_struct)

进程地址空间

进程调度

进程切换(以arm64为例)

进程地址空间切换

  • mm_struct中的pgd字段保存页全局目录的虚拟地址,通过virt_to_phys将虚拟地址转换为物理地址,将即将执行的进程的页全局目录的物理地址设置到用户地址空间的页表基址寄存器ttbr0_el1中。(ttbr1_el1是内核地址空间的页表基址寄存器,访问内核地址空间时使用,所有内核进程共享,不需要切换)

CPU上下文切换

  • 将寄存器x19-x28、fp、sp、pc寄存器的值保存到前一个进程的task_struct中的cpu_contex中
  • 将后一个进程的task_struct中的cpu_contex的x19-x28,fp、sp、pc恢复到相应寄存器中
  • 将后一个进程的task_struct的地址存放在sp_el0寄存器中,用于通过current找到当前进程

中断上下文切换

  • 用户态通过中断或异常转换为内核态的时候都需要保存现场,也就是保存发生异常/中断时的所有通用寄存器的值,内核会把“现场”保存到每个进程特有的进程内核栈中,并用pt_regs结构来描述,当异常/中断处理完成之后会返回用户态,返回之前会恢复之前保存的“现场”,用户程序继续执行。
  • 当进程切换的时候,当前进程被时钟中断打断,将发生中断时的现场保存到进程内核栈(如:sp, lr等),然后会切换到下一个进程,当再次回切换回来的时候,返回用户空间的时候会恢复之前的现场,进程就可以继续执行(执行之前被中断打断的下一条指令,继续使用自己用户态sp),这对于用户进程来说是透明的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值