Средства синхронизации и взаимодействия процессов

Отрицательные группы и якоря

Рассмотрим некоторые более “продвинутые” конструкции регулярных выражений.

Предполагается, что вы уже знаете, как указать регулярному выражению, какие символы и/или их последовательности должны быть в строке для совпадения. А что если нужно указать не те символы, которые должны присутствовать, а те которых не должно быть? То есть если нужно вывести лишь согласные буквы, вы можете их перечислить, а можете использовать и отрицательную группу с гласными, например:

PS C:\> "a","b","c","d","e","f","g","h" -match "[^aoueyi]"

b

c

d

f

g

h

"Крышка" в качестве первого символа группы символов означает именно отрицание. То есть на месте группы может присутствовать любой символ кроме перечисленных в ней. Для того чтобы включить отрицание в символьных группах (\d, \w, \s), не обязательно заключать их в квадратные скобки, достаточно перевести их в верхний регистр. Например \D будет означать "что угодно, кроме цифр", а \S "всё кроме пробелов"

PS C:\> "a","b","1","c","45" -match "\D"

a

b

c

PS C:\> "a","-","*","c","&" -match "\W"

-

*

&

Символьные группы позволяют указать лишь содержимое одной позиции, один символ, находящийся в неопределенном месте строки. А что если надо например выбрать все слова которые начинаются с буквы w? Если просто поместить эту букву в регулярное выражение, то оно совпадёт для всех строк, где w вообще встречается, и не важно – в начале, в середине или в конце строки. В таких случаях на помощь приходят " якоря ". Они позволяют производить сравнение, начиная с определенной позиции в строке.

^ (крышка) является якорем начала строки, а $ (знак доллара) - обозначает конец строки.

Не запутайтесь - ^ как символ отрицания используется лишь в начале группы символов, а вне группы - этот символ является уже якорем. Авторам регулярных выражений явно не хватало специальных символов, и они по возможности использовали их более чем в одном месте.

Пример. Вывод списка процессов, имена которых начинаются с буквы w:

PS C:\> Get-Process | where {$_.name -match "^w"}

В многозадачной операционной системе при взаимодействии процессов друг с другом, при обмене данными между потоками, возникает проблема синхронизации. Она необходима для исключения таких явлений, как гонки и тупики.

Пример: программа печати файлов.

Процессы-клиенты читают переменную NEXT, записывают имя своего файла и наращивают значение NEXT на единицу. Предположим, что в некоторый момент процесс R решил распечатать свой файл, для этого он прочитал значение переменной NEXT, но поместить имя файла не успел, так как его выполнение было прервано (вследствие исчерпания кванта). Очередной процесс S, желающий распечатать файл, прочитал то же самое значение переменной NEXT, поместил имя своего файла. Когда в очередной раз управление будет передано процессу R, то он, запишет имя файла поверх имени файла процесса S. Таким образом, процесс S никогда не увидит свой файл распечатанным.

Подобная ситуация, когда 2 и более процесса обрабатывают разделяемые данные и результат зависит от соотношения скоростей процессов, называется гонками.

Критическая секция – это часть программы, в которой осуществляется доступ к разделяемым данным.

Правило для избежания конфликтов (взаимное исключение) – необходимо обеспечить, чтобы в каждый момент времени в критической секции, связанной с разделяемым ресурсом, находился только один процесс.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: