首页 > 系统相关 >linux内核同步机制

linux内核同步机制

时间:2024-03-04 18:00:57浏览次数:29  
标签:同步 访问 并发 死锁 加锁 线程 内核 linux

内核同步机制

在使用共享内存的程序代码中,为了保护共享资源,放置共享资源的并发访问导致的错误逻辑,需要用到内核同步机制。

1.临界区

是访问和操作共享数据的代码段。多个执行线程并发访问同一个资源(读/写),通常是不安全的,为了避免这种隐患,编程人员必须保证这种访问是原子的(不可打断)。

2.造成并发的原因

造成并发有多种原因:

中断--------------------------------中断几乎能够在任何时刻异步的发生,随时可以打断当前的代码

软中断(含 tasklet)----------内核能够在任何时候唤醒或者调度软中断和 tasklet,打断当前的代码执行

内核抢占---------------------------内核具有抢占性,所以当前的任务可能被另外一个任务抢占

睡眠和用户空间同步------------内核执行的进程可能睡眠,会唤醒调度程序,从而导致调度一个新的程序执行

对称多处理器 (SMP)---------多个处理器同时执行代码

作为内核的开发者,必须熟练的了解上述可能导致并发的因素,并在编码的时候,时刻做好解决并发的工作。真正用所来保护资源并不困难,关键是需要正确的辨识出共享数据和临界区。在代码设计的初期就需要充分的考虑加锁,而不是时候补救。

3.解决并发的办法

加锁是解决并发的办法,即,在临界区加上一把锁,让先来的进程获取锁并开始执行,后来的进程获取不到锁,就无法执行,便起到了保护临界区的办法。而锁,是原子性的,不存在竞争。单一指令实现。

4.锁保护的是什么

锁住的是数据,而不是代码!锁是针对共享的数据访问的,针对的对象是数据。

任何可能被并发访问的代码几乎都需要保护。

执行线程的局部数据仅仅被他本身使用,不需要保护。比如局部变量不需要锁。

如果数据只会被特定的线程访问,也不需要锁(一个线程一次只能在一个 处理器上运行)

5.到底什么数据需要加锁呢?

大多数内核数据都需要加锁,如果有其他执行线程可以访问这些数据,那么需要给这些数据加上锁。

6.在写内核代码的时候,需要时刻清醒一下问题:

这个数据是不是全局的?除了当前线程以外,其他线程能否访问它?
这个数据会不会在进程上下文和中断上下文共享?它是不是要在两个不同的中断处理程序中共享?
进程在访问数据的时候,内核是否处于可抢占?被调度的新程序会不会访问同一个数据?
当前进程是不是会睡眠(阻塞)在某些资源上?如果是,会让共享数据处于什么状态?
如果这个函数又在另外一个处理器上被调度执行,会怎么样?

7.死锁

当一个或者多个线程执行的时候,每个线程都在等待其他线程已经锁住的资源,会导致相互等待,进入死锁。

自死锁:如果一个线程试图去获取一个自己已经获取了的锁,它将死锁。因为这个锁已经被之前获取过,再次获取,只能进入无限的等待:

获得锁A

再次获取锁 A

等待.........................

同样道理,n个线程n个锁,如果处于相互等待,也会死锁:

线程 1 线程 2

获得锁 A 获得锁 B

试图获得锁 B 试图获取锁 A

等待锁 B.......... 等待锁 A ...............

8.预防死锁

预防死锁,几种法则:

  1. 按顺序加锁。若使用多个嵌套的锁的时候,需要保证加锁顺序和获取锁的顺序一致

  2. 防止发生饥饿。

  3. 切勿重复请求同一个锁。

  4. 锁的设计力求简单。

原文链接:https://blog.csdn.net/zhoutaopower/article/details/86586527

标签:同步,访问,并发,死锁,加锁,线程,内核,linux
From: https://www.cnblogs.com/axjlxy/p/18052319

