導航:首頁 > 網路營銷 > sem的信號

sem的信號

發布時間:2020-10-15 08:56:14

1、在ucos中創建一個信號量 比如ossemcreat(0)。ossemcreat(1)的區別

OSSemPost 和OSSemPend是成對出現的,在程序OSSemPost 尚未運行到的時候,在等待Sem的
OSSemPend是會把當前的任務掛起,直到另外一個任務的OSSemPost 運行完畢都得到Sem。但是可以通過改變OSSemCreate(x)裡面的值x改變這種局面,當x不為0時,OSSemPend會馬上得到Sem繼續運行當前任務至結束,並將x的數值減一,直到為0。為0後,只有等其他任務的OSSemPost了。

2、FTIR和SEM是什麼?

FTIR是指紅外光譜儀器的第三代傅立葉變換紅外吸收光譜儀(FTIR)。SEM是1965年發明的較現代的細胞生物學研究工具掃描電子顯微鏡。

3、信號量的使用,求助

信號量:一個整數;
大於或等於0時代表可供並發進程使用的資源實體數;
小於0時代表正在等待使用臨界區的進程數;
用於互斥的信號量初始值應大於0;
只能通過P、V原語操作而改變;
信號量元素組成:
1、表示信號量元素的值;
2、最後操作信號量元素的進程ID
3、等待信號量元素值+1的進程數;
4、等待信號量元素值為0的進程數;

二、主要函數

1.1 創建信號量
int semget(
key_t key, //標識信號量的關鍵字,有三種方法:1、使用IPC——PRIVATE讓系統產生,
// 2、挑選一個隨機數,3、使用ftok從文件路徑名中產生
int nSemes, //信號量集中元素個數
int flag //IPC_CREAT;IPC_EXCL 只有在信號量集不存在時創建
)
成功:返回信號量句柄
失敗:返回-1

1.2 使用ftok函數根據文件路徑名產生一個關鍵字
key_t ftok(const char *pathname,int proj_id);
路徑名稱必須有相應許可權

1.3 控制信號量
int semctl(
int semid, //信號量集的句柄
int semnum, //信號量集的元素數
int cmd, //命令
/*union senum arg */... //
)
成功:返回相應的值
失敗:返回-1

命令詳細說明:
cmd: IPC_RMID 刪除一個信號量
IPC_EXCL 只有在信號量集不存在時創建
IPC_SET 設置信號量的許可權
SETVAL 設置指定信號量的元素的值為 agc.val
GETVAL 獲得一個指定信號量的值
GETPID 獲得最後操縱此元素的最後進程ID
GETNCNT 獲得等待元素變為1的進程數
GETZCNT 獲得等待元素變為0的進程數

union senum 定義如下:
union senum{
int val;
struct semid_ds *buf;
unsigned short * array;
}agc;
其中 semid_ds 定義如下:
struct semid_ds{
struct ipc_pem sem_pem; //operation pemission struct
time_t sem_otime; //last semop()time
time_t sem_ctime; //last time changed by semctl()
struct sem *sembase; //ptr to first semaphore in array
struct sem_queue *sem_pending; //pending operations
struct sem_queue *sem_pending_last; //last pending operations
struct sem_undo *undo; //undo requests on this arrary
unsigned short int sem_nsems; //number of semaphores in set
};

1.4 對信號量 +1 或 -1 或測試是否為0
int semop(
int semid,
struct sembuf *sops, //指向元素操作數組
unsigned short nsops //數組中元素操作的個數
)

結構 sembuf 定義
sembuf{
short int sem_num; //semaphore number
short int sem_op; //semaphore operaion
short int sem_flg //operation flag
};

三、例子:
2.1 伺服器

#include <sys/sem.h>
#include <sys/ipc.h>

#define SEGSIZE 1024
#define READTIME 1
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
//生成信號量
int sem_creat(key_t key)
{
union semun sem;
int semid;
sem.val = 0;
semid = semget(key,1,IPC_CREAT|0666);
if (-1 == semid){
printf("create semaphore error\n");
exit(-1);
}
semctl(semid,0,SETVAL,sem);
return semid;
}
//刪除信號量
void del_sem(int semid)
{
union semun sem;
sem.val = 0;
semctl(semid,0,IPC_RMID,sem);
}

//p
int p(int semid)
{
struct sembuf sops={0,+1,IPC_NOWAIT};
return (semop(semid,&sops,1));
}
//v
int v(int semid)
{
struct sembuf sops={0,-1,IPC_NOWAIT};
return (semop(semid,&sops,1));
}
int main()
{
key_t key;
int shmid,semid;
char *shm;
char msg[7] = "-data-";
char i;
struct semid_ds buf;

key = ftok("/",0);
shmid = shmget(key,SEGSIZE,IPC_CREAT|0604);
if (-1 == shmid){
printf(" create shared memory error\n");
return -1;
}
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm){
printf(" attach shared memory error\n");
return -1;
}
semid = sem_creat(key);
for (i = 0;i <= 3;i++){
sleep(1);
p(semid);
sleep(READTIME);
msg[5] = '0' + i;
memcpy(shm,msg,sizeof(msg));
sleep(58);
v(semid);
}
shmdt(shm);
shmctl(shmid,IPC_RMID,&buf);
del_sem(semid);
return 0;
//gcc -o shm shm.c -g
}

