真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux異步命令 linux異步編程

linux系統(tǒng)c語言進程不想被sleep阻塞等待怎么解決?

1、啟動后臺子任務(wù),在執(zhí)行命令后加操作符,表示將命令放在子shell中異步執(zhí)行??梢赃_(dá)到多線程效果。如下,sleep10#等待10秒,再繼續(xù)下一操作sleep10當(dāng)前shell不等待,后臺子shell等待。

在應(yīng)縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站制作,應(yīng)縣網(wǎng)站建設(shè)費用合理。

2、wait命令wait是用來阻塞當(dāng)前進程的執(zhí)行,直至指定的子進程執(zhí)行結(jié)束后,才繼續(xù)執(zhí)行。使用wait可以在bash腳本“多進程”執(zhí)行模式下,起到一些特殊控制的作用。

如何查看linux是否開啟異步IO

查看linux是否開啟異步IO命令如下:

[DATA@localhost ~]$ cat /proc/slabinfo | grep kio

kioctx 37 140 384 10 1 : tunables 54 27 8 : slabdata 14 14 0

kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0

返回結(jié)果中kiocp對應(yīng)的前兩項為0,說明系統(tǒng)中沒有使用異步io。

linux異步通知之驅(qū)動層怎么釋放SIGUSR1/SIGUSR2

首先,Linux中的信號可以通過kill -l命令獲取,

如上圖所示,編號為1 ~ 31的信號為傳統(tǒng)UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是后來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區(qū)別在于前者不支持排隊,可能會造成信號丟失,而后者不會。

其次,SIGUSR1 ,這是留給用戶使用的信號。一般在編程中使用。舉例說明:sigqueue向本進程發(fā)送數(shù)據(jù)的信號,C語言代碼如下 :

#include stdio.h

#include string.h

#include stdlib.h

#include signal.h

#include unistd.h

void myhandler(int signo,siginfo_t *si,void *ucontext);

int main(){

union sigval val;//定義一個攜帶數(shù)據(jù)的共用體

struct sigaction oldact,act;

act.sa_sigaction=myhandler;

act.sa_flags=SA_SIGINFO;//表示使用sa_sigaction指示的函數(shù),處理完恢復(fù)默認(rèn),不阻塞處理過程中到達(dá)下在被處理的信號

//注冊信號處理函數(shù)

sigaction(SIGUSR1,act,oldact);

char data[100];

int num=0;

while(num10){

sleep(2);

printf("等待SIGUSR1信號的到來\n");

sprintf(data,"%d",num++);

val.sival_ptr=data;

sigqueue(getpid(),SIGUSR1,val);//向本進程發(fā)送一個信號

}

}

void myhandler(int signo,siginfo_t *si,void *ucontext){

printf("已經(jīng)收到SIGUSR1信號\n");

printf("%s\n",(char*)(si-si_ptr));

}

如何在Linux中使用flock控制程序的異步執(zhí)行

# ... 后面的工作

這樣雖然可以確保工作同時進行完畢,但是就是很慢…

另一種可能的方法是:

# 前面的工作

update_pkg_on_machine_1

update_pkg_on_machine_2

update_pkg_on_machine_3

sleep 10

# ... 后面的工作

這樣子雖然可以同時進行工作,但是如果10秒內(nèi)工作還沒完成,接下來的工作可能就會出錯了。

而工作要在多少秒之內(nèi)做完,其實是很難掌握的。

利用 flock 來管理工作狀態(tài)

我過去在自修作業(yè)系統(tǒng)的時候,有學(xué)到mutex這個東西,而 flock 就是可以在shell上使用的mutex。

linux中block IO,no-block IO,異步IO,IO多路復(fù)用筆記

? 現(xiàn)在操作系統(tǒng)都是采用虛擬存儲器,那么對32位操作系統(tǒng)而言,它的尋址空間(虛擬存儲空間)為4G(2的32次方)。操作系統(tǒng)的核心是內(nèi)核,獨立于普通的應(yīng)用程序,可以訪問受保護的內(nèi)存空間,也有訪問底層硬件設(shè)備的所有權(quán)限。 為了保證用戶進程不能直接操作內(nèi)核(kernel),保證內(nèi)核的安全,操心系統(tǒng)將虛擬空間劃分為兩部分,一部分為內(nèi)核空間,一部分為用戶空間 。針對linux操作系統(tǒng)而言, 將最高的1G字節(jié)(從虛擬地址0xC0000000到0xFFFFFFFF) ,供內(nèi)核使用,稱為內(nèi)核空間, 而將較低的3G字節(jié)(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱為用戶空間。

? ? 文件描述符(File descriptor)是計算機科學(xué)中的一個術(shù)語,是一個用于表述 指向文件的引用的抽象化概念 。文件描述符在形式上是一個非負(fù)整數(shù)。 實際上,它是一個索引值,指向內(nèi)核為每一個進程所維護的該進程打開文件的記錄表 。當(dāng)程序打開一個現(xiàn)有文件或者創(chuàng)建一個新文件時,內(nèi)核向進程返回一個文件描述符。在程序設(shè)計中,一些涉及底層的程序編寫往往會圍繞著文件描述符展開。但是文件描述符這一概念往往只適用于UNIX、Linux這樣的操作系統(tǒng)。

? ?剛才說了,對于一次IO訪問(以read舉例),數(shù)據(jù)會先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中,然后才會從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間。所以說,當(dāng)一個read操作發(fā)生時,它會經(jīng)歷兩個階段:

1、等待數(shù)據(jù)準(zhǔn)備 (Waiting for the data to be ready)

2、將數(shù)據(jù)從內(nèi)核拷貝到進程中 (Copying the data from the kernel to the process)

正式因為這兩個階段,linux系統(tǒng)產(chǎn)生了下面 五種網(wǎng)絡(luò)模式 的方案。

阻塞 I/O(blocking IO)

非阻塞 I/O(nonblocking IO)

I/O 多路復(fù)用( IO multiplexing)

異步 I/O(asynchronous IO)

信號驅(qū)動 I/O( signal driven IO)

注:由于signal driven IO在實際中并不常用,所以我這只提及剩下的四種IO Model。

阻塞 I/O(blocking IO)

在linux中,默認(rèn)情況下所有的socket都是blocking,一個典型的讀操作流程大概是這樣:

? 當(dāng)用戶進程調(diào)用了recvfrom這個系統(tǒng)調(diào)用,kernel就開始了IO的第一個階段:準(zhǔn)備數(shù)據(jù)(對于網(wǎng)絡(luò)IO來說,很多時候數(shù)據(jù)在一開始還沒有到達(dá)。比如,還沒有收到一個完整的UDP包。這個時候kernel就要等待足夠的數(shù)據(jù)到來)。這個過程需要等待,也就是說數(shù)據(jù)被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中是需要一個過程的。而在用戶進程這邊,整個進程會被阻塞(當(dāng)然,是進程自己選擇的阻塞)。當(dāng)kernel一直等到數(shù)據(jù)準(zhǔn)備好了,它就會將數(shù)據(jù)從kernel中拷貝到用戶內(nèi)存,然后kernel返回結(jié)果,用戶進程才解除block的狀態(tài),重新運行起來。

所以,blocking IO的特點就是在IO執(zhí)行的兩個階段都被block了(內(nèi)核阻塞讀取數(shù)據(jù),內(nèi)核將數(shù)據(jù)復(fù)制到應(yīng)用戶態(tài))。

非阻塞 I/O(nonblocking IO)

linux下,可以通過設(shè)置socket使其變?yōu)閚on-blocking。當(dāng)對一個non-blocking socket執(zhí)行讀操作時,流程是這個樣子:

?當(dāng)用戶進程發(fā)出read操作時,如果kernel中的數(shù)據(jù)還沒有準(zhǔn)備好,那么它并不會block用戶進程,而是立刻返回一個error。從用戶進程角度講 ,它發(fā)起一個read操作后,并不需要等待,而是馬上就得到了一個結(jié)果。用戶進程判斷結(jié)果是一個error時,它就知道數(shù)據(jù)還沒有準(zhǔn)備好,于是它可以再次發(fā)送read操作。一旦kernel中的數(shù)據(jù)準(zhǔn)備好了,并且又再次收到了用戶進程的system call,那么它馬上就將數(shù)據(jù)拷貝到了用戶內(nèi)存,然后返回。

所以,nonblocking IO的特點是用戶進程需要 不斷的主動詢問 kernel數(shù)據(jù)好了沒有( 內(nèi)核讀取數(shù)據(jù)時,用戶態(tài)不需要阻塞,內(nèi)核將數(shù)據(jù)復(fù)制到用戶態(tài)時,需要阻塞 )。

I/O 多路復(fù)用( IO multiplexing)

