導航:首頁 > 網路營銷 > linuxsem清零

linuxsem清零

發布時間:2020-12-18 20:24:20

1、linux內核 進程如何銷毀

要了解進程的終止,你必須先了解進程結構體task_struct,期中有一些與進程終止相關的非常重要的域,task_struct在內核源代碼的linux/sched.h中定義。

進程終止有多種方式,無論何種方式,都會調用內核函數sys_exit()函數,而最終調用do_exit()函數(在kernel/exit.c中定義)在do_exit()函數中首先會做一些檢測,包括確保要終止的進程ID不是0或者1,再保證該進程不是處在中斷處理程序之中,之後將要終止進程的task_struct結構體中的flag域設置為PF_EXITING表示該進程已經結束,然後就是比較正式的銷毀過程,釋放進程佔用的資源。比如釋放其佔用的的分配內存(exit_mm()),釋放進程間通信的信號量(exit_sem()),釋放進程創建或者打開的文件描述符(exit_files()),釋放文件系統數據(exit_fs()),釋放線程(exit_thread())等等,最後向其父進程發送SIGCHILD信號,將進程狀態設置為終止,調用schele(),將CPU控制權交給其他進程。
這是大概的銷毀過程的,更詳細的過程請參考linux kernel primer這本書以及linux內核源代碼。

2、linux 怎麼查 信號量 被進程p住

sem_init:初始化信號量sem_t,初始化的時候可以指定信號量的初始值,以及是否可以在多進程間共享。
sem_wait:一直阻塞等待直到信號量>0。
sem_timedwait:阻塞等待若干時間直到信號量>0。
sem_post:使信號量加1。
sem_destroy:釋放信號量。和sem_init對應。 答案補充 關於各函數的具體參數請用man查看,如man sem_init可查看該函數的幫助

信號量的工作原理
由於信號量只能進行兩種操作等待和發送信號,即P(sv)和V(sv),他們的行為是這樣的:
P(sv):如果sv的值大於零,就給它減1;如果它的值為零,就掛起該進程的執行
V(sv):如果有其他進程因等待sv而被掛起,就讓它恢復運行,如果沒有進程因等待sv而掛起,就給它加1.

舉個例子,就是兩個進程共享信號量sv,一旦其中一個進程執行了P(sv)操作,它將得到信號量,並可以進入臨界區,使sv減1。而第二個進程將被阻止進入臨界區,因為當它試圖執行P(sv)時,sv為0,它會被掛起以等待第一個進程離開臨界區域並執行V(sv)釋放信號量,這時第二個進程就可以恢復執行。

Linux的信號量機制
Linux提供了一組精心設計的信號量介面來對信號進行操作,它們不只是針對二進制信號量,下面將會對這些函數進行介紹,但請注意,這些函數都是用來對成組的信號量值進行操作的。它們聲明在頭文件sys/sem.h中。

3、linux/sem.h和sys/sem.h有什麼區別

你好。

不只是sem.h,很多頭文件都有/usr/include/linux和/usr/include/sys兩個版本。

我的印象是:linux目錄裡面的頭文件用於內核,

sys目錄裡面的頭文件用於應用程序或者glibc標准庫

如果我的回答沒能幫助您,請繼續追問。

4、linux 信號量操作函數

