2016 - 2024

感恩一路有你

linux 并发信号处理程序 android开发中怎样解决多用户并发问题?

浏览量:2829 时间:2023-05-30 12:38:14 作者:采采

android开发中怎样解决多用户并发问题?

既然是多用户,就要把用户数据分开,否则无法体现多用户的机制体系,除非用户提供共享,系统支持共享,否则用户下的数据应该是私有的。

对于Android,也就是Linux系统来说,一个用户就是一个文件目录,用户目录之间的相互访问是通过权限来控制的。在没有指定权限的情况下,用户除非获得了系统权限,否则无法拥有相互控制的能力,也就是我们常说的root权限。存储在系统中,如果你获得root权限,这将是一种将文件写入系统目录的。root权限不容易获得,存在安全风险,不建议使用。我们可以绕道走。内部存储不好,但是有外部存储(比如SD卡)。这是很多用户共有的,相关数据可以放到外部存储上,达到共享的目的。可以做个参考。

linux最大端口数超过65535怎么办?

区分端口数和连接数!

事实上,可用的计算机端口数量只有65,536,这是一个事实。但是,也要注意,如果端口被占用,它并不总是你的,如果你不占用,你可以释放它。;不要用它。发布后,其他程序可以继续使用它。因此,在动态利用下,很难占用所有端口。

第二,要区分端口和连接。一个端口可以有几个连接,比如nginx。在普通linux上,一个80口可以有10万个并发连接,极端情况下可以近百万。所以因为端口复用,其实不会用那么多端口。

所以65536端口用完的神话基本不会出现。

spinlock和Semaphore信号量的区别?

互斥是一个关键。一个人可以带着它进入一个房间,出来时把它给排队的第一个人。一般的用法是序列化对临界区代码的访问,以确保这些代码不会并行运行。

旗语是可以容纳n个人的房间。如果人们不满意,他们可以进去。人满了就要等人出来。在N1的例子中,它被称为二元语义。通常的用法是限制对资源的同时访问。

二元语义和互斥的区别;

在一些系统中,二进制语义和互斥没有区别。在某些系统上,主要的区别在于互斥体必须由获得锁的进程来释放。Semaphore可以被其他进程释放(此时semaphore实际上是一个原子变量,可以加减),所以semaphore可以用于进程间同步。信号量的同步功能是所有系统都支持的,但是互斥是否能被其他进程释放是不确定的,所以建议互斥只用于保护criti。cal部分.信号量用于保护变量或同步。

另一个概念是自旋锁,这是一个内核状态概念。自旋锁和信号量的主要区别在于自旋锁忙于等待,而信号量处于休眠状态。对于一个可以休眠的进程来说,忙着等待当然没有意义。对于单CPU系统来说,忙着等待当然更没有意义(没有CPU可以释放锁)。所以只有多CPU的内核态非进程空间才会使用自旋锁。在非SMP的情况下,Linux内核的自旋锁只关闭irq,没有其他操作保证这个程序的运行不会被中断。实际上,它类似于互斥体的作用,序列化对临界区的访问。但是互斥体可以。;t保护中断和can 不能在中断处理程序中调用。对于可以睡眠的进程空间,自旋锁通常不是必需的。

-

内核同步措施

为了避免并发和竞争。内核提供了一组同步方法来保护共享数据。我们的重点不是介绍这些方法的详细用法,而是为什么要使用这些方法以及它们之间的区别。

Linux使用的同步机制,从2.0到2.6可以说是不断发展完善的。从最初的原子操作到后来的信号量,从大内核锁到今天 s旋转锁。这些同步机制的发展伴随着Linux从单处理器向对称多处理器的过渡;随着非抢占式内核向抢占式内核的转变。锁定机制变得越来越有效和复杂。

目前内核中的原子操作多用于计数。在其他情况下,两种锁和它们的变种,:,是最常用的。一个是旋转锁,另一个是信号量。让 我们将重点介绍这两种锁定机制。

旋转锁

自旋锁是一种专门为防止多个处理器并发而引入的锁。广泛应用于中断处理和内核中的其他部分(对于单个处理器,可以简单地关闭中断,防止中断处理中的并发,无需自旋锁)。

自旋锁最多只能由一个内核任务持有。如果一个内核任务试图请求一个已经被竞争(已经持有)的自旋锁,那么这个任务将继续经历一个繁忙的周期。——转动——,等待锁再次可用。如果锁没有被竞争,请求它的内核任务。可以马上拿到,继续。自旋锁可以防止多个内核任务在任何时候进入临界区,所以这种锁可以有效防止多个处理器上并发运行的内核任务争夺共享资源。

其实自旋锁的初衷是:短时间内轻量级锁。争用的自旋锁会使请求它的线程在等待该锁再次可用时自旋(特别是浪费处理器时间),因此自旋锁不应该持有太久。如果你需要长时间锁定,你 最好使用信号量。

自旋锁的基本形式如下:

自旋锁(mr锁);

//临界区域

spin _ unlock(Mr _ lock);

因为自旋锁一次最多只能由一个内核任务持有,所以一次只允许一个线程存在于临界区中。这很好地满足了对称多处理机所需的锁定服务。在单处理器上,自旋锁仅用作设置内核抢占的开关。如果内核抢占不存在,那么自旋锁将在编译时从内核中完全排除。

简单来说,自旋锁主要用在内核中,防止多个处理器并发访问关键区域,防止内核抢占带来的竞争。此外,自旋锁不允许任务休眠(持有自旋锁的任务休眠会导致自死锁),——可能会再次申请他已经持有的锁,因为休眠可能会导致持有该锁的内核任务被重新调度。它可以在中断环境中使用。

死锁:假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中一个资源,但是所有的资源都被占用了。所有的内核任务都在互相等待,但是它们永远不会释放它们已经占用的资源,所以任何内核任务都可以 得不到它所需要的资源。;t继续运行,这意味着发生了死锁。就是你占据了某个资源,然后去申请你已经拥有的资源。显然是不可能再获得资源了,所以你束缚了手脚。

旗语

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

信号量的睡眠特性使得信号量适合长时间持有锁的情况;只能在进程上下文中使用,因为它不能在中断上下文中调度;此外,当代码持有信号量时,它不能再持有自旋锁。

信号量的基本使用形式是:

静态声明互斥体(Mr _ S:

如果代码需要睡眠,——,这是经常发生的,当它与用户空间同步,—— ;唯一的选择是使用信号量。因为不受睡眠限制,通常使用信号量更容易。如果您需要在旋转锁和信号量之间进行选择,这应该取决于持有锁的时间长度。理想情况下,所有锁的持有时间应该尽可能短,但是如果锁持有时间很长,使用信号量是更好的选择。此外,与自旋锁不同,信号量不会关闭内核抢占,因此持有信号量的代码可以被抢占。这意味着信号量不会对调度响应时间产生负面影响。

自旋锁对信号量

需求建议的锁定方法

低开销锁定优先考虑旋转锁定。

短期锁定优先于自旋锁定。

长期锁定优先考虑信号量。

中断上下文中的锁定使用旋转锁定。

持有锁需要休眠和调度信号量。

信号量 内核 进程 用户

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。