2.2 客戶端

#include <sys/sem.h>
#include <time.h>
#include <sys/ipc.h>

#define SEGSIZE 1024
#define READTIME 1
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;

// 列印程序執行時間
void out_time(void)
{
static long start = 0;
time_t tm;
if (0 == start){
tm = time(NULL);
start = (long)tm;
printf(" now start ...\n");
}
printf(" second: %ld \n",(long)(time(NULL)) - start);
}

//創建信號量
int new_sem(key_t key)
{
union semun sem;
int semid;
sem.val = 0;
semid = semget(key,0,0);
if (-1 == semid){
printf("create semaphore error\n");
exit(-1);
}
return semid;
}

//等待信號量變成0
void wait_v(int semid)
{
struct sembuf sops={0,0,0};
semop(semid,&sops,1);
}

int main(void)
{
key_t key;
int shmid,semid;
char *shm;
char msg[100];
char i;

key = ftok("/",0);
shmid = shmget(key,SEGSIZE,0);

if(-1 == shmid){
printf(" create shared memory error\n");
return -1;
}
shm = (char *)shmat(shmid,0,0);
if (-1 == (int)shm){
printf(" attach shared memory error\n");
return -1;
}
semid = new_sem(key);
for (i = 0;i < 3;i ++){
sleep(2);
wait_v(semid);
printf("Message geted is: %s \n",shm + 1);
out_time();
}
shmdt(shm);
return 0;
// gcc -o shmc shmC.c -g
}

4、掃描電鏡sem主要探測的型號強弱與材料什麼物理量有關

1、二次電子探測器:材料元素原子序數越大,激發出的信號越少,信號強度越低,表現出電鏡圖像越暗
2、背散射電子探測器:材料元素原子序數越大,激發出的信號強度越高,表現出電鏡圖像越亮
3、能譜儀:材料不同元素激發出特徵X射線,收集時間越長,累積的強度越大

5、怎麼修改linux中sem的值

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

bash$ mysql -u root mysql

#用mysql客戶程序

mysql> UPDATE user SET

6、SEM如何利用二次電子成像

從書上查了一些內容,書的年代比較久遠,可能買不到...有興趣的話,嘗試著去圖書館借一下吧。
SEM工作時,電子槍發射的入射電子束打在試樣表面上,向內部穿透一定的深度,由於彈性和非彈性散射形成一個呈梨狀的電子作用體積。電子與試樣作用產生的物理信息,均由體積內產生。
二次電子是入射電子在試樣內部穿透和散射過程中,將原子的電子轟擊出原子系統而射出試樣表面的電子,其中大部分屬於價子激發,所以能量很小,一般小於50eV。因此二次電子探測體積較小。二次電子發射區的直徑僅比束斑直徑稍大一些,因而可獲得較高的解析度。
二次電子像的襯度取決於試樣上某一點發射出來的二次電子數量。電子發射區越接近表面,發射出的二次電子就越多,這與入射電子束與試樣表面法線的夾角有關。試樣的棱邊、尖峰等處產生的二次電子較多,相應的二次電子像較亮;而平台、凹坑處射出的二次電子較少,相應的二次電子像較暗。根據二次電子像的明暗襯度,即可知道試樣表面凹凸不平的狀況,二次電子像是試樣表面的形貌放大像。
SEM內在試樣的斜上方放置有探測器來接受這些電子。接受二次電子的裝置簡稱為檢測器,它是由聚焦極、加速極、閃爍體、光導管和光電倍增管組成。在閃爍體前面裝一筒裝電極,稱為聚焦極,又稱收集極。在其前端加一柵網,在聚焦極上加250-300V的正電壓。二次電子被此電壓吸引,然後又被帶有10kV正電壓的加速極加速,穿過網眼打在加速極的閃爍體上,產生光信號,經光導管輸送到光電倍增管,光信號轉變為電子信號。最後輸送到顯示系統,顯示出二次電子像。

7、計算機*作系統中,若P、V*作的信號量S初值為2,當前值為-1,則表示有____個等待進程

有1個等待進程。

信號量(Semaphore),是可以用來保證兩個或多個關鍵代碼段不被並發調用。在進入一個關鍵代碼段之前,線程必須獲取一個信號量;一旦該關鍵代碼段完成了,那麼該線程必須釋放信號量。其它想進入該關鍵代碼段的線程必須等待直到第一個線程釋放信號量。

為了完成這個過程,需要創建一個信號量VI,然後將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個關鍵代碼段的首末端。初值為2,表示初始時有兩個可用的資源。現在為-1,就說明這兩個可用資源已經被佔用了,有一個進程還在等待資源。

(7)sem的信號擴展資料:

對信號量有4種操作(#include<semaphore.h>):

1、 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);

2、等信號(wait),也可叫做掛起(suspend)int sem_wait(sem_t *sem);

3、給信號(signal)或發信號(post) int sem_post(sem_t *sem);

4、清理(destroy) int sem_destory(sem_t *sem)。

與sem的信號相關的知識