একটি রেস শর্ত দুর্বলতা কি?

একটি রেস শর্ত দুর্বলতা কি?
আপনার মত পাঠকরা MUO সমর্থন করতে সাহায্য করে। আপনি যখন আমাদের সাইটে লিঙ্ক ব্যবহার করে একটি ক্রয় করেন, আমরা একটি অনুমোদিত কমিশন উপার্জন করতে পারি।

একটি রেস অবস্থা ঘটে যখন দুটি অপারেশন একটি নির্দিষ্ট ক্রমে ঘটতে হবে, কিন্তু তারা বিপরীত ক্রমে চলতে পারে।





উদাহরণস্বরূপ, একটি মাল্টিথ্রেডেড অ্যাপ্লিকেশনে, দুটি পৃথক থ্রেড একটি সাধারণ ভেরিয়েবল অ্যাক্সেস করতে পারে। ফলস্বরূপ, যদি একটি থ্রেড ভেরিয়েবলের মান পরিবর্তন করে, অন্যটি এখনও নতুন মান উপেক্ষা করে পুরানো সংস্করণ ব্যবহার করতে পারে। এটি অনাকাঙ্ক্ষিত ফলাফলের কারণ হবে।





দিনের মেকইউজের ভিডিও

এই মডেলটি আরও ভালভাবে বোঝার জন্য, প্রসেসরের প্রসেস সুইচিং প্রক্রিয়াটি ঘনিষ্ঠভাবে পরীক্ষা করা ভাল।





কিভাবে একটি প্রসেসর প্রক্রিয়া পরিবর্তন করে

আধুনিক অপারেটিং সিস্টেম এক সাথে একাধিক প্রক্রিয়া চালাতে পারে, যাকে মাল্টিটাস্কিং বলা হয়। আপনি পরিপ্রেক্ষিতে এই প্রক্রিয়া তাকান যখন CPU এর নির্বাহ চক্র , আপনি দেখতে পারেন যে মাল্টিটাস্কিং সত্যিই বিদ্যমান নেই।

পরিবর্তে, প্রসেসরগুলি একই সাথে চালানোর জন্য প্রসেসগুলির মধ্যে ক্রমাগত স্যুইচ করে বা অন্তত এমনভাবে কাজ করে যেন তারা তা করছে। সিপিইউ একটি প্রক্রিয়া সম্পূর্ণ হওয়ার আগেই বাধা দিতে পারে এবং একটি ভিন্ন প্রক্রিয়া পুনরায় শুরু করতে পারে। অপারেটিং সিস্টেম এই প্রক্রিয়াগুলির পরিচালনা নিয়ন্ত্রণ করে।



উদাহরণস্বরূপ, রাউন্ড রবিন অ্যালগরিদম, সবচেয়ে সহজ স্যুইচিং অ্যালগরিদমগুলির মধ্যে একটি, নিম্নরূপ কাজ করে:

  একটি ডায়াগ্রাম 3টি সারিবদ্ধ, স্লিপিং প্রসেস করে একটি 1টি সক্রিয় প্রক্রিয়া যা CPU বর্তমানে চলছে

সাধারণত, এই অ্যালগরিদম অপারেটিং সিস্টেম নির্ধারণ করে প্রতিটি প্রক্রিয়াকে খুব অল্প সময়ের জন্য চালানোর অনুমতি দেয়। উদাহরণস্বরূপ, এটি দুই মাইক্রোসেকেন্ডের সময়কাল হতে পারে।





সিপিইউ প্রতিটি প্রক্রিয়াকে পালাক্রমে নেয় এবং দুই মাইক্রোসেকেন্ডের জন্য চালানো কমান্ডগুলি চালায়। বর্তমানটি শেষ হয়েছে কি না তা নির্বিশেষে এটি পরবর্তী প্রক্রিয়াতে চলতে থাকে। সুতরাং, একজন শেষ-ব্যবহারকারীর দৃষ্টিকোণ থেকে, একাধিক প্রক্রিয়া একই সাথে চলছে বলে মনে হয়। যাইহোক, যখন আপনি পর্দার পিছনে তাকান, CPU এখনও ক্রমানুসারে কাজ করছে।

যাইহোক, উপরের চিত্রটি দেখায়, রাউন্ড রবিন অ্যালগরিদমে কোনো অপ্টিমাইজেশান বা প্রক্রিয়াকরণ অগ্রাধিকার ধারণার অভাব রয়েছে। ফলস্বরূপ, এটি একটি বরং প্রাথমিক পদ্ধতি যা বাস্তব সিস্টেমে খুব কমই ব্যবহৃত হয়।





