Суть мьютекса в том, что даже если два ядра попытаются получить его одновременно, одно из них будет заблокировано, пока другое не освободит его.Мьютекс, который позволял двум ядрам одновременно удерживать этот мьютекс, был бы полностью сломан и бесполезен для его единственной, предназначенной цели.
Где-то в оборудовании существует арбитр шины, который позволяет только одному ядру управлять шинойчто связывает эти два ядра.Если у любого из ядер уже есть память, хранящая мьютекс в частном кэше, это ядро победит.В противном случае, какой бы автобус ни получил первым, он выиграет.
Арбитр шины может работать разными способами, но обычно он вращается.Таким образом, если ядра имеют значения 0, 1, 2 и 3, а ядро 2 имеет последнюю шину, то шина затем перейдет к ядру 3, если оно этого захочет, в противном случае ядро 0, если оно этого захочет, или ядро 1, если оно этого захочет,в противном случае вернемся к ядру 2. В зависимости от того, какая именно шина задействована (будь то битва между L2-кэш-памятью двух ядер или за саму память или что-то в этом роде), некоторые ядра могут конкурировать как единое целое с другими группами ядер, а затем подчиняться.для которого конкретное ядро получает его первым.
Может быть, одно ядро уже имеет контроль над шиной, и поэтому оно сразу победит.Как правило, арбитр позволяет ядру постоянно удерживать шину до тех пор, пока он по-прежнему хочет использовать ее для нескольких транзакций, чтобы избежать расточительных передач, которые не позволяют ядру продвигаться вперед.
Точныйдетали могут варьироваться в зависимости от большого количества факторов, включая то, как расположены ядра, какие ядра имеют блокировку в своих кэшах, в каких состояниях, у кого была последняя шина и используется ли арбитр шины временными интервалами, циклическим перебором или каким-либо другим механизмом, и так далее.Но любая реализация, которая не гарантировала бы, что одно-единственное ядро заводится, чтобы получить блокировку, считалась бы ужасно сломанной.