单缓冲与双缓冲

单缓冲

单缓冲即在发送进程与接收进程之间只有一个缓冲区,这是操作系统提供的最简单的一种缓冲形式,如图所示。

在这里插入图片描述
发送者向缓冲区发送数据后,接收者可从缓冲区中取出该数据。这种方法有一个明显的缺点,即发送者和接收者不能并行工作。因为缓冲区是临界资源,不能同时对它进行读/写。由于只有一个缓冲区,发送者只有等到接收者将数据取走后,才能再往缓冲区中送数据,否则会覆盖掉原有数据。而接收者也只有等发送者输入数据才能取走,否则会重复取出同一数据(假设缓冲区中事先已有数据)。如果发送者和接收者速度不匹配,将会浪费大量的等待时间,因此,单缓冲方式现在已经基本不采用

双缓冲

为了加快输入/输出速度,提高设备利用率,又引入双缓冲机制,也称为缓冲对换(Buffer Swapping)。

系统为用户进程设置两个缓冲区。以输入操作为例,输入设备先将数据输入第一个缓冲区,第一个缓冲区满后,转向第二个缓冲区。此时操作系统可以从第一个缓冲区中取出数据送到用户进程,对数据进行处理。采用双缓冲可以减少或消除用户进程的等待时间,提高系统效率。双缓冲的工作方式如图所示。

在这里插入图片描述
当发送进程和接收进程的速度相差很大时,双缓冲还是不能解决两者并行工作的问题。

例如,发送者(CPU)速度远远高于接收者(外设)速度,将两个缓冲区很快装满后,发送者就无事可做,直到接收者慢慢取空一个缓冲区后,发送者才能继续工作。反之,如果接收者(CPU)速度太快,很快将两个缓冲区取空后,只能守着两个空缓冲区等待发送者(外设)送来数据。因此,双缓冲在实际系统中采用得很少

总结

单缓冲与双缓冲用的都不多

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDI+是Windows操作系统中的一个图形处理API,它提供了一系列用于绘制图形和处理图像的函数和类。双缓冲是一种绘图技术,用于解决绘图过程中的闪烁问题。在使用GDI+进行绘图时,可以通过双缓冲技术来减少或消除绘图过程中的闪烁现象。 下面是一个使用GDI+双缓冲的示例代码: ```c++ #include <windows.h> #include <gdiplus.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("DoubleBuffer"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("Double Buffering Demo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int cxClient, cyClient; HDC hdc; PAINTSTRUCT ps; Gdiplus::Graphics* graphics; Gdiplus::Bitmap* bitmap; Gdiplus::Graphics* memGraphics; Gdiplus::Bitmap* memBitmap; switch (message) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); // 创建一个与窗口大小相同的内存位图 bitmap = new Gdiplus::Bitmap(cxClient, cyClient); graphics = Gdiplus::Graphics::FromImage(bitmap); // 创建一个与内存位图相同大小的内存绘图对象 memBitmap = new Gdiplus::Bitmap(cxClient, cyClient); memGraphics = Gdiplus::Graphics::FromImage(memBitmap); // 在内存绘图对象上进行绘制操作 // ... // 将内存绘图对象的内容绘制到窗口的设备上下文中 graphics->DrawImage(memBitmap, 0, 0); // 释放资源 delete graphics; delete bitmap; delete memGraphics; delete memBitmap; EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } ``` 在上面的示例代码中,我们创建了一个窗口,并在窗口的`WM_PAINT`消息处理函数中使用了双缓冲技术。具体来说,我们创建了一个与窗口大小相同的内存位图,并在内存位图上进行绘制操作。然后,将内存位图的内容绘制到窗口的设备上下文中,从而实现了双缓冲绘图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值