semget()
可以使用系統調用semget()創建一個新的信號量集,或者存取一個已經存在的信號量集:
系統調用:semget();
原型:intsemget(key_t key,int nsems,int semflg);
返回值:如果成功,則返回信號量集的IPC標識符。如果失敗,則返回-1:errno=EACCESS(沒有許可權)
EEXIST(信號量集已經存在,無法創建)
EIDRM(信號量集已經刪除)
ENOENT(信號量集不存在,同時沒有使用IPC_CREAT)
ENOMEM(沒有足夠的內存創建新的信號量集)
ENOSPC(超出限制)
系統調用semget()的第一個參數是關鍵字值(一般是由系統調用ftok()返回的)。系統內核將此值和系統中存在的其他的信號量集的關鍵字值進行比 較。打開和存取操作與參數semflg中的內容相關。IPC_CREAT如果信號量集在系統內核中不存在,則創建信號量集。IPC_EXCL當和 IPC_CREAT一同使用時,如果信號量集已經存在,則調用失敗。如果單獨使用IPC_CREAT,則semget()要麼返回新創建的信號量集的標識 符,要麼返回系統中已經存在的同樣的關鍵字值的信號量的標識符。如果IPC_EXCL和IPC_CREAT一同使用,則要麼返回新創建的信號量集的標識 符,要麼返回-1。IPC_EXCL單獨使用沒有意義。參數nsems指出了一個新的信號量集中應該創建的信號量的個數。信號量集中最多的信號量的個數是 在linux/sem.h中定義的:
#defineSEMMSL32/*<=512maxnumofsemaphoresperid*/
下面是一個打開和創建信號量集的程序:
intopen_semaphore_set(key_t keyval,int numsems)
{
intsid;
if(!numsems)
return(-1);
if((sid=semget(mykey,numsems,IPC_CREAT|0660))==-1)
{
return(-1);
}
return(sid);
}
};
==============================================================
semop()
系統調用:semop();
調用原型:int semop(int semid,struct sembuf*sops,unsign ednsops);
返回值:0,如果成功。-1,如果失敗:errno=E2BIG(nsops大於最大的ops數目)
EACCESS(許可權不夠)
EAGAIN(使用了IPC_NOWAIT,但操作不能繼續進行)
EFAULT(sops指向的地址無效)
EIDRM(信號量集已經刪除)
EINTR(當睡眠時接收到其他信號)
EINVAL(信號量集不存在,或者semid無效)
ENOMEM(使用了SEM_UNDO,但無足夠的內存創建所需的數據結構)
ERANGE(信號量值超出范圍)
第一個參數是關鍵字值。第二個參數是指向將要操作的數組的指針。第三個參數是數組中的操作的個數。參數sops指向由sembuf組成的數組。此數組是在linux/sem.h中定義的:
/*semop systemcall takes an array of these*/
structsembuf{
ushortsem_num;/*semaphore index in array*/
shortsem_op;/*semaphore operation*/
shortsem_flg;/*operation flags*/
sem_num將要處理的信號量的個數。
sem_op要執行的操作。
sem_flg操作標志。
如果sem_op是負數,那麼信號量將減去它的值。這和信號量控制的資源有關。如果沒有使用IPC_NOWAIT,那麼調用進程將進入睡眠狀態,直到信號 量控制的資源可以使用為止。如果sem_op是正數,則信號量加上它的值。這也就是進程釋放信號量控制的資源。最後,如果sem_op是0,那麼調用進程 將調用sleep(),直到信號量的值為0。這在一個進程等待完全空閑的資源時使用。

5、怎麼修改linux中sem的值

有3個方法
#在控制台上輸入

bash$ mysql -u root mysql

#用mysql客戶程序

mysql> UPDATE user SET

6、linux編程時的信號量問題。 我以前用過的信號量頭文件是<semaphore.h>,而現在又發現還有個<sys/sem.h>

信號量在進程是以有名信號量進行通信的,在線程是以無名信號進行通信的,因為線程linux還沒有實現進程間的通信,所以在sem_init的第二個參數要為0,而且在多線程間的同步是可以通過有名信號量也可通過無名信號,但是一般情況線程的同步是無名信號量,無名信號量使用簡單,而且sem_t存儲在進程空間中,有名信號量必須LINUX內核管理,由內核結構struct ipc_ids 存儲,是隨內核持續的,系統關閉,信號量則刪除,當然也可以顯示刪除,通過系統調用刪除,
消息隊列,信號量,內存共享,這幾個都是一樣的原理。,只不過信號量分為有名與無名

無名使用 <semaphore.h>,
有名信號量<sys/sem.h>
無名信號量不能用進程間通信,
//無名與有名的區別,有名需要KEY值與IPC標識
所以sem_init的第二個參數必須為0,,,,

7、Linux 中 vi /etc/sysctl.conf 如何編輯

1、vi編輯器可以通過i、o、a等命令直接進入編輯模式,然後就可以修改文件了,/vim的工作模式如下圖所示:

說明:

1)插入模式:i在游標前插入(默認游標為方塊),a則是在游標後插入,o為新起一行並進入插入模式。