এখন, এই সব ভালভাবে বুঝতে, কল্পনা করুন যে দুটি থ্রেড চলছে। যদি থ্রেডগুলি একটি সাধারণ ভেরিয়েবল অ্যাক্সেস করে, একটি রেসের অবস্থা দেখা দিতে পারে।

একটি উদাহরণ ওয়েব অ্যাপ্লিকেশন এবং রেস শর্ত

আপনি এখন পর্যন্ত যা কিছু পড়েছেন তার একটি নির্দিষ্ট উদাহরণে প্রতিফলিত করতে নীচের সাধারণ ফ্লাস্ক অ্যাপটি দেখুন। এই অ্যাপ্লিকেশনটির উদ্দেশ্য হল ওয়েবে সঞ্চালিত অর্থ লেনদেন পরিচালনা করা। নামের একটি ফাইলে নিম্নলিখিতটি সংরক্ষণ করুন money.py :

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

class Account(db.Model):
id = db.Column(db.Integer, primary_key = True)
amount = db.Column(db.String(80), unique = True)

def __init__(self, count):
self.amount = amount

def __repr__(self):
return '' % self.amount

@app.route("/")
def hi():
account = Account.query.get(1) # There is only one wallet.
return "Total Money = {}".format(account.amount)

@app.route("/send/")
def send(amount):
account = Account.query.get(1)

if int(account.amount) < amount:
return "Insufficient balance. Reset money with /reset!)"

account.amount = int(account.amount) - amount
db.session.commit()
return "Amount sent = {}".format(amount)

@app.route("/reset")
def reset():
account = Account.query.get(1)
account.amount = 5000
db.session.commit()
return "Money reset."

if __name__ == "__main__":
app.secret_key = 'heLLoTHisIsSeCReTKey!'
app.run()

এই কোডটি চালানোর জন্য, আপনাকে অ্যাকাউন্ট টেবিলে একটি রেকর্ড তৈরি করতে হবে এবং এই রেকর্ডের মাধ্যমে লেনদেন চালিয়ে যেতে হবে। আপনি কোডে দেখতে পাচ্ছেন, এটি একটি পরীক্ষার পরিবেশ, তাই এটি টেবিলের প্রথম রেকর্ডের বিপরীতে লেনদেন করে।

from money import db 
db.create_all()
from money import Account
account = Account(5000)
db.session.add(account)
db.session.commit()

আপনি এখন ,000 ব্যালেন্স সহ একটি অ্যাকাউন্ট তৈরি করেছেন। অবশেষে, নিম্নলিখিত কমান্ডটি ব্যবহার করে উপরের সোর্স কোডটি চালান, যদি আপনার ফ্লাস্ক এবং ফ্লাস্ক-এসকিউএলকেমি প্যাকেজ ইনস্টল করা থাকে:

python money.py 

সুতরাং আপনার কাছে ফ্লাস্ক ওয়েব অ্যাপ্লিকেশন রয়েছে যা একটি সাধারণ নিষ্কাশন প্রক্রিয়া করে। এই অ্যাপ্লিকেশনটি GET অনুরোধ লিঙ্কগুলির সাথে নিম্নলিখিত ক্রিয়াকলাপগুলি সম্পাদন করতে পারে৷ যেহেতু ফ্লাস্ক ডিফল্টরূপে 5000 পোর্টে চলে, তাই আপনি যে ঠিকানায় এটি অ্যাক্সেস করেন তা হল 127.0.0.1:5000/ . অ্যাপটি নিম্নলিখিত শেষ পয়েন্টগুলি প্রদান করে:

  • 127.0.0.1:5000/ বর্তমান ভারসাম্য প্রদর্শন করে।
  • 127.0.0.1:5000/পাঠান/{অ্যামাউন্ট} অ্যাকাউন্ট থেকে পরিমাণ বিয়োগ করে।
  • 127.0.0.1:5000/রিসেট অ্যাকাউন্টটি ,000 এ রিসেট করে।

এখন, এই পর্যায়ে, আপনি রেসের অবস্থার দুর্বলতা কীভাবে ঘটে তা পরীক্ষা করতে পারেন।

একটি রেস অবস্থা দুর্বলতার সম্ভাবনা

উপরের ওয়েব অ্যাপ্লিকেশনটিতে একটি সম্ভাব্য রেস অবস্থার দুর্বলতা রয়েছে।

