Что такое bufhash в данном скрипте и как он появился?

Я исследовал старый код 4.4BSD и наткнулся на директорию со скриптами, вероятно, предназначенными для оболочки csh. В принципе, я разобрался с кодом скрипта, хотя мой опыт с языками оболочек ограничен. У меня возник вопрос о массиве bufhash: он не объявляется, но к нему сразу есть доступ. Это структура данных, предоставляемая ядром, для доступа в оболочке? Где можно найти информацию по этому поводу? Также мне неясно, что такое bufqueues — это указатель на структуру buf. Современные версии Linux и FreeBSD предоставляют аналогичные возможности? <br/> Кроме того, хотелось бы уточнить, что обозначает директива define. Это объявление функции? То есть это структура, где между define и end находится тело функции? <br/> Спасибо. <pre><code># Count the number of buffers in the buffer cache for which
# bp-&gt;b_flags &amp; $bufcount_match is non-0.
#
#	@(#)bdump	8.1 (Berkeley) 6/10/93

set $bufcount_match=0x020000
define bufcount

	set $i = 0
	set $num = 0

	while ($i &lt; 512)

		set $bp = bufhash[$i].b_forw
		while ($bp != bufhash[$i].b_back)
			if ($bp-&gt;b_flags &amp; $bufcount_match)
				set $num++
			end
			set $bp = $bp-&gt;b_forw
		end
		# printf "bucket: %d cumulative %d\n", $i, $num
		set $i++
	end
	printf "Number of buffers with flags &amp; %x in hash table: %d\n", $bufcount_match, $num
end

# Dump the entire buffer cache.

define bufdump

	set $i = 0
	set $num = 0

	while ($i &lt; 512)

		set $bp = bufhash[$i].b_forw
		while ($bp != bufhash[$i].b_back)
			printf "bp=0x%x flags=0x%x vp=0x%x lblkno=0x%x blkno=0x%x\n", $bp, $bp-&gt;b_flags, $bp-&gt;b_vp, $bp-&gt;b_lblkno, $bp-&gt;b_blkno
			set $num++
			set $bp = $bp-&gt;b_forw
		end
		set $i++
	end
	printf "Number of buffers in hash table: %d\n", $num
end

# Dump the buffers in a particular hashbucket.
# usage: 
  • 26 февраля 2025 г. 14:05
Ответы на вопрос 1
`bufhash` в данном скрипте представляет собой массив (или хеш-таблицу) буферов, которые используются для управления кэшированием данных в операционной системе. Он, скорее всего, был объявлен в исходном коде ядра, который предоставляет доступ к структуре данных, связанной с буферным кэшем. Конкретно в 4.4BSD `bufhash` — это массив 512 указателей на буферные структуры, которые организуют буферы в хеш-таблицу для эффективного доступа.

Когда вы видите такой массив в скрипте, это означает, что массив был предварительно определён в ядре системы, и скрипт просто обращается к нему по имени. Как правило, такие структуры данных объявляются в заголовочных файлах ядра, и для их изучения вам понадобится просмотреть соответствующие файлы. Например, в ядре 4.4BSD информация о кешах и связанных структурах может находиться в `buf.h` или аналогичных файловых заголовках.

Что касается `bufqueues`, вы правы: это, вероятно, указатели на структуры `buf`, которые представляют отдельные буферы в системе. Они обеспечивают механизм для организации и управления буферами во время операций ввода-вывода.

Современные версии Linux и FreeBSD имеют схожие механизмы управления кешем, но способы их реализации могут различаться. Например, в Linux есть концепция кэша страниц, а в FreeBSD вы можете найти аналогичную реализацию в коде управления буфером, однако детали структур могут варьироваться.

Что касается директивы `define`, в контексте данного скрипта:

- `define` обозначает начало определения функции в скрипте C Shell (или tcsh), а не определение структуры.
- Тело функции находится между `define` и `end`. Вся логика выполнения этой функции будет происходить, когда она будет вызвана.

Если у вас есть следующие вопросы или вам нужен более детальный анализ, не стесняйтесь спрашивать!
Похожие вопросы