Lably
Skip to content

Block (data storage)

Sequence of bits or bytes of a fixed size

  • 6 min read
  • 1 chapter

Related on Lably

Through Computing, Data communication and Record (computer science)

Most file systems are based on a block device, which is a level of abstraction for the hardware responsible for storing and retrieving specified blocks of data, though the block size in file systems may be a multiple of the physical block size. This leads to space inefficiency due to internal fragmentation, since file lengths are often not integer multiples of block size, and thus the last block of a file may remain partially empty. This will create slack space. Some newer file systems, such as Btrfs and FreeBSD UFS2, attempt to solve this through techniques called block suballocation and tail merging. Other file systems such as ZFS support variable block sizes.

Block storage is normally abstracted by a file system or database management system (DBMS) for use by applications and end users. The physical or logical volumes accessed via block I/O may be devices internal to a server, directly attached via SCSI or Fibre Channel, or distant devices accessed via a storage area network (SAN) using a protocol such as iSCSI, or AoE. DBMSes often use their own block I/O for improved performance and recoverability as compared to layering the DBMS on top of a file system.

On Linux the default block size for most file systems is 4096 bytes. The stat command part of GNU Core Utilities can be used to check the block size.

In languages

C++

In C++, a block can be read using std::ifstream (input file stream).

<span id="mwVg"></span><span class="k" id="mwVw">import</span><span class="w" id="mwWA"> </span><span class="n" id="mwWQ">std</span><span class="p" id="mwWg">;</span> <span class="k" id="mwWw">using</span><span class="w" id="mwXA"> </span><span class="n" id="mwXQ">std</span><span class="o" id="mwXg">::</span><span class="n" id="mwXw">array</span><span class="p" id="mwYA">;</span> <span class="k" id="mwYQ">using</span><span class="w" id="mwYg"> </span><span class="n" id="mwYw">std</span><span class="o" id="mwZA">::</span><span class="kt" id="mwZQ">byte</span><span class="p" id="mwZg">;</span> <span class="k" id="mwZw">using</span><span class="w" id="mwaA"> </span><span class="n" id="mwaQ">std</span><span class="o" id="mwag">::</span><span class="n" id="mwaw">ifstream</span><span class="p" id="mwbA">;</span> <span class="k" id="mwbQ">using</span><span class="w" id="mwbg"> </span><span class="n" id="mwbw">std</span><span class="o" id="mwcA">::</span><span class="n" id="mwcQ">ios</span><span class="p" id="mwcg">;</span> <span class="k" id="mwcw">constexpr</span><span class="w" id="mwdA"> </span><span class="kt" id="mwdQ">size_t</span><span class="w" id="mwdg"> </span><span class="n" id="mwdw">BLOCK_SIZE</span><span class="w" id="mweA"> </span><span class="o" id="mweQ">=</span><span class="w" id="mweg"> </span><span class="mi" id="mwew">4096</span><span class="p" id="mwfA">;</span> <span class="k" id="mwfQ">try</span><span class="w" id="mwfg"> </span><span class="p" id="mwfw">{</span> <span class="w" id="mwgA"> </span><span class="n" id="mwgQ">ifstream</span><span class="w" id="mwgg"> </span><span class="n" id="mwgw">file</span><span class="p" id="mwhA">(</span><span class="s" id="mwhQ">"example.bin"</span><span class="p" id="mwhg">,</span><span class="w" id="mwhw"> </span><span class="n" id="mwiA">ios</span><span class="o" id="mwiQ">::</span><span class="n" id="mwig">binary</span><span class="p" id="mwiw">);</span> <span class="w" id="mwjA"> </span><span class="n" id="mwjQ">file</span><span class="p" id="mwjg">.</span><span class="n" id="mwjw">exceptions</span><span class="p" id="mwkA">(</span><span class="n" id="mwkQ">ios</span><span class="o" id="mwkg">::</span><span class="n" id="mwkw">failbit</span><span class="w" id="mwlA"> </span><span class="o" id="mwlQ">|</span><span class="w" id="mwlg"> </span><span class="n" id="mwlw">ios</span><span class="o" id="mwmA">::</span><span class="n" id="mwmQ">badbit</span><span class="p" id="mwmg">);</span> <span class="w" id="mwmw"> </span><span class="n" id="mwnA">array</span><span class="o" id="mwnQ"><</span><span class="kt" id="mwng">byte</span><span class="p" id="mwnw">,</span><span class="w" id="mwoA"> </span><span class="n" id="mwoQ">BLOCK_SIZE</span><span class="o" id="mwog">></span><span class="w" id="mwow"> </span><span class="n" id="mwpA">buf</span><span class="p" id="mwpQ">;</span> <span class="w" id="mwpg"> </span><span class="n" id="mwpw">file</span><span class="p" id="mwqA">.</span><span class="n" id="mwqQ">read</span><span class="p" id="mwqg">(</span><span class="k" id="mwqw">reinterpret_cast</span><span class="o" id="mwrA"><</span><span class="kt" id="mwrQ">char</span><span class="o" id="mwrg">*></span><span class="p" id="mwrw">(</span><span class="n" id="mwsA">buf</span><span class="p" id="mwsQ">.</span><span class="n" id="mwsg">data</span><span class="p" id="mwsw">()),</span><span class="w" id="mwtA"> </span><span class="n" id="mwtQ">BLOCK_SIZE</span><span class="p" id="mwtg">);</span> <span class="p" id="mwtw">}</span><span class="w" id="mwuA"> </span><span class="k" id="mwuQ">catch</span><span class="w" id="mwug"> </span><span class="p" id="mwuw">(</span><span class="k" id="mwvA">const</span><span class="w" id="mwvQ"> </span><span class="n" id="mwvg">ios</span><span class="o" id="mwvw">::</span><span class="n" id="mwwA">failure</span><span class="o" id="mwwQ">&</span><span class="w" id="mwwg"> </span><span class="n" id="mwww">e</span><span class="p" id="mwxA">)</span><span class="w" id="mwxQ"> </span><span class="p" id="mwxg">{</span> <span class="w" id="mwxw"> </span><span class="n" id="mwyA">std</span><span class="o" id="mwyQ">::</span><span class="n" id="mwyg">println</span><span class="p" id="mwyw">(</span><span class="n" id="mwzA">stderr</span><span class="p" id="mwzQ">,</span><span class="w" id="mwzg"> </span><span class="s" id="mwzw">"I/O error: {}"</span><span class="p" id="mw0A">,</span><span class="w" id="mw0Q"> </span><span class="n" id="mw0g">e</span><span class="p" id="mw0w">.</span><span class="n" id="mw1A">what</span><span class="p" id="mw1Q">());</span> <span class="p" id="mw1g">}</span>

