高級IO--1 ---(五種典型IO,阻塞IO,非阻塞IO,信號驅動IO,異步IO, IO多路轉接)

高級IO:

五種典型IO:

阻塞IO/非阻塞IO/信號驅動IO/異步IO/IO多路轉接
IO多路轉接模型:select/poll/epoll

五種典型IO

阻塞IO

IO操作的流程:等待IO操作條件具備,然后進行數據拷貝
為了完成IO操作發起調用,若當前不具備IO操作條件,則等待,直到條件具備,完成IO操作后調用返回
在這里插入圖片描述
釣魚的時候,手里一直握著魚竿,等待?上鉤。

非阻塞IO

為了完成IO操作發起調用,若當前不具備IO操作條件,則立即報錯返回;可以干點其他的事情,循環過來進行判斷
在這里插入圖片描述
把魚竿放下去,去做其他事情,隔一段時間過來看一次,缺點:回來時?跑了。所以出現信號驅動IO
非阻塞IO往往需要程序員循環的方式反復嘗試讀寫文件描述符, 這個過程稱為輪詢. 這對CPU來說是較大的浪費, 一 般只有特定場景下才使用.

信號驅動IO

提前對IO信號自定義處理方式,當IO條件具備時,操作系統通過信號通知進程,這時候IO條件已經具備,直接發起調用進行數據拷貝
在這里插入圖片描述
釣魚的時候,拋出魚竿,在魚竿上綁上一個鈴鐺,如果?咬鉤了,就能及時知道了

異步IO

IO操作條件的等待與數據拷貝都由操作系統來進行等待與操作,等到IO操作完成后,通過信號通知進程,進程直接對數據進行操作
在這里插入圖片描述
釣魚的時候,拋出魚竿,找個人幫你釣魚,調到?了,叫一下你

總結

IO幾種操作中,IO操作效率越來越高,但是流程控制越來越復雜

高級IO重要概念

阻塞與非阻塞

  • 阻塞:當前不具備操作條件時,調用掛起等待,直到條件具備,完成操作后調用返回
  • 非阻塞:當前不具備操作條件,調用直接報錯返回
  • 阻塞與非阻塞:關注的并不是操作是否完成,而是調用是否立即返回

同步通信 vs 異步通信

同步:當前不具備操作條件時,調用掛起等待,直到條件具備,完成操作后調用返回
異步:發起操作的調用,這個操作并不由自己完成,由別人完成
同步與異步:關注的是操作是否由自己完成
同步通常是阻塞的;但是異步有阻塞也有非阻塞

  • 異步阻塞:發起調用完成功能,功能由操作系統完成,但是進程自身一直等待操作系統完成完成,完成之后返回

  • 異步非阻塞:發起調用完成功能,功能由操作系統完成,進程自身立即返回

  • 所謂同步,就是在發出一個調用時,在沒有得到結果之前,該調用就不返回. 但是一旦調用返回,就得 到返回值了; 換句話說,就是由調用者主動等待這個調用的結果;

  • 異步則是相反,調用在發出之后,這個調用就直接返回了,所以沒有返回結果; 換句話說,當一個異步 過程調用發出后,調用者不會立刻得到結果; 而是在調用發出后,被調用者通過狀態、通知來通知調用 者,或通過回調函數處理這個調用.

同步和異步關注的是消息通信機制.

了解Linux下的AIO—異步IO

https://blog.csdn.net/brucexu1978/article/details/7085924

IO多路轉接/IO多路復用

對大量描述符進行事件監控(可讀事件/可寫事件/異常事件)監控
在這里插入圖片描述

作用
  • 前邊基本的tcp服務器只能與一個客戶端通信一次
  • 因為服務器端不知道新的客戶端連接請求以及客戶端數據什么時候到來,因此程序流程只能寫死,導致程序會卡死在accept/recv這里
  • 假設服務端若是知道什么時候新的客戶端連接起來,這時候再調用accept;程序流程就不會卡再accept這里,假若服務端知道什么時候客戶端的數據到來,然后再進行recv,程序流程就不會卡在recv這里
  • 這時候服務端就可以實現并發操作,誰有數據到來就操作誰,否則不進行操作
IO多路轉接

替進程監控大量描述符什么時候有什么事件,進而進程可以針對發生了相應事件的描述符進行相應操作;

IO多路轉接模型
  • select
  • poll
  • epoll

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383183.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383183.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383183.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IO多路轉接模型----(select的模型,select的優缺點,poll的模型,poll的優缺點)

IO多路轉接模型:select/poll/epoll 對大量描述符進行事件監控(可讀/可寫/異常) select模型 用戶定義描述符的事件監控集合 fd_set(這是一個位圖,用于存儲要監控的描述符); 用戶將需要監控的描述符添加到集合中,這個描…

IO多路轉接模型-----epoll

epoll: Linux下性能最高的多路轉接模型 epoll 有3個相關的系統調用. epoll_create 功能:創建epoll,在內核中創建eventpoll結構體,size決定了epoll最多監控多少個描述符,在Linux2.6.8之后被忽略,但是必須…

再寫順序表(c語言實現,外加冒泡排序,二分查找)

概念 順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情況下采用數組存儲。在數組 上完成數據的增刪查改。 順序表一般可以分為: 靜態順序表:使用定長數組存儲。動態順序表:使用動態開辟的數組存儲。 頭…

再寫單鏈表(不帶頭單鏈表)

