搜索
首页系统教程LINUX作为嵌入式开发工程师,关于Linux kernel同步机制你不得不知道
作为嵌入式开发工程师,关于Linux kernel同步机制你不得不知道Feb 12, 2024 pm 02:50 PM
linuxlinux教程linux系统linux命令外壳脚本同步机制嵌入式linuxlinux入门linux学习

作为嵌入式开发工程师,关于Linux kernel同步机制你不得不知道

前言

同步是进程之间,以及进程与系统资源之间的交互。由于 Linux 内核采用多任务,因此在多个进程之间必须有同步机制来保证协调。

Linux 内核中有许多种同步机制。今天我们将重点介绍 kernel 中的异步和同步机制,其中着重介绍 kernel 中的异步机制。kernel 中的异步机制分为两种:一种是应用层的同步机制,即应用层线程之间的通信;另一种是内核的同步机制。

当一个线程进入内核态后,它可以直接与内核沟通。kernel 中有两个线程是这样的:一个是线程 A,它进入内核态后会直接与内核沟通,告诉它要做什么,完成后会通知内核。(我们称这个操作为 semi)当一个线程进入内核态后,它会先与内核沟通一次,然后就可以直接执行了。

kernel 中的同步机制本质上是线程间的通信机制,它们之间通过同步机制来实现通信。

一、进程间的通信

为了保证系统的正确性和一致性, Linux内核会在进程间通信的过程中使用阻塞队列来处理进程间的通信。阻塞队列是指在消息队列中的某个元素在消息发出时就被创建,但并不是所有的消息都会被发送出去,只有当某一条消息的等待队列满了才会被发送出去。如果接收方等待队列中没有消息,则会接收到通知,如果接收方等待队列中有消息,则不会收到通知。

在内核中,对阻塞队列进行了抽象,即当某个进程发出了一个消息后,它就被阻塞了。因此,阻塞队列实际上是一种同步机制。阻塞队列通过一个特定的函数来创建一个新的对象,该对象包含一个等待队列指针(Push/Pop)。当等待队列满了之后,系统将把该等待队列指针指向的对象作为第一个发出通知的进程的线程。也就是说,该进程会收到通知后才能继续执行它的任务。

二、信号量

信号量可以用来发送或接收消息。当一个进程拥有了一个信号量,就意味着他已经拥有了一个属于自己的信号量,这个信号量是他自己的一个私有变量。这个私有变量是不能被其它进程拿到的。信号量用来表示一个进程所拥有的信号量数量,当这个进程拥有了这个信号量之后,就可以向其它进程发送消息。这个私有变量只允许这个进程自己使用,不可以把它拿到其它进程的进程中去。

当一个线程拥有了自己的信号量之后,就可以通过共享变量来与其它线程进行通信了。共享变量也是在其它线程中进行使用的,其它线程使用共享变量来和自己进行通信。

三、互斥量

互斥量主要是针对系统资源来说的。Linux内核中的互斥量又可以分为两种:共享资源和全局互斥资源。

共享资源就是进程之间共享的,比如一个进程有多个线程,那么每个线程都可以访问这个共享的内存空间。全局互斥资源就是进程和线程之间只能访问到自己所在的全局内存空间。在一个系统中,可以使用互斥量来实现多个进程同时在内存中执行。但是如果要实现多个进程同时执行,就需要使用同步机制,这样才能保证所有的进程都能够在同一个内存中运行。使用互斥量,一个进程只能访问到自己所在的全局内存空间,而无法访问其它内存空间。但是互斥量有一个很大的好处,那就是不会出现进程阻塞等情况。

四、消息队列

消息队列的出现,对进程间通信进行了很大的扩展。在 kernel中,除了同步机制外,还有另外一种异步机制,那就是消息队列。我们都知道, Linux内核是支持消息队列的。虽然在内核中也有关于消息队列的详细信息,但是由于内核是不支持用户态的消息队列的,所以我们还是要从应用层入手来了解一下消息队列。

首先我们先了解一下消息队列是什么?

消息队列是一种特殊的队列,它能够满足多个应用线程之间的同步需要。消息队列用于提供应用程序与其他进程或线程之间的异步通信。如果我们需要进行异步通信,那么就可以通过使用消息队列来进行。比如当我们调用 clear ()函数时,我们就可以直接使用一个已注册的消息队列。

那么如何创建一个消息队列呢?当我们使用ext2. json时,可以在 JAR. json. clear ()中使用 semaphore命令创建一个消息队列。

五、共享内存

在共享内存中,我们使用的是共享锁,但因为共享锁是与某个进程共享内存,所以当你想要获取共享锁的时候,你需要向其他进程请求。

就像在上面的例子中,我们通过 volatile关键字来访问共享内存。此时你并没有向其他进程请求,所以当你想要获取这个共享锁时,只需要向其他进程请求。这样就避免了两个进程之间的互相竞争,同时还能实现数据的同步。

由于共享锁是与某个进程共享内存,所以你必须向该进程请求访问它的地址。对于这种情况来说,最简单的解决方案就是使用线程池。

在线程池中有一个叫做“byte”的对象,它也是一个共享锁。当你想要获取这个锁时,只需要向 byte对象发送请求就可以了。这时候 byte对象会将你的请求发送到该线程的队列中,当该线程收到请求时,它就会给你返回一个响应消息。

六、线程池

线程池是一个非常好的线程管理工具,它可以让多个线程同时运行,还可以减少线程之间的死锁和冲突。它还有一个最重要的特点就是,可以有效地利用系统的内存,达到提高效率的目的。

线程池的使用非常简单,就是把要执行的任务分配到相应的线程池中。当要执行的任务分配到相应线程池后,就可以执行了。使用线程池会给我们带来很多好处:

  1. 可以更快地完成任务。当一个任务被分配到了线程池中,就会被循环执行下去,直到执行完成或者是线程重新创建完成。
  2. 提高了资源利用效率。当一个任务需要很多资源时,例如 CPU、内存等,我们就可以使用线程池来管理这些资源,使每个线程都有足够的 CPU和内存来执行这个任务。

七、内核态的同步机制

上面介绍了两种同步机制,那么我们来看看内核态的同步机制,在内核态有四种同步方式:

  1. 信号量:它是用来操作锁的,当一个线程占用了一个锁时,它会向系统发送一个信号量。
  2. 信号量传递:这个机制是由操作系统提供的,在调用sys_thread函数后,会进入中断状态,此时调用sys_thread函数时,就会将信号量传递给系统。
  3. 互斥锁:这种方式主要是通过优先级的高低来控制对资源的访问。
  4. 互斥锁和信号量都是用来解决进程之间的同步问题的。
  5. 还有一种同步方式是通过线程池来实现的。在这个过程中,线程池会创建一个线程,通过这个线程来跟其他线程进行交互,从而达到同步效果。

八、总结

通过上面的分析我们了解到,同步是一个复杂的问题,在内核态是如何完成同步的呢?

首先,在内核态有三个进程:这三个进程都可以互相访问对方的资源,也可以在资源被其他进程请求时进行同步。

当某个进程被阻塞时,它的所有子进程会从等待队列中取出一个子进程(或者其它子进程),并把它加到阻塞队列中。当所有子进程都被阻塞时,阻塞队列中就没有子进程了。这时,等待队列中的其他子进程就会把当前线程加到等待队列中。这三个进程在等待过程中不会互相影响,三个线程可以通过设置自己的优先级和其他线程进行同步。

以上是作为嵌入式开发工程师,关于Linux kernel同步机制你不得不知道的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:良许Linux教程网。如有侵权,请联系admin@php.cn删除
什么是linux设备节点什么是linux设备节点Apr 18, 2022 pm 08:10 PM

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

Linux中open和fopen的区别有哪些Linux中open和fopen的区别有哪些Apr 29, 2022 pm 06:57 PM

区别:1、open是UNIX系统调用函数,而fopen是ANSIC标准中的C语言库函数;2、open的移植性没fopen好;3、fopen只能操纵普通正规文件,而open可以操作普通文件、网络套接字等;4、open无缓冲,fopen有缓冲。

linux中什么叫端口映射linux中什么叫端口映射May 09, 2022 pm 01:49 PM

端口映射又称端口转发,是指将外部主机的IP地址的端口映射到Intranet中的一台计算机,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上;可以通过使用动态或固定的公共网络IP路由ADSL宽带路由器来实现。

什么是linux交叉编译什么是linux交叉编译Apr 29, 2022 pm 06:47 PM

在linux中,交叉编译是指在一个平台上生成另一个平台上的可执行代码,即编译源代码的平台和执行源代码编译后程序的平台是两个不同的平台。使用交叉编译的原因:1、目标系统没有能力在其上进行本地编译;2、有能力进行源代码编译的平台与目标平台不同。

linux中eof是什么linux中eof是什么May 07, 2022 pm 04:26 PM

在linux中,eof是自定义终止符,是“END Of File”的缩写;因为是自定义的终止符,所以eof就不是固定的,可以随意的设置别名,linux中按“ctrl+d”就代表eof,eof一般会配合cat命令用于多行文本输出,指文件末尾。

linux怎么判断pcre是否安装linux怎么判断pcre是否安装May 09, 2022 pm 04:14 PM

在linux中,可以利用“rpm -qa pcre”命令判断pcre是否安装;rpm命令专门用于管理各项套件,使用该命令后,若结果中出现pcre的版本信息,则表示pcre已经安装,若没有出现版本信息,则表示没有安装pcre。

linux怎么查询mac地址linux怎么查询mac地址Apr 24, 2022 pm 08:01 PM

linux查询mac地址的方法:1、打开系统,在桌面中点击鼠标右键,选择“打开终端”;2、在终端中,执行“ifconfig”命令,查看输出结果,在输出信息第四行中紧跟“ether”单词后的字符串就是mac地址。

linux中rpc是什么意思linux中rpc是什么意思May 07, 2022 pm 04:48 PM

在linux中,rpc是远程过程调用的意思,是Reomote Procedure Call的缩写,特指一种隐藏了过程调用时实际通信细节的IPC方法;linux中通过RPC可以充分利用非共享内存的多处理器环境,提高系统资源的利用率。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版