C#

In C#, a block can be read with the FileStream class.

<span id="mw4Q"></span><span class="k" id="mw4g">using</span><span class="w" id="mw4w"> </span><span class="nn" id="mw5A">System.IO</span><span class="p" id="mw5Q">;</span> <span class="k" id="mw5g">static</span><span class="w" id="mw5w"> </span><span class="k" id="mw6A">const</span><span class="w" id="mw6Q"> </span><span class="kt" id="mw6g">int</span><span class="w" id="mw6w"> </span><span class="n" id="mw7A">BLOCK_SIZE</span><span class="w" id="mw7Q"> </span><span class="o" id="mw7g">=</span><span class="w" id="mw7w"> </span><span class="mi" id="mw8A">4096</span><span class="p" id="mw8Q">;</span> <span class="k" id="mw8g">using</span><span class="w" id="mw8w"> </span><span class="p" id="mw9A">(</span><span class="n" id="mw9Q">FileStream</span><span class="w" id="mw9g"> </span><span class="n" id="mw9w">stream</span><span class="w" id="mw-A"> </span><span class="o" id="mw-Q">=</span><span class="w" id="mw-g"> </span><span class="n" id="mw-w">File</span><span class="p" id="mw_A">.</span><span class="n" id="mw_Q">Open</span><span class="p" id="mw_g">(</span><span class="s" id="mw_w">"example.bin"</span><span class="p" id="mwAQA">,</span><span class="w" id="mwAQE"> </span><span class="n" id="mwAQI">FileMode</span><span class="p" id="mwAQM">.</span><span class="n" id="mwAQQ">Open</span><span class="p" id="mwAQU">))</span> <span class="p" id="mwAQY">{</span> <span class="w" id="mwAQc"> </span><span class="kt" id="mwAQg">byte</span><span class="p" id="mwAQk">[]</span><span class="w" id="mwAQo"> </span><span class="n" id="mwAQs">block</span><span class="w" id="mwAQw"> </span><span class="o" id="mwAQ0">=</span><span class="w" id="mwAQ4"> </span><span class="k" id="mwAQ8">new</span><span class="w" id="mwARA"> </span><span class="kt" id="mwARE">byte</span><span class="p" id="mwARI">[</span><span class="n" id="mwARM">BLOCK_SIZE</span><span class="p" id="mwARQ">];</span> <span class="w" id="mwARU"> </span><span class="k" id="mwARY">await</span><span class="w" id="mwARc"> </span><span class="n" id="mwARg">stream</span><span class="p" id="mwARk">.</span><span class="n" id="mwARo">ReadAsync</span><span class="p" id="mwARs">(</span><span class="n" id="mwARw">block</span><span class="p" id="mwAR0">,</span><span class="w" id="mwAR4"> </span><span class="mi" id="mwAR8">0</span><span class="p" id="mwASA">,</span><span class="w" id="mwASE"> </span><span class="n" id="mwASI">BLOCK_SIZE</span><span class="p" id="mwASM">);</span> <span class="p" id="mwASQ">}</span>

