Skip to content

Commit

Permalink
[post](write new post about linux file locking)
Browse files Browse the repository at this point in the history
  • Loading branch information
shabane committed Feb 14, 2024
1 parent b705efb commit 03d3e37
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 0 deletions.
162 changes: 162 additions & 0 deletions content/post/linux-file-locking/linux-file-locking.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
---
title: "Linux File Locking چیست؟"
date: 2024-02-09T01:49:42+03:30
draft: false
author: Arya
image: images/post/flilock.jpeg
Categories: [
'tech',
'linux',
]
tags: [
'file locking چیست',
'لاک کردن فایل در لینوکس چیست؟',
'what is file locking in linux?',
'how to lock file in linux?',
'file locking در لینوکس چیست؟',
]
---


بیایید قبل از اینکه راه حل را ببینیم، اول مشکل را دقیق تر برسی کنیم.
به این فکر کنید که شما یک فایلی دارید که شامل یک عدد است که اشاره می‌کند به مقدار
اعتباری که کاربر در حسابش دارد. حالا اگر قرار باشد یک پورسه اون مقدار را بر اساس ارائه
سرویسی، از حساب کاربر کم کند، و پروسه دیگری به دلیل افزایش اعتبار، مقداری را به حساب
کاربر اضافه کند، چه مشکلاتی اتفاق می‌افتد؟

برای اینکه دقیق تر بشیم، این روند رو باهم پیش می‌بریم.
فرض کنید فایلی به اسم
amount.txt
مقدار 100 داخلش نوشته شده است. و دو پروسه کم و اضافه کردن را اجرا می‌کنیم.
توی این مثال،‌ ما می‌خواهیم مقدار 20 از حساب کاربر کم و مقدار 50 به حساب کاربر
اضافه کنیم، پس ما انتظار داریم در انتها فایل ما مقدار 130 را درونش ذخیره کرده باشد.


- پروسه اول فایل را می‌خواند و مقدار 100 را در حاظه‌اش نگه می‌دارد
- پروسه دوم فایل را می‌خواند و مقدار 100 را در حاظه‌اش نگه می‌دارد
- پروسه اول مقدار 20 را از 100 کم می‌کند و مقدار 80 را در حافظه ذخیره می‌کند
- پروسه دوم مقدار 50 را به 100 اضافه می‌کند و مقدار 150 را در حافظه ذخیره می‌کند
- پروسه اول مقدار 80 را در فایل ذخیره می‌کند
- پروسه دوم مقدار 150 را در فایل ذخیره می‌کند

همینطور که همه ما انتظار داشتیم، ما باید در این فایل مقدار 130 را ذخیره می‌کردیم،
اما پروسه های ما به دلیل اینکه هیچ همکاری و یا هیچ مکانیزمی دیگری ندارند که این مقدار ها را
به یکدیگر اطلاع دهند، مشکل
[Race condition](https://en.wikipedia.org/wiki/Race_condition#Software)
رخ می‌دهد.

یکی از راه حل های این مشکل
lock
کردن فایل توسط هر پروسه است، که به این کار
file locking
گفته می‌شود.

**file locking**
یک مکانیزم برای کنترل دسترسی چندین پروسه به یک فایل است.

> توی لینوکس یکی از دستورات خطرناکی که داریم دستور
> sudo rm -rf /
> است. وقتی این دستور را اجرا کنیم کل فایل های لینوکس ما حذف می‌شود.
> دلیل اینکار این است که لینوکس به صورت پیشفرض فایل های باز شده را
> lock
> نمی‌کند.
با اینحال لینوکس دو مکانیزم مختلف
*advisory* و *mandatory*
را پشتیبانی می‌کند.

> توی این پست بیشتر تمرکز من روی مکانیزم
> advisory locking(مشورتی)
> است.
این روش به این شکل عمل می‌کند که هیچ پروسه‌ای مجبور به اجرای این روش نیست و اگر حتی
فایل توسط یک پروسه‌ای
lock
شده باشد، باز هم پروسه های دیگر می‌توانند به
lock
بودن فایل اهمیت ندهند و مقدار آن را تغییر دهند. این اتفاق به این دلیل می‌افتد که
advisory lock
توسط سیستم عامل و یا فایل سیستم انجام نمی‌شود.

خب بیایید با یک مثال این فرایند را برسی کنیم. مثل مثال قبلی فرض کنید ما مقدار 100
را داخل فایل
amount.txt
داریم و می‌خواهیم مقدار 20 از آن کم و مقدار 50 به آن اضافه کنیم.

- پروسه اول قبل از خواندن فایل، فایل را لاک می‌کند
- پروسه دوم برای لاک کردن فایل اقدام می‌کند و از جایی که پروسه اول از پیش فایل را لاک کرده است، برای آزاد شدن لاک صبر می‌کند
- پروسه اول مقدار 20 را از 100 کم می‌کند و مقدار 80 را درون فایل می‌نویسد
- پروسه اول لاک فایل را آزاد می‌کند.
- پروسه دوم فایل را لاک و مقدار جدید 80 را از فایل می‌خواند
- پروسه دوم مقدار 50 را به 80 اضافه و مقدار 120 را درون فایل می‌نویسد
- پروسه دوم لاک فایل را آزاد می‌کند تا پروسه های دیگر بتوانند با فایل کار کنند.

---

اگر شما می‌خواهید این مکانیزم را روی یک فایل اجرا کنید، دستور
flock
برای شما اینکار را خواهد کرد.

```bash
flock [options] file|directory command [arguments]
```

این کامند در حالت عادی از شما یک فایل و یک دستور خواهد گرفت و مکانیزم
advisory lock
را روی ان فایل اجرا خواهد کرد.

```bash
flock /tmp/fli echo 12>/tmp/fli
```

برای اینکه روند را بهتر درک کنیم یک فایل
bash
می‌نویسیم که بتوانیم مثال اولیه را روی آن اجرا کنیم.


```bash
#!/bin/bash
file="balance.dat"
value=$(cat $file)
echo "Read current balance:$value"

#sleep 10 seconds to simulate business calculation
progress=10
while [[ $progress -lt 101 ]]; do
echo -n -e "\033[77DCalculating new balance..$progress%"
sleep 1
progress=$((10+progress))
done
echo ""

value=$((value+$1))
echo "Write new balance ($value) back to $file."
echo $value > "$file"
echo "Done."
```

ما این فایل را همزمان با دو ترمینال اجرا می‌کنیم.

![advisory lock](/images/post/advisory_lock.gif)

همینطور که می‌بینید پروسه دوم برای اینکه محتوای فایل را تغییر دهد، باید صبر کند تا لاک فایل
آزاد شود.


---

این پست خلاصه‌ای بود از
[این بلاگ](https://www.baeldung.com/linux/file-locking)
که هر دو نوع
advisory lock و mandatory lock
را توضیح می‌دهد.

برای من سوال بود که من چطور می‌توانم مکانیزمی که
flock
استفاده می‌کند را در برنامه های خودم پیاده سازی کنم، و خب نتیجه این بود که معمولا برای
advisory lock
هر زبانی یک کتابخانه استاندار دارد
توی
[پایتون کتابخانه](https://docs.python.org/3/library/fcntl.html)
`fcntl`
اینکار را انجام می‌دهد.
Binary file added static/images/post/advisory_lock.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added static/images/post/flilock.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 03d3e37

Please sign in to comment.