কল্পনা করুন যে আপনার সাথে শুরু করার জন্য ,000 আছে এবং দুটি ভিন্ন HTTP অনুরোধ তৈরি করুন যা পাঠাবে। এর জন্য, আপনি লিঙ্কটিতে দুটি ভিন্ন HTTP অনুরোধ পাঠাতে পারেন 127.0.0.1:5000/পাঠান/1 . ধরে নিলাম, যত তাড়াতাড়ি ওয়েব সার্ভার প্রথম অনুরোধটি প্রক্রিয়া করে, CPU এই প্রক্রিয়াটি বন্ধ করে এবং দ্বিতীয় অনুরোধটি প্রক্রিয়া করে। উদাহরণস্বরূপ, কোডের নিম্নলিখিত লাইনটি চালানোর পরে প্রথম প্রক্রিয়াটি থামতে পারে:

account.amount = int(account.amount) - amount 

এই কোডটি একটি নতুন মোট গণনা করেছে কিন্তু এখনও ডেটাবেসে রেকর্ড সংরক্ষণ করেনি। দ্বিতীয় অনুরোধ শুরু হলে, এটি একই গণনা করবে, ডাটাবেসের মান থেকে বিয়োগ করবে—,000—এবং ফলাফল সংরক্ষণ করবে। যখন প্রথম প্রক্রিয়াটি আবার শুরু হবে, তখন এটি তার নিজস্ব মূল্য সংরক্ষণ করবে—,999—যা সাম্প্রতিক অ্যাকাউন্ট ব্যালেন্স প্রতিফলিত করবে না।

সুতরাং, দুটি অনুরোধ সম্পূর্ণ হয়েছে, এবং প্রতিটির অ্যাকাউন্ট ব্যালেন্স থেকে বিয়োগ করা উচিত, যার ফলে একটি নতুন ব্যালেন্স ,998 হবে। কিন্তু, ওয়েব সার্ভার যে ক্রমানুসারে তাদের প্রক্রিয়া করে তার উপর নির্ভর করে, চূড়ান্ত অ্যাকাউন্ট ব্যালেন্স ,999 হতে পারে।

কল্পনা করুন যে আপনি পাঁচ সেকেন্ডের একটি টাইম ফ্রেমে টার্গেট সিস্টেমে স্থানান্তর করার জন্য 128 টি অনুরোধ পাঠান। এই লেনদেনের ফলস্বরূপ, অ্যাকাউন্টের প্রত্যাশিত বিবৃতি হবে ,000 - 8 = ,875৷ যাইহোক, রেসের অবস্থার কারণে, চূড়ান্ত ভারসাম্য ,875 এবং ,999 এর মধ্যে যেকোন কিছু হিসাবে পরিবর্তিত হতে পারে।

প্রোগ্রামাররা নিরাপত্তার অন্যতম গুরুত্বপূর্ণ উপাদান

একটি সফ্টওয়্যার প্রকল্পে, একজন প্রোগ্রামার হিসাবে, আপনার বেশ কয়েকটি দায়িত্ব রয়েছে। উপরের উদাহরণটি একটি সাধারণ অর্থ স্থানান্তর অ্যাপ্লিকেশনের জন্য ছিল। একটি সফ্টওয়্যার প্রকল্পে কাজ করার কল্পনা করুন যা একটি ব্যাঙ্ক অ্যাকাউন্ট বা একটি বড় ই-কমার্স সাইটের ব্যাকএন্ড পরিচালনা করে।

আপনাকে অবশ্যই এই ধরনের দুর্বলতার সাথে পরিচিত হতে হবে যাতে আপনি তাদের রক্ষা করার জন্য যে প্রোগ্রামটি লিখেছেন তা দুর্বলতা থেকে মুক্ত থাকে। এর জন্য দরকার দৃঢ় দায়িত্ব।

একটি জাতি অবস্থা দুর্বলতা তাদের মধ্যে শুধুমাত্র একটি. আপনি যে প্রযুক্তি ব্যবহার করেন না কেন, আপনার লেখা কোডের দুর্বলতাগুলির জন্য আপনাকে সতর্ক থাকতে হবে। একজন প্রোগ্রামার হিসেবে আপনি যে সবচেয়ে গুরুত্বপূর্ণ দক্ষতা অর্জন করতে পারেন তা হল সফটওয়্যার নিরাপত্তার সাথে পরিচিতি।

কিভাবে আপনার ল্যাপটপকে গেমিং এর জন্য ভালো করা যায়