【linux概念笔记】

文章详细介绍了Linux内核中工作队列和tasklet的概念,它们分别在中断上下文和软中断上下文执行。工作队列由内核线程处理,而tasklet基于软中断。内核线程与用户线程的区别在于内核线程只运行在内核态,使用内核地址空间。此外,文章还提到了完成量作为内核轻量级同步机制以及spin_lock和spin_lock_irqsave在锁机制中的应用。
摘要由CSDN通过智能技术生成

工作队列和tasklet

名称描述
中断上下文1、不能发生睡眠或者延时等操作
进程上下文
tasklet基于软中断实现的,因此是运行在软中断上下文
workqueue工作推后,交由一个内核线程去执行
由内核线程+链表+等待队列来实现的
唯一能在进程上下文运行的下半部实现的机制

在这里插入图片描述

内核线程与用户线程

区别:
clone->do_fork->copy_process(创建task_struct、thread_info结构及内核栈)->拷贝/共享打开的文件、文件系统信息、信号处理函数、进程地址空间

名称描述
进程普通进程使用的则是进程页表
active_mm=mm=不为空
thread_info存在进程/线程的基本信息,伙伴系统分配
task_struct进程描述符,由slab分配器其分配
线程线程也有自己独立的内核栈
每个线程都有自己的用户栈空间和寄存器,而用户堆仍然是所有线程共享的
多线程共享主线程的进程页表
thread_info存在进程/线程的基本信息
task_struct进程描述符,由slab分配器其分配
内核线程一种只运行在内核地址空间的线程
内核线程共享内核地址空间,同一份内核页表
active_mm不为NULL,mm=NULL

普通进程与内核线程有如下区别:

内核线程只运行在内核态,而普通进程既可以运行在内核态,也可以运行在用户态;
内核线程只使用 3-4GB (假设为 32 位系统) 的内核地址空间(共享的),但普通进程由于既可以运行在用户态,又可以运行在内核态,因此可以使用 4GB 的虚拟地址空间。

完成量 completion

  1. 内核轻量级的同步机制,互斥常采用mutext和自旋锁
  2. 基于等待队列实现wait_queue_head_t wait
  3. 静态初始化:COMPLETION_INITIALIZER
  4. 动态初始化:init_completion
  5. PV操作:complete和wait_for_completion

spin_lock & spin_lock_irqsave

  1. spin_lock中断可打断,单核程序可能问题
  2. spin_lock_irq_save禁用了中断,单核也没关系
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值