2):wq是命令模式,直接保存並退出vi。

二、/etc/sysctl.conf是一個允許改變正在運行中的Linux系統的介面,它包含一些TCP/IP堆棧和虛擬內存系統的高級選項,修改內核參數永久生效。也就是說/proc/sys下內核文件與配置文件sysctl.conf中變數存在著對應關系。如果不懂的這個文件的編輯內容,可以參考個人的一個配置實例,如下圖所示:

說明:

   file-max:這個參數表示進程可以同時打開的最大句柄數,這個參數直接限制最大並發連接數。
    tcp_tw_reuse:這個參數設置為1,表示允許將TIME-WAIT狀態的socket重新用於新的TCP鏈接。這個對伺服器來說很有意義,因為伺服器上總會有大量TIME-WAIT狀態的連接。
    tcp_keepalive_time:這個參數表示當keepalive啟用時,TCP發送keepalive消息的頻度。默認是7200 seconds,意思是如果某個TCP連接在idle 2小時後,內核才發起probe。若將其設置得小一點,可以更快地清理無效的連接。
    tcp_fin_timeout:這個參數表示當伺服器主動關閉連接時,socket保持在FIN-WAIT-2狀態的最大時間。
    tcp_max_tw_buckets:這個參數表示操作系統允許TIME_WAIT套接字數量的最大值,如果超過這個數字,TIME_WAIT套接字將立刻被清除並列印警告信息。默認是i180000,過多TIME_WAIT套接字會使Web伺服器變慢。
    tcp_max_syn_backlog:這個參數表示TCP三次握手建立階段接受WYN請求隊列的最大長度,默認1024,將其設置大一些可以使出現Nginx繁忙來不及accept新連接的情況時,Linux不至於丟失客戶端發起的連接請求。
    ip_local_port_range:這個參數定義了在UDP和TCP連接中本地埠的取值范圍。
    net.ipv4.tcp_rmem:這個參數定義了TCP接受緩存(用於TCP接收滑動窗口)的最小值,默認值,最大值。
    net.ipv4.tcp_wmem:這個參數定義了TCP發送緩存(用於TCP發送滑動窗口)的最小值,默認值,最大值。
    netdev_max_backlog:當網卡接收數據包的速度大於內核處理的速度時,會有一個隊列保存這些數據包。這個參數表示該隊列的最大值。
    rmem_default:這個參數表示內核套接字接收緩存區默認的大小。
    wmem_default:這個參數表示內核套接字發送緩存區默認的大小。
    rmem_max:這個參數表示內核套接字接收緩存區默認的最大大小。
    wmem_max:這個參數表示內核套接字發送緩存區默認的最大大小。

8、linux信號量的問題

sem_init:初始化信號量sem_t,初始化的時候可以指定信號量的初始值,以及是否可以在多進程間共享。
sem_wait:一直阻塞等待直到信號量>0。
sem_timedwait:阻塞等待若干時間直到信號量>0。
sem_post:使信號量加1。
sem_destroy:釋放信號量。和sem_init對應。 答案補充 關於各函數的具體參數請用man查看,如man sem_init可查看該函數的幫助

9、linux下sem多大值會溢出sem

一、你是抄想問:sem隊列的最大深度嗎?

int semget(key_t key, int nsems, int semflg);

nsems must be greater than 0 and less than or equal to the maximum number of semaphores per semaphore set (SEMMSL).

#define SEMMSL  250 /* <= 8 000 max num of semaphores per id */


semget的最大隊列深度為250

二、你想問的是sem id的最大值

/* Maximum value the semaphore can have.  */

#define SEM_VALUE_MAX (2147483647)

10、急!LINUX下,GCC編譯,原程序包含<semaphore.h>頭文件,為什麼編譯時說sem_wait,sem_post等未定義的引用

編譯時加上參數:-lpthread

要看報錯的階段,是在編譯還是鏈接階段.
如果編譯時函數沒有找到,那是頭文件的問題,如果鏈接時未定義引用,那是c庫的問題.
如果你的頭文件都正常包含了,那可能你的c庫沒有使能semaphore的支持.

與linuxsem清零相關的知識