Java

In Java, a block can be read using java.io.FileInputStream.

<span id="mwASs"></span><span class="kn" id="mwASw">import</span><span class="w" id="mwAS0"> </span><span class="nn" id="mwAS4">java.io.FileInputStream</span><span class="p" id="mwAS8">;</span> <span class="kn" id="mwATA">import</span><span class="w" id="mwATE"> </span><span class="nn" id="mwATI">java.io.IOException</span><span class="p" id="mwATM">;</span> <span class="kd" id="mwATQ">static</span><span class="w" id="mwATU"> </span><span class="kd" id="mwATY">final</span><span class="w" id="mwATc"> </span><span class="kt" id="mwATg">int</span><span class="w" id="mwATk"> </span><span class="n" id="mwATo">BLOCK_SIZE</span><span class="w" id="mwATs"> </span><span class="o" id="mwATw">=</span><span class="w" id="mwAT0"> </span><span class="mi" id="mwAT4">4096</span><span class="p" id="mwAT8">;</span> <span class="k" id="mwAUA">try</span><span class="w" id="mwAUE"> </span><span class="p" id="mwAUI">(</span><span class="n" id="mwAUM">FileInputStream</span><span class="w" id="mwAUQ"> </span><span class="n" id="mwAUU">file</span><span class="w" id="mwAUY"> </span><span class="o" id="mwAUc">=</span><span class="w" id="mwAUg"> </span><span class="k" id="mwAUk">new</span><span class="w" id="mwAUo"> </span><span class="n" id="mwAUs">FileInputStream</span><span class="p" id="mwAUw">(</span><span class="s" id="mwAU0">"example.bin"</span><span class="p" id="mwAU4">))</span><span class="w" id="mwAU8"> </span><span class="p" id="mwAVA">{</span> <span class="w" id="mwAVE"> </span><span class="kt" id="mwAVI">byte</span><span class="o" id="mwAVM">[]</span><span class="w" id="mwAVQ"> </span><span class="n" id="mwAVU">buf</span><span class="w" id="mwAVY"> </span><span class="o" id="mwAVc">=</span><span class="w" id="mwAVg"> </span><span class="k" id="mwAVk">new</span><span class="w" id="mwAVo"> </span><span class="kt" id="mwAVs">byte</span><span class="o" id="mwAVw">[</span><span class="n" id="mwAV0">BLOCK_SIZE</span><span class="o" id="mwAV4">]</span><span class="p" id="mwAV8">;</span> <span class="w" id="mwAWA"> </span><span class="n" id="mwAWE">file</span><span class="p" id="mwAWI">.</span><span class="na" id="mwAWM">read</span><span class="p" id="mwAWQ">(</span><span class="n" id="mwAWU">buf</span><span class="p" id="mwAWY">);</span> <span class="p" id="mwAWc">}</span><span class="w" id="mwAWg"> </span><span class="k" id="mwAWk">catch</span><span class="w" id="mwAWo"> </span><span class="p" id="mwAWs">(</span><span class="n" id="mwAWw">IOException</span><span class="w" id="mwAW0"> </span><span class="n" id="mwAW4">e</span><span class="p" id="mwAW8">)</span><span class="w" id="mwAXA"> </span><span class="p" id="mwAXE">{</span> <span class="w" id="mwAXI"> </span><span class="n" id="mwAXM">e</span><span class="p" id="mwAXQ">.</span><span class="na" id="mwAXU">printStackTrace</span><span class="p" id="mwAXY">();</span> <span class="p" id="mwAXc">}</span>

Python

In Python, a block can be read with the read method of whatever is implementing io.IOBase.

<span id="mwAX8"></span><span class="n" id="mwAYA">BLOCK_SIZE</span><span class="p" id="mwAYE">:</span> <span class="nb" id="mwAYI">int</span> <span class="o" id="mwAYM">=</span> <span class="mi" id="mwAYQ">4096</span> <span class="k" id="mwAYU">with</span> <span class="nb" id="mwAYY">open</span><span class="p" id="mwAYc">(</span><span class="s2" id="mwAYg">"example.bin"</span><span class="p" id="mwAYk">,</span> <span class="s2" id="mwAYo">"rb"</span><span class="p" id="mwAYs">)</span> <span class="k" id="mwAYw">as</span> <span class="n" id="mwAY0">file</span><span class="p" id="mwAY4">:</span> <span class="c1" id="mwAY8"># file is of type io.BufferedReader</span> <span class="n" id="mwAZA">block</span><span class="p" id="mwAZE">:</span> <span class="nb" id="mwAZI">bytes</span> <span class="o" id="mwAZM">=</span> <span class="n" id="mwAZQ">file</span><span class="o" id="mwAZU">.</span><span class="n" id="mwAZY">read</span><span class="p" id="mwAZc">(</span><span class="n" id="mwAZg">BLOCK_SIZE</span><span class="p" id="mwAZk">)</span>

Rust

In Rust, a block can be read with the read_exact method of std::fs::File.

<span id="mwAaU"></span><span class="k" id="mwAaY">use</span><span class="w" id="mwAac"> </span><span class="n" id="mwAag">std</span><span class="p" id="mwAak">::</span><span class="n" id="mwAao">fs</span><span class="p" id="mwAas">::</span><span class="n" id="mwAaw">File</span><span class="p" id="mwAa0">;</span> <span class="k" id="mwAa4">const</span><span class="w" id="mwAa8"> </span><span class="n" id="mwAbA">BLOCK_SIZE</span><span class="p" id="mwAbE">:</span><span class="w" id="mwAbI"> </span><span class="kt" id="mwAbM">usize</span><span class="w" id="mwAbQ"> </span><span class="o" id="mwAbU">=</span><span class="w" id="mwAbY"> </span><span class="mi" id="mwAbc">4096</span><span class="p" id="mwAbg">;</span> <span class="k" id="mwAbk">if</span><span class="w" id="mwAbo"> </span><span class="kd" id="mwAbs">let</span><span class="w" id="mwAbw"> </span><span class="nb" id="mwAb0">Ok</span><span class="p" id="mwAb4">(</span><span class="k" id="mwAb8">mut</span><span class="w" id="mwAcA"> </span><span class="n" id="mwAcE">file</span><span class="p" id="mwAcI">)</span><span class="w" id="mwAcM"> </span><span class="o" id="mwAcQ">=</span><span class="w" id="mwAcU"> </span><span class="n" id="mwAcY">File</span><span class="p" id="mwAcc">::</span><span class="n" id="mwAcg">open</span><span class="p" id="mwAck">(</span><span class="s" id="mwAco">"example.bin"</span><span class="p" id="mwAcs">)</span> <span class="p" id="mwAcw">{</span> <span class="w" id="mwAc0"> </span><span class="kd" id="mwAc4">let</span><span class="w" id="mwAc8"> </span><span class="k" id="mwAdA">mut</span><span class="w" id="mwAdE"> </span><span class="n" id="mwAdI">buf</span><span class="w" id="mwAdM"> </span><span class="o" id="mwAdQ">=</span><span class="w" id="mwAdU"> </span><span class="p" id="mwAdY">[</span><span class="mi" id="mwAdc">0</span><span class="k" id="mwAdg">u8</span><span class="p" id="mwAdk">;</span><span class="w" id="mwAdo"> </span><span class="n" id="mwAds">BLOCK_SIZE</span><span class="p" id="mwAdw">];</span> <span class="w" id="mwAd0"> </span><span class="n" id="mwAd4">file</span><span class="p" id="mwAd8">.</span><span class="n" id="mwAeA">read_exact</span><span class="p" id="mwAeE">(</span><span class="o" id="mwAeI">&</span><span class="k" id="mwAeM">mut</span><span class="w" id="mwAeQ"> </span><span class="n" id="mwAeU">buf</span><span class="p" id="mwAeY">);</span> <span class="p" id="mwAec">}</span>

More in Computing and communication