Is Linux support asynchronous file system access?
بىماس قەدەملىك I/O ھەققىدە ئىزدىنىش مېنىڭ كونا ھەۋەسلىرىمنىڭ بېرى، چۈنكى لىنۇكىسنى ياقتۇرۇپ قالغاندىن باشلاپ ئۇنى تەتقىق قىلدىم، قانداق قىلىپ يۇقىرى ئۈنۈملۈك مۇلازىمىتىر پروگراممىسى يازغىلى بولىدىغانلىقى ھەققىدە ئىزدەندىم
(I'm research a long while about how to write high performance Linux server applications)
ئىلگىرىكى تەتقىقاتىمغا ئاساسلانغاندا select, poll, epoll قاتارلىق بىر قىسىم مەشغۇلات سىستېمىسى ئىغىزلىرىنى پەقەت بىماس قەدەملىك Tcp, Udp تور ئالاقىسى ئۈچۈنلا ئىشلىتىشكە بولاتتى، ئادەتتىكى قاتتىق دىسكىدىكى ھۆججەتلەرنى باشقۇرۇش ئۈچۈن ئىشلىتىشكە بولمايتتى،
(We cannot use "select, poll, epoll" Linux system call for regular files, only can be use for TCP and UDP sockets.)
مۇشۇ يېقىندا Rust embedded development تېمىسىدىكى بىر تۈرلۈم يولداشلار توپىدا tokio ھەققىدە پاراڭلىشىپ قالدۇق،
- مېنىڭ قارىشىمچە Linux مەشغۇلات سىستېمىسى بىزگە ھىچقانداق بىماسقەدەملىك ھۆججەت سىستېمىسى زىيارەت قىلىش Api لىرىنى بەرمىگەن، Rust tokio ئىشلەتكەن تۆۋەن قاتلام I/O قەۋىتى mio بولسا لىنيە كۆلچىكى (Thread pool) ئارقىلىق بىماس قەدەملىك (Asynchronous) I/O نى تەقلىگەن،
- ئۇلارنىڭ قارىشىچە Linux مەشغۇلات سىستېمىسى (ھەمدە Windows مەشغۇلات سىستېمىسىمۇ) بۇنىڭدەك مۇناسىۋەتلىك تۆۋەن قاتلاملىق Api لارنى تەمىنلىگەن
شۇنىڭ بىلەن ئۇلارنىڭ تۈرتكىسىدە كاللامدا سوئاللار تۇغۇلدى، "نىمە؟ ئەجىبا ئىلگىرى مەن بۇنىڭ مەۋجۇتلۇقىنى بىلمەي قالدىمما؟ stackoverflow دىكى بىر قىسىم پىر كالانلار مېنى راس ئالدىۋەتتىما؟ Oh no... I have to research it..."
توردىن ئىزدىسەم راس دىگەندەك باشقىلارنىڭ epoll بىلەن بىماسقەدەملىك ھۆججەت سىستېمىسى مەشغۇلاتى قىلغانلىق يازما ۋە مىسال كودلىرى بار ئىكەن،
تۆۋەندىكىسى مېنى دۇتتار قىلىپ چېلىپ نەچچە سائەت ۋاقتىمنى ئېلىۋەتكەن "تاتلىق" يازما:
شۇنىڭۋىلەن بۇ تەتقىقاتنى باشلاپ كىچىككىنە ئاددىي بىر C++ پروگراممىسى يېزىپ Linux epoll system call بىلەن ئادەتتىكى ھۆججەت سىستېمىسىنى زىيارت قىلغىلى بولىدىغان-بولمايدىغانلىقى ھەققىدە تەتقىقاتقا ئاتلاندىم،
تۆۋەندىكىسى تەتقىقات جەريانىدا ئىشلەتكەن پروگرامما كودى پايدىلىنىش ياكى بىرلىكتە تەتقىقات ئۈچۈن:
CMakeLists.txt:
#CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(AsyncFileSystemIO)
set(
MY_SOURCE_FILES
./src/main.cpp
)
add_executable(AsyncFileIOExample "${MY_SOURCE_FILES}")
Program.cpp:
/*Program.cpp*/
#include <sys/epoll.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <exception>
#include <string>
#include <iostream>
#include <errno.h>
#include <string.h>
#include <unistd.h>
void reportError(const char *message) {
std::cerr << message << ": " << std::string(strerror(errno)) << std::endl;
}
int main() {
const int myFile = open("/home/dream_lab/Desktop/bundle.tar.gz", O_RDONLY);
// const int myFile = 0;
if (myFile == -1) {
reportError("Cannot open file");
return -1;
}
const int epoll = epoll_create1(0);
if (epoll == -1) {
reportError("Cannot create epoll");
return -2;
}
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = myFile;
if (epoll_ctl(epoll, EPOLL_CTL_ADD, myFile, &event) != 0) {
reportError("Cannot add file to epoll");
return -3;
}
const int POLL_SIZE = 64;
struct epoll_event events[POLL_SIZE];
while (true) {
const int eventSize = epoll_wait(epoll, events, POLL_SIZE, 10000);
if (eventSize == -1) {
reportError("Cannot wait epoll event");
return -4;
}
for (int i = 0; i < eventSize; i++) {
const auto event = events[i];
uint8_t buffer[1024] = {};
const auto sizeOfRead = read(event.data.fd, buffer, 1024);
if (sizeOfRead == -1) {
reportError("Cannot read file on epoll event.");
return -5;
}
std::cout << "Read file size is: " << std::to_string(sizeOfRead) << std::endl;
}
std::cout << "Pending..." << std::endl;
}
return 0;
}
ئەگەر مەن File descriptor ئورنىغا Standard input نىڭ File descriptor سىنى ئالماشتۇرۇپ سىنىسام ياكى tcp socket, udp socket لارنىڭكىنى ئىشلەتسەم سىناق پروگرامما نۇرمال ئىشلىدى، ئەمما open, fopen بىلەن قۇرۇلغان File descriptor نى ئىشلەتكىلى بولمىدى
قايتقان خاتالىق: Operation not permitted.
بىر نەچچە سائەتلىك تەتقىقاتتىن كىيىن بىر قىسىم ئىرىشكەن يەكۈنلەر:
Linux دا "epoll, select, poll" قاتارلىقلار بىلەن ئادەتتىكى ھۆججەت سىستېمىسىنى بىماسقەدەملىك ھالەتتە بىرلەشتۈرۈپ ئىشلىتىشكە بولمايدۇ،
بۇ دىگەنلىك Linux مەشغۇلات سىستېمىسى بىزگە "poll, epoll, select" قاتارلىقلار ئارقىلىق بىماس قەدەملىك ھۆججەت سىستېمىسى زىيارەت ئىقتىدارىنى تەمىنلىمىگەن،
ئەمما لىكىن ۋە بىراق:
Linux aio بىلەن ھۆججەت سىستېمىسىغا بىماس قەدەملىك مەشغۇلات قىلىشقا بولىدىكەن، ھەمدە بۇ Linux kernel تەرىپىدىن قوللاشقا ئىرىشكەنكەن، قىززىقىدىغانلار: https://oxnz.github.io/2016/10/13/linux-aio/
يۇقارقى يەكۈن توردىكى بىر قانچە ئىشەنچىلىك مەنبەلەر ئارقىلىق دەلىللەندى.
پايدىلىنغان مەنبەلەر: