c語言pv操作
1. 操作系統中P,V操作分別意味著要求什麼
pv操作的含義:pv操作由p操作原語和v操作原語組成(原語是不可中斷的過程),對信號量進行操作,具體定義如下:
p(s):①將信號量s的值減1,即s=s-1;
②如果s³0,則該進程繼續執行;否則該進程置為等待狀態,排入等待隊列。
v(s):①將信號量s的值加1,即s=s+1;
②如果s>0,則該進程繼續執行;否則釋放隊列中第一個等待信號量的進程。
pv操作的意義:我們用信號量及pv操作來實現進程的同步和互斥。pv操作屬於進程的低級通信。
什麼是信號量?信號量(semaphore)的數據結構為一個值和一個指針,指針指向等待該信號量的下一個進程。信號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量;當它的值小於0時,其絕對值表示等待使用該資源的進程個數。注意,信號量的值僅能由pv操作來改變。
一般來說,信號量s³0時,s表示可用資源的數量。執行一次p操作意味著請求分配一個單位資源,因此s的值減1;當s<0時,表示已經沒有可用資源,請求者必須等待別的進程釋放該類資源,它才能運行下去。而執行一個v操作意味著釋放一個單位資源,因此s的值加1;若s£0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀態的進程,使之運行下去。
2. 用c語言實現PV操作生產者消費者關系
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
typedef HANDLE Semaphore; // 信號量的Windows原型
#define P(S) WaitForSingleObject(S, INFINITE) // 定義Windows下的P操作
#define V(S) ReleaseSemaphore(S, 1, NULL) // 定義Windows下的V操作
#define rate 1000
#define CONSUMER_NUM 10 /* 消費者個數 */
#define PRODUCER_NUM 10 /* 生產者個數 */
#define BUFFER_NUM 4 /* 緩沖區個數 */
char *thing[10] = ;
struct Buffer
{
int proct[BUFFER_NUM]; // 緩沖區
int start, end; // 兩個指針
} g_buf;
Semaphore g_semBuffer, g_semProct, g_mutex;
// 消費者線程
DWORD WINAPI Consumer(LPVOID para)
{
// i表示第i個消費者
int i = *(int *)para;
int ptr; // 待消費的內容的指針
printf(" 豬頭-%03d: 豬頭我來啦!\n", i);
Sleep(300);
while (1)
{
printf(" 豬頭-%03d: 我要吃.........!\n", i);
// 等待產品
P(g_semProct);
// 有產品,先鎖住緩沖區 g_buf
P(g_mutex);
// 記錄消費的物品
ptr = g_buf.start;
// 再移動緩沖區指針
g_buf.start = (g_buf.start+1)%BUFFER_NUM;
// 讓其他消費者或生產者使用 g_buf
V(g_mutex);
printf(" 豬頭-%03d: 我吃 buf[%d] = %s\n", i, ptr, thing[g_buf.proct[ptr]]);
Sleep(rate*rand()%10+110);
// 消費完畢,並釋放一個緩沖
printf(" 豬頭-%03d: 我爽了! buf[%d] = %s\n", i, ptr, thing[g_buf.proct[ptr]]);
V(g_semBuffer);
}
return 0;
}
// 生產者線程
DWORD WINAPI Procer(LPVOID para)
{
int i = *(int *)para - CONSUMER_NUM;
int ptr;
int data; // 產品
printf("工作狂-%03d: 我來啦!\n", i);
Sleep(300);
while (1)
{
printf("工作狂-%03d: 我乾乾干…………\n", i);
Sleep(rate*rand()%10+110);
data = rand()%10;
printf("工作狂-%03d: 搞出一個東西 data = %s!\n", i, thing[data]);
// 等待存放空間
P(g_semBuffer);
// 有地方,先鎖住緩沖區 g_buf
P(g_mutex);
// 記錄消費的物品
ptr = g_buf.end;
// 再移動緩沖區指針
g_buf.end = (g_buf.end+1)%BUFFER_NUM;
// 讓其他消費者或生產者使用 g_buf
V(g_mutex);
printf("工作狂-%03d: 擱到 buf[%d] = %s\n", i, ptr, thing[data]);
g_buf.proct[ptr] = data;
Sleep(rate/2*rand()%10+110);
// 放好了完畢,釋放一個產品
printf("工作狂-%03d: buf[%d] = %s 放好了,大家吃!\n", i, ptr, thing[g_buf.proct[ptr]]);
V(g_semProct);
}
return 0;
}
int main(int argc, char *argv[])
{
// 線程技術,前面為消費者線程,後面為生產者線程
HANDLE hThread[CONSUMER_NUM+PRODUCER_NUM]; // 線程計數
//srand(time());
DWORD tid;
int i=0;
// 初始化信號量
g_mutex = CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, "mutexOfConsumerAndProcer");
g_semBuffer = CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, "BufferSemaphone");
g_semProct = CreateSemaphore(NULL, 0, BUFFER_NUM, "ProctSemaphone");
if ( !g_semBuffer || !g_semProct || !g_mutex)
{
printf("Create Semaphone Error!\n");
return -1;
}
int totalThreads = CONSUMER_NUM+PRODUCER_NUM;
// 開啟消費者線程
printf("先請豬頭們上席!\n");
for (i=0; i<CONSUMER_NUM; i++)
{
hThread[i] = CreateThread(NULL, 0, Consumer, &i, 0, &tid);
if ( hThread[i] ) WaitForSingleObject(hThread[i], 10);
}
printf("廚子們就位!\n");
for (; i<totalThreads; i++)
{
hThread[i] = CreateThread(NULL, 0, Procer, &i, 0, &tid);
if ( hThread[i] ) WaitForSingleObject(hThread[i], 10);
}
// 生產者和消費者的執行
WaitForMultipleObjects(totalThreads, hThread, TRUE, INFINITE);
return 0;
}
3. 用C語言編程實現P、V原語並用P、V原語哲學家就餐問題
這個是操作系統課的問題吧,我沒做過哲學家這個程序,不過我用c語言做過生產者與消費者,大概差不多,pv操作時用windows api函數完成的。
4. 用C語言實現--生產者與消費者的問題(PV操作)
這個問題蠻好的
我給你個程序
給我加分啊
#include
<windows.h>
#include
<stdio.h>
#include
<stdlib.h>
typedef
HANDLE
Semaphore;
//
信號量的Windows原型
#define
P(S)
WaitForSingleObject(S,
INFINITE)
//
定義Windows下的P操作
#define
V(S)
ReleaseSemaphore(S,
1,
NULL)
//
定義Windows下的V操作
#define
rate
1000
#define
CONSUMER_NUM
10
/*
消費者個數
*/
#define
PRODUCER_NUM
10
/*
生產者個數
*/
#define
BUFFER_NUM
4
/*
緩沖區個數
*/
char
*thing[10]
=
{"豬臉",
"牛鞭",
"羊腰",
"驢蹄",
"狼心",
"狗肺",
"猴肝",
"老虎屁股",
"大象肚",
"河馬大腸"};
struct
Buffer
{
int
proct[BUFFER_NUM];
//
緩沖區
int
start,
end;
//
兩個指針
}
g_buf;
Semaphore
g_semBuffer,
g_semProct,
g_mutex;
//
消費者線程
DWORD
WINAPI
Consumer(LPVOID
para)
{
//
i表示第i個消費者
int
i
=
*(int
*)para;
int
ptr;
//
待消費的內容的指針
printf("
豬頭-%03d:
豬頭我來啦!\n",
i);
Sleep(300);
while
(1)
{
printf("
豬頭-%03d:
我要吃.........!\n",
i);
//
等待產品
P(g_semProct);
//
有產品,先鎖住緩沖區
g_buf
P(g_mutex);
//
記錄消費的物品
ptr
=
g_buf.start;
//
再移動緩沖區指針
g_buf.start
=
(g_buf.start+1)%BUFFER_NUM;
//
讓其他消費者或生產者使用
g_buf
V(g_mutex);
printf("
豬頭-%03d:
我吃
buf[%d]
=
%s\n",
i,
ptr,
thing[g_buf.proct[ptr]]);
Sleep(rate*rand()%10+110);
//
消費完畢,並釋放一個緩沖
printf("
豬頭-%03d:
我爽了!
buf[%d]
=
%s\n",
i,
ptr,
thing[g_buf.proct[ptr]]);
V(g_semBuffer);
}
return
0;
}
//
生產者線程
DWORD
WINAPI
Procer(LPVOID
para)
{
int
i
=
*(int
*)para
-
CONSUMER_NUM;
int
ptr;
int
data;
//
產品
printf("工作狂-%03d:
我來啦!\n",
i);
Sleep(300);
while
(1)
{
printf("工作狂-%03d:
我乾乾干…………\n",
i);
Sleep(rate*rand()%10+110);
data
=
rand()%10;
printf("工作狂-%03d:
搞出一個東西
data
=
%s!\n",
i,
thing[data]);
//
等待存放空間
P(g_semBuffer);
//
有地方,先鎖住緩沖區
g_buf
P(g_mutex);
//
記錄消費的物品
ptr
=
g_buf.end;
//
再移動緩沖區指針
g_buf.end
=
(g_buf.end+1)%BUFFER_NUM;
//
讓其他消費者或生產者使用
g_buf
V(g_mutex);
printf("工作狂-%03d:
擱到
buf[%d]
=
%s\n",
i,
ptr,
thing[data]);
g_buf.proct[ptr]
=
data;
Sleep(rate/2*rand()%10+110);
//
放好了完畢,釋放一個產品
printf("工作狂-%03d:
buf[%d]
=
%s
放好了,大家吃!\n",
i,
ptr,
thing[g_buf.proct[ptr]]);
V(g_semProct);
}
return
0;
}
int
main(int
argc,
char
*argv[])
{
//
線程技術,前面為消費者線程,後面為生產者線程
HANDLE
hThread[CONSUMER_NUM+PRODUCER_NUM];
//
線程計數
//srand(time());
DWORD
tid;
int
i=0;
//
初始化信號量
g_mutex
=
CreateSemaphore(NULL,
BUFFER_NUM,
BUFFER_NUM,
"mutexOfConsumerAndProcer");
g_semBuffer
=
CreateSemaphore(NULL,
BUFFER_NUM,
BUFFER_NUM,
"BufferSemaphone");
g_semProct
=
CreateSemaphore(NULL,
0,
BUFFER_NUM,
"ProctSemaphone");
if
(
!g_semBuffer
||
!g_semProct
||
!g_mutex)
{
printf("Create
Semaphone
Error!\n");
return
-1;
}
int
totalThreads
=
CONSUMER_NUM+PRODUCER_NUM;
//
開啟消費者線程
printf("先請豬頭們上席!\n");
for
(i=0;
i<CONSUMER_NUM;
i++)
{
hThread[i]
=
CreateThread(NULL,
0,
Consumer,
&i,
0,
&tid);
if
(
hThread[i]
)
WaitForSingleObject(hThread[i],
10);
}
printf("廚子們就位!\n");
for
(;
i<totalThreads;
i++)
{
hThread[i]
=
CreateThread(NULL,
0,
Procer,
&i,
0,
&tid);
if
(
hThread[i]
)
WaitForSingleObject(hThread[i],
10);
}
//
生產者和消費者的執行
WaitForMultipleObjects(totalThreads,
hThread,
TRUE,
INFINITE);
return
0;
}
5. 自考操作系統pv操作可以用c語言實現嗎 書上的我沒學過,也不知道是...
很多課本用類pascal語言或者偽代碼。
描述的時候是可以用C語言的。
明確告訴你,用偽代碼描述就可以了。
PV操作的考試只考思想,不考具體實現。
跟語言完全無關。
6. 操作系統的pv操作是編程用的嗎百度了很多,請大佬們用通俗的話講一下,請不要復制粘貼,謝謝。
PV操作是信號量的一種,主要是用在生產者-消費者關系模型里,解決線程/進程並發和資源沖突的問題。在操作系統層面會提供相關的API用於信號量操作,如Windows C和Linux C下都有對應的信號量操作函數。某些編程語言如Java本身也提供信號量等並發機制,它也是依靠操作系統底層的這些API實現的。
7. c語言編寫操作系統中有關進程的PV操作代碼實現
電腦程序就是先執行什麼後執行什麼、畢竟是指令嘛、不像人我聽著歌還可以做事,所以說同時執行一個功能幾乎不行,除非你也可以調用、但是還是先執行什麼後執行什麼,相當於食堂吃飯排隊一樣的道理。windows下不是有很多dll文件嘛那就相當於橋梁做連接。
在c中有時間函數的time.h到計算就更簡單了、寫一個for循環、後面的條件為——。希望對你有幫助。