Unix qanday ishlaydi? Kernel, shell va fayl sistemasi
Assalamu Alaykum bugungi maqolada Unix uni qanday ishlashi va Unixda bizga kerak bo'ladigan ba'zi bir mavzular haqida gaplashamiz.
Unixning asosiy g'oyasi shunday bo'lgan har bir dastur o'z ishini mukammal qila olishi kerak , agarda bizga 2 ta ishni qiladigan dastur kerak bo'lsa ularni bog'lagan holda ishlatamiz.
Hozir biz ishlatadigan Linux bu Unix emas u Unixdan ilhomlangan holda qilingan, MacOs esa Unixning eski versiyasidan olinib keyin o'zgartirishlar kiritilgan . Shuning uchun umumiy unixni tushunish bizga serverlarda ishlatilinadigan linuxni tushunishga yordam beradi.
Unix Kernel va shell
Unixda unix kernel bu operatsion tizimning asosiy qismi, ya’ni u kompyuterning hardware qismlarini bilan gaplashadi.
Har bir process Nodejs process , Word process hammasi hardware qismga kernel orqali chiqadi. Masalan siz terminalni ochganingizda va ba'zi buyruqlarni yozganda , shell bu buyruqlarni oladi va Unix Kernel bilan gaplashgan holda sizga natijani yetkazadi.Shell Kernel bilan system call orqali gaplashadi va bu unga xotirada yangi fayl yaratish, network card orqali tcp packetlarni jo'natish, yoki Ramda buffer uchun joy ochishga yordam beradi . Biz bu system callarni C orqali chaqirishimiz mumkin , Shell esa C application va bu system callarga unda huquq bor (Nodejsda libuvda C va C++ orqali bularga chiqa oladi).

Unix kernel image
Buyruq haqida ma'lumot olish
Biz shelldagi har bir buyruq haqida osongina ma'lumot olishimiz mumkin. Buni man ls orqali ls buyrug'i haqida ma'lumot olamiz u 3 qismdan iborat:
Umumiy buyruqlar (general commands)
system calls (
man 2 open)lib functions

Terminal qanday ishlaydi ?
Siz terminal iconni bosganingizda terminal ochiladi va u unix kernelga shellni ochishni aytadi kernel, xotiraga boradi va yangi shell processni ishga tushiradi va terminal shu processga ulanadi.
Ular orasidagi kommunikatsiyani keyingi maqolalarda to'liq yozishga harakat qilaman.
Shell bu kernel bilan ishlash uchun interfeys deb tushunsak bo'ladi.
Bash(Shell)ning buyruqlarni ishga tushurish tartibi
Xo'sh terminalga yoki shellga buyruqni yozib enter tugmasini bosganda bash buyruqni qanday aniqlaydi ?
1-bo'lib aliaslarni qidiradi ular bunga bunday bo'ladi alias serverrunner="node server.js" , alias faqatgina shu processda bo'ladi terminalni qayta o'chirib yoqsa unutiladi. Undan keyin funksiyalarni qidiradi. Ular ushbu ko'rinishda bo'ladi :
greet() {
echo "Hello, $1!"
}funksiya chaqirilganda uning ichidagi ammallar ishga tushadi. Undan keyin built in funksiyalarni qidiradi (echo, disown). Undan so'ng $PATH o'zgaruvchisi (bu o'zgaruvchi ishga tushuriladigan fayllar pathini o'z ichiga oladi) va o'sha path orqali ishga tushuradigan fayllarni qidiradi.
Ularning turini type command orqali ko'ra olamiz.
echo $PATH | tr ":" "/n" hamma pathlarni ko'rsatadigan buyruq.
Shuning uchun biz qachon yangi dastur o'rnatsak u o'zining ishga tushuriladigan fayl patnini PATH ga qo'shib qo'yadi.
Bu o'zgaruvchini node processda ham olish mumkin chunki bu o'zgaruvchi har bir unix tomonidan yaratilgan processga avtomatik berib yuboriladi.