相关文章

  • 使用SSH客户端登录Linux实例提示“ssh_exchange_identification: read: Connection re
    产品推荐:1、安全稳定的云服务器租用,2核/2G/5M仅37元,点击抢购>>>;2、高防物理服务器20核/16G/50M/200G防御仅350元,点击抢购>>>3、百度智能建站(五合一网站)仅880元/年,点击抢购>>> 模板建站(PC+手机站)仅480元/年,点击抢购>>>使用SSH客户端登录Linux实例提示“ssh_exchange_identifi......
  • Linux使用netstat查看端口使用情况
    1.netstat(networkstatus网络状态)命令各个参数说明如下:-t:指明显示TCP端口,t是TCP的首字母。-u:指明显示UDP端口,u是UDP的首字母-l:仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序),l是listening的首字母。-p:显示进程标识......
  • Linux提权
    概述Linux安装好系统后里面自带的软件或内核存在的漏洞,比较流行的有“脏牛提权”Linux内核提权跟Windows一样,都要下载对应漏洞的脚本进行提权Linux内核提权linux提权步骤1.进行基础信息收集uname-a#打印所有可用的系统信息uname-r#内核版本uname-n#系统主机名。una......
  • 升级centos7内核版本
    先查看当前内核版本~]#uname-aLinuxlocalhost.localdomain3.10.0-1160.el7.x86_64#1SMPMonOct1916:18:59UTC2020x86_64x86_64x86_64GNU/Linux查看系统grub内核启动列表~]#awk-F\''$1=="menuentry"{printi++":"$2}'/etc/grub2......
  • linux 常用命令
    //通过killall命令killallnginx//通过pkill命令,类似于pgrep+killpkillnginx//通过先查找再kill的方式ps-ef|grepnginx|grep-vgrep|awk'{print$2}'|xargskill-9//用cut-c来截取指定位置的字符串ps-ef|grepnginx|grep-vgrep|cut......
  • 如何通过ETL实现快速同步美团订单信息
     一、美团外卖现状美团作为中国领先的生活服务电子商务平台,其旗下的美团外卖每天承载着大量的订单信息。这些订单信息需要及时入库、清洗和同步,但由于数据量庞大且来源多样化,传统的手动处理方式效率低下,容易出错。比如,不同渠道的数据格式不一致,需要进行数据清洗和格式转换;数据量......
  • linux 中正则表达式中?号的作用
     linux中正则表达式中?号的作用是匹配前面的字母0次或者1次;001、测试如下:[root@pc1test1]#lsa.txt[root@pc1test1]#cata.txt##测试样本abcdxyz133kkkkabdejjjddduabbcdejjjaaaeabbbcdejjj[root@pc1test1]#grep"abcd"a.txt......
  • linux安装南大通用数据库 GBase 8s V8
    @目录1、操作系统、数据库2、下载链接3、安装文档4、安装前准备4.1、以root用户创建gbasedbt组和用户4.2、创建GBase8s数据库安装目录4.3、上传并解压安装包5、安装5.1、执行安装程序5.2、回车继续直到接受许可条款5.3、输入安装目录绝对路径5.4、选择安装类型5.5、选择安装......
  • linux 安装神州通用数据库 V7
    @目录操作系统、数据库1、官方下载链接2、windows客户端下载链接3、官方安装手册4、安装前准备3.1、创建安装用户3.2、以root用户修改神通数据库安装包的所有者为shentong用户3.3、以root用户创建神通数据库主目录并修改所有者为shentong用户3.4、以root用户临时修改init.d......
  • shell工具连接linux时的报错问题
    问题描述在使用shell工具连接linux时报以下错误SSH!Agentauthselected,butnorunningagentisdetectedSSH!Agentauthselected,butnorunningagentisdetected解决方法方法1#首先使用ping方法查看是否在同一网段pingxxx.xxx.xx.x方法2#安装[openss......