linux多线程

linux驱动中的多线程(竞争)

当一个线程在访问某个外设驱动的时候,怎么才能防止其他线程访问

1、原子操作

就是绝不会在执行完毕前被任何其他任务和时间打断

2、自旋锁

自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用

3、信号量

信号量和自旋锁的使用方法基本一样。与自旋锁相比,信号量只有当得到信号量的进程或者线程时才能够进入临界区,执行临界代码。信号量和自旋锁的最大区别在于:当一个进程试图去获得一个已经锁定的信号量时,进程不会像自旋锁一样在远处忙等待

信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

进程与线程

线程是一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成

进程是执行过程中的代码,进程是指正在运行的一个程序的实例,包括代码、数据、堆栈、打开的文件等系统资源,是操作系统中资源分配和调度的基本单位。

父进程与子进程

父进程使用fork() 函数创建子进程,将父进程的数据拷贝一次,但是两个有自己的pid。

父进程会在子进程结束的时候,回收子进程,要是父进程先于子进程结束,就会产生僵尸进程,这时候需要init进程,自动调用wait()函数进行收尸

fork复制的内容

程序代码段、数据段:包括全局变量、静态变量以及初始化的数据、堆内存、堆内存、文件描述符、

不同的是进程id

线程

进程有自己的独立地址空间,多个线程共有一个地址空间

    每个线程都有自己的栈区,寄存器

    多个线程共享代码区、堆区、全局数据区、打开的文件(文件描述符)都是线程共享的

线程实最小的执行单位,进程是最小的的资源分配单位

    多个线程可以抢占更多的时间片

     线程切换上下文比进程切换快

线程和进程一样,子线程退出的时候其内核资源主要由主线程回收,线程库中提供的线程回收函叫做 pthread_join(),这个函数是一个阻塞函数,如果还有子线程在运行,调用该函数就会阻塞,子线程退出函数解除阻塞进行资源的回收,函数被调用一次,只能回收一个子线程,如果有多个子线程则需要循环进行回收。

多线程执行顺序

不同优先级采用抢占式调度,同一优先级使用时间片轮询调度

线程加锁之后,就会陷入堵塞状态,卡在半路除非解锁才能从头再次执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值