單鏈表 實際中鏈表的結構非常多樣,以下情況組合起來就有8種鏈表結構: 單向、雙向帶頭、不帶頭循環、非循環 雖然有這么多的鏈表的結構,但是我們實際中最常用還是兩種結構: 無頭單向非循環鏈表:結構簡單&#xff0…

再寫雙向循環鏈表

#pragma once #include<assert.h> #include<malloc.h> #include<stdio.h> typedef int DLDataType;//定義鏈表結點結構 typedef struct DListNode{DLDataType value;struct DListNode *prev; //指向前一個結點struct DListNode *next; //指向后一個結點 } DL…

鏈表題目--1 刪除鏈表中所有等于val的值

注意事項 要刪除的結點相鄰第一個結點就是要刪除的結點 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val){if(headNULL){return NULL;}struct …

鏈表題目--2 求鏈表的中間結點 和 求鏈表中倒數第k個結點

求鏈表的中間結點 思路 一個走兩步&#xff0c;一個走一步。一個走到尾&#xff0c;另外一個就走到了中間 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head…

鏈表題目---3 合并兩個有序單鏈表 和 分割鏈表

合并兩個有序單鏈表 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){if(l1 NULL){return l2;}else if(l2 NULL){return l1;}struc…

鏈表題目---4 刪除鏈表中重復的結點 和 判斷鏈表是否為回文鏈表

刪除鏈表中重復的結點 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {} }; */ class Solution { public:ListNode* deleteDuplication(ListNode* pHead){if(pHead NULL){return NULL;}ListNode *prev NULL; //用于刪除的結點, 是…

鏈表題目----5 相交鏈表 和 環形鏈表 和 返回鏈表開始入環的第一個節點

相交鏈表 思路 鏈表交叉不可能是x型因為有可能兩個鏈表不等長&#xff0c;所以我們必須讓他們從同一起跑位置去起跑從同一起跑位置出發&#xff0c;依次比較每個結點的地址是否相同 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct L…

鏈表題目---6 復制帶隨機指針的鏈表

思路 將新結點放在老結點的后面 復制random 將鏈表拆開 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node() {}Node(int _val, Node* _next, Node* _random) {val _val;next _next;random _random;} }; */ class Solution { publi…

括號匹配問題(c和c++版本實現)

括號匹配問題 思路 遇見左括號入棧&#xff0c;遇見一個右括號彈出棧頂元素右括號入棧前如果棧已經為空&#xff0c;則不匹配如果不為空則讀取并彈出&#xff0c;彈出來的元素與右括號做比較&#xff0c;必須匹配&#xff0c;不匹配返回false;如果最后棧里還有元素&#xff0c…

用隊列實現棧 AND 用棧實現隊列

用隊列實現棧 思路 入隊列就是入棧出隊列的時候&#xff0c;就是把前面size-1個隊列中的元素先出&#xff0c;這樣最后一個元素就成隊首元素了&#xff0c;再把出去的元素再次入隊列讀棧頂元素&#xff0c;過程和第二步是一樣的&#xff0c;就是彈出后&#xff0c;再把它入隊列…

最小棧的實現(設計一個支持 push,pop,top 操作,并能在常數時間內檢索到最小元素的棧。)

最小棧的實現 思路 兩個棧&#xff0c;左邊棧接受元素&#xff0c;右邊棧存最小的元素入棧時&#xff0c;先入左邊棧&#xff0c;隨后進行比較&#xff0c;左邊和右邊棧頂元素進行比較&#xff0c;如果新元素小&#xff0c;就把新元素放在右邊的棧頂位置&#xff0c;如果新元素…

再寫循環隊列----c++實現

再寫循環隊列 class MyCircularQueue { public:/** Initialize your data structure here. Set the size of the queue to be k. */MyCircularQueue(int k) {array (int *)malloc(sizeof(int)*k);capacity k;size 0;front 0;rear 0;}/** Insert an element into the circu…

再談二叉樹(二叉樹概念,二叉樹的性質,二叉樹的存儲結構)

樹的概念 樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;而葉朝下的。它具有以下的特點&#xff1a;每個…

二叉樹題目----1 前序中序后序遍歷二叉樹并返回相應的遍歷(不是打印)

前序遍歷 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*/ int *array; int size;void _preorde…

二叉樹題目----2 檢查兩顆樹是否相同 和 對稱二叉樹的判定

檢查兩顆樹是否相同 思路 根要相等 p->val q->val左子樹相等 isSameTree(p->left,q->left)右子樹也要相等 isSameTree(p->right,q->right) /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* …

二叉樹題目---3 另一個樹的子樹 AND 二叉樹最大深度

另一個樹的子樹 思路 兩個數都遍歷一遍&#xff0c;找到一個根結點相同時&#xff0c;判斷以這個根結點為首的二叉樹是否相等 前序遍歷判斷兩棵樹是否相同對于返回值的處理是難點 bool isSameTree(struct TreeNode *p, struct TreeNode *q) {if(p NULL && q NULL)…

二叉樹題目----4 前序遍歷重構二叉樹 AND 求二叉樹中所有結點的個數

前序遍歷重構二叉樹 思路 整個二叉樹用數組存儲因為先序遍歷它先遍歷根&#xff0c;再遍歷左&#xff0c;左邊沒有跑完是不會去遍歷右邊的&#xff0c;所以遍歷左子樹&#xff0c;就是數組元素每回向后一個&#xff0c;個數-1遍歷右邊時&#xff0c;就是數組起始位置左子樹跑到…