epollソース解析

4263 ワード

asmlinkage long sys_epoll_create(int size)
機能概要:
1、sys_を実行していますepoll_createの前に初期化作業があります.ファイルシステム「eventpollfs」にかけて、そしてcreateはこのファイルシステムの下でユーザーにfdを割り当てます.
この関数は、対応するデータ構造、file、inode、およびfdを割り当てる.
2、eventpoll構造を開発し、fdに対応するfile-prvate_dataはそれを指します
eventpoll構造体定義:
struct eventpoll {
	/* Protect the this structure access */
	rwlock_t lock;

	/*
	 * This semaphore is used to ensure that files are not removed
	 * while epoll is using them. This is read-held during the event
	 * collection loop and it is write-held during the file cleanup
	 * path, the epoll file exit code and the ctl operations.
	 */
	struct rw_semaphore sem;

	/* Wait queue used by sys_epoll_wait() */
	wait_queue_head_t wq;

	/* Wait queue used by file->poll() */
	wait_queue_head_t poll_wait;

	/* List of ready file descriptors */
	struct list_head rdllist;

	/* RB-Tree root used to store monitored fd structs */
	struct rb_root rbr;
};
この構造には、準備完了fdに対応するepiteチェーンがあり、この構造の待ち行列(epoll_uwaitを呼び出すすべてのプロセスの待ち行列)は、すべてのfdに対応するepiteに対応する接続の赤黒いツリーのルートに使用されます.
asmlinkage long sys_epoll_ctl機能概要:
1、ep fdに基づいて作成時のeventpoll構造を取得し、この構造の中で、このfdに対応するノードが存在するかどうかを調べ、また挿入動作があるかを直接返します.そうでなければ、opに基づいて該当する関数を選択し、ADDであれば、ep_を呼び出します.insert()
2、もちろんユーザー空間からの送信イベントをカーネルにコピーすることもあります.
static int ep_insert(struct eventpoll*ep、struct epoll-uevent*イベント、 struct file*tfile,int fd)
機能概要:
1、epitem構造を申請し、fdによって、eventsはepitemを組み立てて、赤と黒の木の中に挿入する.
struct epitem {
	/* RB-Tree node used to link this structure to the eventpoll rb-tree */
	struct rb_node rbn;

	/* List header used to link this structure to the eventpoll ready list */
	struct list_head rdllink;

	/* The file descriptor information this item refers to */
	struct epoll_filefd ffd;

	/* Number of active wait queue attached to poll operations */
	int nwait;

	/* List containing poll wait queues */
	struct list_head pwqlist;

	/* The "container" of this item */
	struct eventpoll *ep;

	/* The structure that describe the interested events and the source fd */
	struct epoll_event event;

	/*
	 * Used to keep track of the usage count of the structure. This avoids
	 * that the structure will desappear from underneath our processing.
	 */
	atomic_t usecnt;

	/* List header used to link this item to the "struct file" items list */
	struct list_head fllink;

	/* List header used to link the item to the transfer list */
	struct list_head txlink;

	/*
	 * This is used during the collection/transfer of events to userspace
	 * to pin items empty events set.
	 */
	unsigned int revents;
};
2、一つのステップを開くpqueueのようなキューノードは、関数ポインタがep_を指す.ptable_queue.proc
struct ep_pqueue {
	poll_table pt;
	struct epitem *epi;
};
3、ファイル記述子のpollメソッドを呼び出します.ここで初めてこのプロセスをファイル記述子の待ち行列に加えるだけです.
static void ep_ptable_queue.proc(struct file*file、wait uqueue aut*whead、pollable*pt)
機能概要:
一つのステップを申請するpentry構造体:
struct eppoll_entry {
	/* List header used to link this structure to the "struct epitem" */
	struct list_head llink;

	/* The "base" pointer is set to the container "struct epitem" */
	void *base;

	/*
	 * Wait queue item that will be linked to the target file wait
	 * queue head.
	 */
	wait_queue_t wait;

	/* The wait queue head that linked the "wait" wait queue item */
	wait_queue_head_t *whead;
};
1、ここでベースをepiteに向け、waitの中の起動関数をep_に設定します.poll_calback、taskは本プロセスのPCBに設定され、wheadはこのファイルの待ち行列の先頭に設定され、waitは現在のプロセスをwheadでファイルに入れるなどのこの列に設定されています.ここで列に参加してから再度加入を呼び出す必要はなく、以降はepoll_を通じて(通って)waitで待てばいいです
2、どのファイルのイベントが到着したらep_を呼び出しますか?poll_calback関数は、準備されたepitemをeventpollのレディキューに追加する機能です.
asmlinkage long sys_epoll_wait(int epfd、struct epoll-uevents、    int maxevents、int timeout)機能概要:
1、スキャンしたrdlist列の中に空きがあるかどうか、空き時間のために睡眠して、該当するepitemの中からfileがpollメソッドを呼び出してマスクを得てreventtsにコピーして、そしてreventsをユーザー空間eventsにコピーして、eventsは一つのepoll_です.イベント構造体配列ポインタは、イベントが発生するすべてのfdを、対応するイベントを保存します.
2、epitemをrdlistからtxlinkを介して1つのtxlistにリンクし、伝送リンクのそれぞれのepitemがEPOLEDモードかどうか、ETモードではなくepitemをrdlistに戻す.そうでなければチェーンから削除する.
利点:
1、最大のファイル記述子の制限はありません.
2、初めてだけユーザ空間からコピーを行い、後から呼び出してコピーを繰り返す必要がなく、結果もイベントが発生したfdだけを返します.他は戻りません.効率を高めました.
3、このプロセスはファイルの待ち行列に一回だけ追加されます.