Seperti yang telah kita ketahui,
komputer dapat menyimpan informasi ke beberapa media penyimpanan yang berbeda,
seperti magnetic disks, magnetic tapes, dan optical disks.
Agar komputer dapat digunakan dengan nyaman, sistem operasi menyediakan sistem
penyimpanan dengan sistematika yang seragam. Sistem Operasi mengabstraksi
properti fisik dari media penyimpanannya dan mendefinisikan unit penyimpanan
logis, yaitu berkas. Berkas dipetakan ke media fisik oleh sistem operasi. Media
penyimpanan ini umumnya bersifat non-volatile, sehingga kandungan di
dalamnya tidak akan hilang jika terjadi gagal listrik mau pun system reboot.
Berkas adalah kumpulan informasi berkait yang diberi nama
dan direkam pada penyimpanan sekunder. Dari sudut pandang pengguna, berkas
merupakan bagian terkecil dari penyimpanan logis, artinya data tidak dapat
ditulis ke penyimpanan sekunder kecuali jika berada di dalam berkas. Biasanya
berkas merepresentasikan program (baik source mau pun bentuk objek) dan
data. Data dari berkas dapat bersifat numerik, alfabetik, alfanumerik, atau pun
biner. Format berkas juga bisa bebas, misalnya berkas teks, atau dapat juga
diformat pasti. Secara umum, berkas adalah urutan bit, byte, baris, atau
catatan yang didefinisikan oleh pembuat berkas dan pengguna.
Informasi dalam berkas ditentukan oleh pembuatnya. Ada
banyak beragam jenis informasi yang dapat disimpan dalam berkas. Hal ini
disebabkan oleh struktur tertentu yang dimiliki oleh berkas, sesuai dengan
jenisnya masing-masing. Contohnya:
- Text
file; yaitu urutan karakter yang disusun ke dalam
baris-baris.
- Source
file; yaitu urutan subroutine dan fungsi, yang
nantinya akan dideklarasikan.
- Object
file; merupakan urutan byte yang diatur ke dalam blok-blok
yang dikenali oleh linker dari sistem.
- Executable
file; adalah rangkaian code section yang dapat
dibawa loader ke dalam memori dan dieksekusi.
Berkas diberi nama, untuk kenyamanan bagi pengguna, dan
untuk acuan bagi data yang terkandung di dalamnya. Nama berkas biasanya berupa
string atau karakter. Beberapa sistem membedakan penggunaan huruf besar dan
kecil dalam penamaan sebuah berkas, sementara sistem yang lain menganggap kedua
hal di atas sama.Ketika berkas diberi nama, maka berkas tersebut akan menjadi
mandiri terhadap proses, pengguna, bahkan sistem yang membuatnya. Atribut
berkas terdiri dari:
- Nama;
merupakan satu-satunya informasi yang tetap dalam bentuk yang bisa dibaca
oleh manusia (human-readable form)
- Type;
dibutuhkan untuk sistem yang mendukung beberapa type berbeda
- Lokasi;
merupakan pointer ke device dan ke lokasi berkas pada device tersebut
- Ukuran
(size); yaitu ukuran berkas pada saat
itu, baik dalam byte, huruf, atau pun blok
- Proteksi;
adalah informasi mengenai kontrol akses, misalnya siapa saja yang boleh
membaca, menulis, dan mengeksekusi berkas
- Waktu,
tanggal dan identifikasi pengguna; informasi ini biasanya
disimpan untuk:
- pembuatan
berkas,
- modifikasi
terakhir yang dilakukan pada berkas, dan
- penggunaan
terakhir berkas.
Data
tersebut dapat berguna untuk proteksi, keamanan, dan monitoring penggunaan dari
berkas.
Informasi tentang seluruh berkas disimpan dalam struktur
direktori yang terdapat pada penyimpanan sekunder. Direktori, seperti berkas,
harus bersifat non-volatile, sehingga keduanya harus disimpan pada
sebuah device dan baru dibawa bagian per bagian ke memori pada saat
dibutuhkan.
Sebuah berkas adalah jenis data abstrak. Untuk
mendefinisikan berkas secara tepat, kita perlu melihat operasi yang dapat
dilakukan pada berkas tersebut. Sistem operasi menyediakan system calls
untuk membuat, membaca, menulis, mencari, menghapus, dan sebagainya. Berikut
dapat kita lihat apa yang harus dilakukan sistem operasi pada keenam operasi
dasar pada berkas.
- Membuat
sebuah berkas: Ada dua cara dalam membuat
berkas. Pertama, tempat baru di dalam sistem berkas harus di alokasikan
untuk berkas yang akan dibuat. Kedua, sebuah direktori harus mempersiapkan
tempat untuk berkas baru, kemudian direktori tersebut akan mencatat nama
berkas dan lokasinya pada sistem berkas.
- Menulis
pada sebuah berkas: Untuk menulis pada berkas,
kita menggunakan system call beserta nama berkas yang akan ditulisi
dan informasi apa yang akan ditulis pada berkas. Ketika diberi nama
berkas, sistem mencari ke direktori untuk mendapatkan lokasi berkas.
Sistem juga harus menyimpan penunjuk tulis pada berkas dimana penulisan
berikut akan ditempatkan. Penunjuk tulis harus diperbaharui setiap terjadi
penulisan pada berkas.
- Membaca
sebuah berkas: Untuk dapat membaca berkas,
kita menggunakan system call beserta nama berkas dan di blok memori
mana berkas berikutnya diletakkan. Sama seperti menulis, direktori mencari
berkas yang akan dibaca, dan sistem menyimpan penunjuk baca pada berkas
dimana pembacaan berikutnya akan terjadi. Ketika pembacaan dimulai,
penunjuk baca harus diperbaharui. Sehingga secara umum, suatu berkas
ketika sedang dibaca atau ditulis, kebanyakan sistem hanya mempunyai satu
penunjuk, baca dan tulis menggunakan penunjuk yang sama, hal ini menghemat
tempat dan mengurangi kompleksitas sistem.
- Menempatkan
kembali sebuah berkas: Direktori yang bertugas untuk
mencari berkas yang bersesuaian, dan mengembalikan lokasi berkas pada saat
itu. Menempatkan berkas tidak perlu melibatkan proses I/O. Operasi sering
disebut pencarian berkas.
- Menghapus
sebuah berkas: Untuk menghapus berkas kita
perlu mencari berkas tersebut di dalam direktori. Setelah ditemukan kita
membebaskan tempat yang dipakai berkas tersebut (sehingga dapat digunakkan
oleh berkas lain) dan menghapus tempatnya di direktori.
- Memendekkan
berkas: Ada suatu keadaan dimana
pengguna menginginkan atribut dari berkas tetap sama tetapi ingin
menghapus isi dari berkas tersebut. Fungsi ini mengizinkan semua atribut
tetap sama tetapi panjang berkas menjadi nol, hal ini lebih baik dari pada
memaksa pengguna untuk menghapus berkas dan membuatnya lagi.
Enam operasi dasar ini sudah mencakup operasi minimum yang
di butuhkan. Operasi umum lainnya adalah menyambung informasi baru di akhir
suatu berkas, mengubah nama suatu berkas, dan lain-lain. Operasi dasar ini
kemudian digabung untuk melakukan operasi lainnya. Sebagai contoh misalnya kita
menginginkan salinan dari suatu berkas, atau menyalin berkas ke peralatan I/O
lainnya seperti printer, dengan cara membuat berkas lalu membaca dari
berkas lama dan menulis ke berkas yang baru.
Hampir semua operasi pada berkas melibatkan pencarian berkas
pada direktori. Untuk menghindari pencarian yang lama, kebanyakan sistem akan
membuka berkas apabila berkas tersebut digunakan secara aktif. Sistem operasi
akan menyimpan tabel kecil yang berisi informasi semua berkas yang dibuka yang
disebut "tabel berkas terbuka". Ketika berkas sudah tidak digunakan
lagi dan sudah ditutup oleh yang menggunakan, maka sistem operasi mengeluarkan
berkas tersebut dari tabel berkas terbuka.
Beberapa sistem terkadang langsung membuka berkas ketika
berkas tersebut digunakan dan otomatis menutup berkas tersebut jika program
atau pemakainya dimatikan. Tetapi pada sistem lainnya terkadang membutuhkan
pembukaan berkas secara tersurat dengan system call (open)
sebelum berkas dapat digunakan.
Implementasi dari buka dan tutup berkas dalam lingkungan
dengan banyak perngguna seperti UNIX, lebih rumit. Dalam sistem seperti itu
pengguna yang membuka berkas mungkin lebih dari satu dan pada waktu yang hampir
bersamaan. Umumnya sistem operasi menggunakan tabel internal dua level. Ada
tabel yang mendata proses mana saja yang membuka berkas tersebut, kemudian tabel
tersebut menunjuk ke tabel yang lebih besar yang berisi informasi yang berdiri
sendiri seperti lokasi berkas pada disk, tanggal akses dan ukuran berkas.
Biasanya tabel tersebut juga memiliki data berapa banyak proses yang membuka
berkas tersebut.
Jadi, pada dasarnya ada beberapa informasi yang terkait
dengan pembukaan berkas yaitu:
- Penunjuk
Berkas: Pada sistem yang tidak
mengikutkan batas berkas sebagai bagian dari system call baca dan tulis,
sistem tersebut harus mengikuti posisi dimana terakhir proses baca dan
tulis sebagai penunjuk. Penunjuk ini unik untuk setiap operasi pada
berkas, maka dari itu harus disimpan terpisah dari atribut berkas yang ada
pada disk.
- Penghitung
berkas yang terbuka: Setelah berkas ditutup,
sistem harus mengosongkan kembali tabel berkas yang dibuka yang digunakan
oleh berkas tadi atau tempat di tabel akan habis. Karena mungkin ada
beberapa proses yang membuka berkas secara bersamaan dan sistem harus
menunggu sampai berkas tersebut ditutup sebelum mengosongkan tempatnya di
tabel. Penghitung ini mencatat banyaknya berkas yang telah dibuka dan
ditutup, dan menjadi nol ketika yang terakhir membaca berkas menutup
berkas tersebut barulah sistem dapat mengosongkan tempatnya di tabel.
- Lokasi
berkas pada disk: Kebanyakan operasi pada
berkas memerlukan sistem untuk mengubah data yang ada pada berkas.
Informasi mengenai lokasi berkas pada disk disimpan di memori agar
menghindari banyak pembacaan pada disk untuk setiap operasi.
Beberapa sistem operasi menyediakan fasilitas untuk memetakan
berkas ke dalam memori pada sistem memori virtual. Hal tersebut mengizinkan
bagian dari berkas ditempatkan pada suatu alamat di memori virtual. Operasi
baca dan tulis pada memori dengan alamat tersebut dianggap sebagai operasi baca
dan tulis pada berkas yang ada di alamat tersebut. Menutup berkas mengakibatkan
semua data yang ada pada alamat memori tersebut dikembalikan ke disk dan
dihilangkan dari memori virtual yang digunakan oleh proses.
Pertimbangan utama dalam perancangan sistem berkas dan
seluruh sistem operasi, apakah sistem operasi harus mengenali dan mendukung
jenis berkas. Jika suatu sistem operasi mengenali jenis dari berkas, maka ia
dapat mengoperasikan berkas tersebut. Contoh apabila pengguna mencoba mencetak
berkas yang merupakan kode biner dari program yang pasti akan menghasilkan
sampah, hal ini dapat dicegah apabila sistem operasi sudah diberitahu bahwa
berkas tersebut merupakan kode biner.
Teknik yang umum digunakan dalam implementasi jenis berkas
adalah menambahkan jenis berkas dalam nama berkas. Nama dibagi dua, nama dan
akhiran (ekstensi), biasanya dipisahkan dengan karakter titik. Sistem
menggunakan akhiran tersebut untuk mengindikasikan jenis berkas dan jenis
operasi yang dapat dilakukan pada berkas tersebut. Sebagai contoh hanya berkas
yang berakhiran .bat, .exe atau .com yang bisa dijalankan
(eksekusi). Program aplikasi juga menggunakan akhiran tersebut untuk mengenal
berkas yang dapat dioperasikannya. Akhiran ini dapat ditimpa atau diganti jika
diperbolehkan oleh sistem operasi.
Beberapa sistem operasi menyertakan dukungan terhadap
akhiran, tetapi beberapa menyerahkan kepada aplikasi untuk mengatur akhiran
berkas yang digunakan, sehingga jenis dari berkas dapat menjadi petunjuk
aplikasi apa yang dapat mengoperasikannya.
Sistem UNIX tidak dapat menyediakan dukungan untuk akhiran
berkas karena menggunakan angka ajaib yang disimpan di depan berkas untuk
mengenali jenis berkas. Tidak semua berkas memiliki angka ini, jadi sistem
tidak bisa bergantung pada informasi ini. Tetapi UNIX memperbolehkan akhiran
berkas tetapi hal ini tidak dipaksakan atau tergantung sistem operasi,
kebanyakan hanya untuk membantu pengguna mengenali jenis isi dari suatu berkas.
Jenis berkas
|
Akhiran
|
Fungsi
|
executable
|
exe,
com, bat, bin
|
program
yang siap dijalankan
|
objek
|
obj,
o
|
bahasa
mesin, kode terkompilasi
|
kode
asal (source code)
|
c,
cc, pas, java, asm, a
|
kode
asal dari berbagai bahasa
|
batch
|
bat,
sh
|
perintah
pada shell
|
text
|
txt,
doc
|
data
text, document
|
pengolah
kata
|
wpd,
tex, doc
|
format
jenis pengolah data
|
library
|
lib,
a, DLL
|
library
untuk rutin program
|
print,
gambar
|
ps,
dvi, gif
|
format
aSCII atau biner untuk dicetak
|
archive
|
arc,
zip, tar
|
beberapa
berkas yang dikumpulkan menjadi satu berkas. Terkadang dimampatkan untuk
penyimpanan
|
Kita juga dapat menggunakan jenis berkas untuk
mengidentifikasi struktur dalam dari berkas. Berkas berupa source dan objek
memiliki struktur yang cocok dengan harapan program yang membaca berkas
tersebut. Suatu berkas harus memiliki struktur yang dikenali oleh sistem
operasi. Sebagai contoh, sistem operasi menginginkan suatu berkas yang dapat
dieksekusi memiliki struktur tertentu agar dapat diketahui dimana berkas
tersebut akan ditempatkan di memori dan di mana letak instruksi pertama berkas
tersebut. Beberapa sistem operasi mengembangkan ide ini sehingga mendukung
beberapa struktur berkas, dengan beberapa operasi khusus untuk memanipulasi
berkas dengan struktur tersebut.
Kelemahan memiliki dukungan terhadap beberapa struktur
berkas adalah: Ukuran dari sistem operasi dapat menjadi besar, jika sistem
operasi mendefinisikan lima struktur berkas yang berbeda maka ia perlu
menampung kode untuk yang diperlukan untuk mendukung semuanya. Setiap berkas
harus dapat menerapkan salah satu struktur berkas tersebut. Masalah akan timbul
ketika terdapat aplikasi yang membutuhkan struktur informasi yang tidak
didukung oleh sistem operasi tersebut.
Beberapa sistem operasi menerapkan dan mendukung struktur
berkas sedikit struktur berkas. Pendekatan ini digunakan pada MS-DOS dan UNIX.
UNIX menganggap setiap berkas sebagai urutan 8-bit byte, tidak ada interpretasi
sistem operasi terhadap dari bit-bit ini. Skema tersebut menawarkan
fleksibilitas tinggi tetapi dukungan yang terbatas. Setiap aplikasi harus
menambahkan sendiri kode untuk menerjemahkan berkas masukan ke dalam struktur
yang sesuai. Walau bagaimana pun juga sebuah sistem operasi harus memiliki
minimal satu struktur berkas yaitu untuk berkas yang dapat dieksekusi sehingga
sistem dapat memuat berkas dalam memori dan menjalankannya.
Sangat berguna bagi sistem operasi untuk mendukung struktur
berkas yang sering digunakan karena akan menghemat pekerjaan pemrogram. Terlalu
sedikit struktur berkas yang didukung akan mempersulit pembuatan program,
terlalu banyak akan membuat sistem operasi terlalu besar dan pemrogram akan
bingung.
Menempatkan batas dalam berkas dapat menjadi rumit bagi
sistem operasi. Sistem disk biasanya memiliki ukuran blok yang sudah ditetapkan
dari ukuran sektor. Semua I/O dari disk dilakukan dalam satuan blok dan semua
blok ('physical record') memiliki ukuran yang sama. Tetapi ukuran dari 'physical
record' tidak akan sama dengan ukuran 'logical record'. Ukuran dari
'logical record' akan bervariasi. Memuatkan beberapa 'logical record'
ke dalam 'physical record' merupakan solusi umum dari masalah ini.
Sebagai contoh pada sistem operasi UNIX, semua berkas
didefinisikan sebagai kumpulan byte. Setiap byte dialamatkan menurut batasnya
dari awal berkas sampai akhir. Pada kasus ini ukuran 'logical record'
adalah 1 byte. Sistem berkas secara otomatis memuatkan byte-byte tersebut
kedalam blok pada disk.
Ukuran 'logical record', ukuran blok pada disk, dan
teknik untuk memuatkannya menjelaskan berapa banyak 'logical record'
dalam tiap-tiap 'physical record'. Teknik memuatkan dapat dilakukan oleh
aplikasi pengguna atau oleh sistem operasi.
Berkas juga dapat dianggap sebagai urutan dari beberapa blok
pada disk. Konversi dari 'logical record' ke 'physical record' merupakan
masalah perangkat lunak.
Tempat pada disk selalu berada pada blok, sehingga beberapa
bagian dari blok terakhir yang ditempati berkas dapat terbuang. Jika setiap
blok berukuran 512 byte, sebuah berkas berukuran 1.949 byte akan menempati
empat blok (2.048 byte) dan akan tersisa 99 byte pada blok terakhir. Byte yang
terbuang tersebut dipertahankan agar ukuran dari unit tetap blok bukan byte
disebut fragmentasi dalam disk. Semua sistem berkas pasti mempunyai fragmentasi
dalam disk, semakin besar ukuran blok akan semakin besar fragmentasi dalam
disknya.
Konsistensi semantik adalah parameter yang penting untuk
evaluasi sistem berkas yang mendukung penggunaan berkas secara bersama. Hal ini
juga merupakan karakterisasi dari sistem yang menspesifikasi semantik dari
banyak pengguna yang mengakses berkas secara bersama-sama. Lebih khusus,
semantik ini seharusnya dapat menspesifikasi kapan suatu modifikasi suatu data
oleh satu pengguna dapat diketahui oleh pengguna lain. Terdapat beberapa macam
konsistensi semantik. Di bawah ini akan dijelaskan kriteria yang digunakan
dalam UNIX.
Berkas sistem UNIX mengikuti konsistensi semantik:
- Penulisan
ke berkas yang dibuka oleh pengguna dapat dilihat langsung oleh pengguna
lain yang sedang mengakses ke berkas yang sama.
- Terdapat
bentuk pembagian dimana pengguna membagi pointer lokasi ke berkas
tersebut. Sehingga perubahan pointer satu pengguna akan mempengaruhi semua
pengguna sharingnya.