Unix file permission
Unixda 3 xil permission bor r — readable (o'qish uchun), w — writable (yozish uchun) va x — executable (run bo'ladigan dasturlar) buni 'ls -l' orqali ko'rishimiz mumkin.
rasmdan ko'rinib turganidek uning 4 qismi ham mavjud — oddiy fayllar uchun d — directory (papkalar uchun)
rw- bu o'qish , yozish mumkin ammo ishga tushurib bo'lmaydi.
unix executable fayllar bu Cning compile bo'lgani ya'ni binary formatdagi va CPU bilan to'g'ridan to'g'ri gaplasha oladi.

Unix fayl sistemasi (Path, CWD)
Agarda Unix operatsion tizimining root papkasiga borsak u yerda bin papkasi bo'ladi bu yerda sistemaning ishga tushursa bo'ladigan binary fayllari bo'ladi va usr/local/bin papkasida esa biz o'rnatgan dasturlarning ishga tushuradigan binary fayllar bo'ladi. usr bu yerda user emas Unix system resources .
Absolute va Relative Path
Absolute path bu har doim root directory(papkadan) boshlanadi va doim /
bilan boshlanadi masalan, /folder/something.
Relative path doim . yoki .. bilan yoki oddiy fayl nomi bilan boshlanishi mumkin server.js va U doim hozirgi papkadan boshlab hisoblanadi. Terminalda pwd buyruqni yozgand bizga absolute path beradi . Bu yerdagi asosiy g'oya relative path hozir qayerda turganimizga bog'liq.
Nodejsda hamma fayl o'qish paytida bir muammoga duch kelgan bo'lsak kerak .
const fs = require('fs');
const data = fs.readFileSync('./data/message.txt', 'utf-8');
console.log(data);
Tepadagi misolda ko'rganingizdek dasturni ishlashi uni qayerda turib run qilishimizga bog'liq bo'lib qolmoqda. Ammo bizga qayerdan bo'lsa ham ishga tushadigan dastur kerak. Buni sababini ko'ramiz agarda realitive path ishlatsak nodejs buni qidirishga harakat qiladi ammo topa olmaydi sababi biz nodejs dasturni boshqa papkadan turib run qilmoqdamiz va shell nodejs processni ishga tushurganda unga o'zining hozirgi turgan joyini beradi va natijada fs module fayli o'sha directorydan qidiradi va topolmaydi. Biz uni Nodejsda process.cwd() orqali ko'rishimiz process.chdir('/') orqali o'zgartirishimiz mumkin. require esa cwd haqida umuman o'ylamaydi u hozrigi ishlayotgan fayl directory bilan ishlaydi .Shuning uchun fayl o'qiganda absolute path berish bu muammoni oldini oladi. Bu uchun biz __dirname orqali hozirgi modulning absolut pathni olsak bo'ladi va bu orqali hamma kompyuterda ishlaydi. Bu ESM modullarda biroz o'zgaradi quyidagicha bo'ladi.

//CommonJS
const fs = require('fs');
const path = require('path');
const filePath = path.join(__dirname, 'data', 'message.txt');
const data = fs.readFileSync(filePath, 'utf-8');
console.log(data);
//ES module version
import { readFile } from 'fs/promises';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
// Recreate __dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const filePath = join(__dirname, 'data', 'message.txt');
try {
const data = await readFile(filePath, 'utf-8');
console.log(data);
} catch (err) {
console.error('Error reading file:', err);
}Xulosa
Xulosa qilib aytadigan bo'lsak Unix dasturlashda juda katta o'rin tutadi qaysi dasturlash tili bo'lishidan qatiy nazar, deyarli 90% serverlar Linuxdaku axir. Bugun undan faqatgina bir parcha ko'rdik xolos.
Agarda maqola yoqqan bo'lsa chapak chaling (ko'p chalsayam bo'ladi). Obuna bo'lishni unutmang ;)
Xato va kamchiliklar uchun uzr !!!
linkedin.com =>Ulug’bek Habibov | LinkedIn
telegram channel =>@habibov_ulugbek