? ? ?IO multiplexing就是我們說的select,poll,epoll,有些地方也稱這種IO方式為event driven IO。select/epoll的好處就在于單個process就可以同時處理多個網(wǎng)絡(luò)連接的IO。它的基本原理就是 select,poll,epoll這個function會不斷的輪詢所負(fù)責(zé)的所有socket ,當(dāng)某個socket有數(shù)據(jù)到達(dá)了,就通知用戶進程。

? ? 當(dāng)用戶 進程調(diào)用了select , 那么整個進程會被block ,而同時,kernel會“監(jiān)視”所有 select負(fù)責(zé)的socket(一個管理多個socket連接),當(dāng)任何一個socket中的數(shù)據(jù)準(zhǔn)備好了,select就會返回 。這個時候用戶進程再調(diào)用read操作, 將數(shù)據(jù)從kernel拷貝到用戶進程 。

所以,I/O 多路復(fù)用的特點是通過一種機制一個進程能同時等待多個文件描述符,而這些文件描述符(套接字描述符)其中的任意一個進入讀就緒狀態(tài),select()函數(shù)就可以返回。

這個圖和blocking IO的圖其實并沒有太大的不同,事實上,還更差一些。 因為這里需要使用兩個system call (select 和 recvfrom),而blocking IO只調(diào)用了一個system call (recvfrom) 。但是,用select的優(yōu)勢在于它可以同時處理多個connection。

所以,如果處理的 連接數(shù)不是很高的話,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延遲還更大 。select/epoll的優(yōu)勢并不是對于單個連接能處理得更快,而是在于能處理更多的連接。)

在IO multiplexing Model中,實際中,對于每一個socket,一般都設(shè)置成為non-blocking,但是,如上圖所示,整個用戶的process其實是一直被block的。只不過process是被select這個函數(shù)block,而不是被socket IO給block。

總結(jié):IO多路復(fù)用其實也是阻塞的,阻塞的地方在用當(dāng)有socket連接有數(shù)據(jù)以后, 會阻塞知道數(shù)據(jù)從內(nèi)核復(fù)制到用戶態(tài)(第二步阻塞)。

異步 I/O(asynchronous IO)

inux下的asynchronous IO其實用得很少。先看一下它的流程:

? ? 用戶進程發(fā)起read操作之后,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當(dāng)它受到一個asynchronous read之后,首先它會立刻返回,所以不會對用戶進程產(chǎn)生任何block。然后,kernel會等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶內(nèi)存,當(dāng)這一切都完成之后,kernel會給用戶進程發(fā)送一個signal,告訴它read操作完成了。

總結(jié):兩個階段都不需要用戶進程干涉,內(nèi)核將數(shù)據(jù)準(zhǔn)備好以后通知用戶態(tài)去讀取

總結(jié)

blocking和non-blocking的區(qū)別

調(diào)用blocking IO會一直block住對應(yīng)的進程直到操作完成,而non-blocking IO在kernel還準(zhǔn)備數(shù)據(jù)的情況下會立刻返回。

synchronous IO和asynchronous IO的區(qū)別

在說明synchronous IO和asynchronous IO的區(qū)別之前,需要先給出兩者的定義。POSIX的定義是這樣子的:

- A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;

- An asynchronous I/O operation does not cause the requesting process to be blocked;

兩者的區(qū)別就在于synchronous IO做”IO operation”的時候會將process阻塞。按照這個定義,之前所述的 blocking IO,non-blocking IO,IO multiplexing都屬于synchronous IO 。

? ?有人會說,non-blocking IO并沒有被block啊。這里有個非?!敖苹钡牡胤?,定義中所指的”IO operation”是指真實的IO操作,就是例子中的recvfrom這個system call。non-blocking IO在執(zhí)行recvfrom這個system call的時候,如果kernel的數(shù)據(jù)沒有準(zhǔn)備好,這時候不會block進程。但是, 當(dāng)kernel中數(shù)據(jù)準(zhǔn)備好的時候,recvfrom會將數(shù)據(jù)從kernel拷貝到用戶內(nèi)存中,這個時候進程是被block了,在這段時間內(nèi),進程是被block的。

而asynchronous IO則不一樣,當(dāng)進程發(fā)起IO 操作之后,就直接返回再也不理睬了,直到kernel發(fā)送一個信號,告訴進程說IO完成。在這整個過程中,進程完全沒有被block。


分享名稱:Linux異步命令 linux異步編程
文章URL:http://weahome.cn/article/hhjdoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部