今晚9点: 《Linux文件系统与I/O流程和模型》微课(4.15-4.18)

Linux I/O是宋宝华老师继《Linux的任督二脉:进程调度和内存管理》第一脉《进程、线程和调度》、第二脉《内存管理》后的,进程、内存、I/O铁三角的一角。

这样,进程、内存和I/O形成了一个完整的系列。这次的I/O,主要弄清从上到下发起一次Block I/O的全流程、文件系统ext4等的模型和工作方法、不同的I/O访问模型。


上课时间: 4.15-18日,4晚,每晚9点开始,每次约70分钟。


上课式:

2个微信群 1个群上课采用图、语音、关键部分电脑演示录屏视频分享形式(可无限次数回看);另外1个群深度技术答疑模式和讨论。

FAQ:

如果直播的时间段在加班怎么办?

提前报名后,已经加入了上课微信群,就可以收到上课内容,之后再看也没有问题。

课程结束后能再报名吗?

是不可以的,因为没有在上课前进入上课群,所以收不到上课的内容。


内容列表(大纲非最终版,还在润色和增强):

第一天

第1节  Linux I/O和网络模型

阻塞

非阻塞

多路复用:select和epoll

Signal IO

异步IO

Libevent: 事件驱动的I/O

多线程与I/O编程模型


第二天

第2节 文件系统的架构

一切都是文件:VFS

字符设备文件、块设备文件

超级块、目录、inode

符号链接与硬链接

目录的组织

icache和dcache,slab shrink

块映射

发现并读取/usr/bin/xxx的全流程

用户空间的文件系统:FUSE


第三天

第3节 文件系统的实现

EXT2/3/4的layout

文件系统的一致性:append一个文件的全流程

掉电与文件系统一致性

fsck

文件系统的日志

ext4 mount选项

文件系统的debug和dump

Copy On Write文件系统: btrfs

第四天

第4节 块I/O流程与I/O调度器

一个块IO的一生:从page cache到bio到request

O_DIRECT和O_SYNC

blktrace

IO调度和CFQ调度算法

CFQ和ionice

cgroup与IO

io调试:iotop, iostat



报名方法,扫码加微信,发送报名红包,加入直播群和讨论群。

各个时段报名的价格:

早鸟期:3月25日前(包括3月25日) 333元   (前期参加了内存管理微课的童鞋可直减33元)

3月25日后报名发红包 388元   (前期参加了内存管理微课的童鞋可直减33元)


640?wx_fmt=png


I/O模型的问题

07-19

// alertIO.cpp : Defines the entry point for the console application.rn//rnrn#include "stdafx.h"rn#include "Windows.h"rnVOID CALLBACK FileReadCompletionRoutine(rn DWORD dwErrorCode, // completion codern DWORD dwNumberOfBytesTransfered, // number of bytes transferredrn LPOVERLAPPED lpOverlapped // I/O information bufferrn )rnrn printf("\r\n");rn printf("ReadError:%d\r\n",dwErrorCode);rn printf("read:%d\r\n",dwNumberOfBytesTransfered);rn printf("\r\n");rnrnVOID CALLBACK FileWriteCompletionRoutine(rn DWORD dwErrorCode, // completion codern DWORD dwNumberOfBytesTransfered, // number of bytes transferredrn LPOVERLAPPED lpOverlapped // I/O information bufferrn )rnrn printf("\r\n");rn printf("WriteError:%d\r\n",dwErrorCode);rn printf("Written:%d\r\n",dwNumberOfBytesTransfered);rn printf("\r\n");rn rnrnint main(int argc, char* argv[])rnrn OVERLAPPED oRead = 0;rn OVERLAPPED oWrite = 0;rn HANDLE hfile = CreateFile("c:\\test.bmp",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);rn char szReadBuffer[101];rn char *szWriteBuffer = "1234567890";rn ZeroMemory(szReadBuffer,101);rn oRead.Offset = 100;rn oWrite.Offset = 200;rn ReadFileEx(hfile,szReadBuffer,100,&oRead,FileReadCompletionRoutine);rn int errCode = GetLastError();rn WriteFileEx(hfile,szWriteBuffer,10,&oWrite,FileWriteCompletionRoutine);rn errCode = GetLastError();rn SleepEx(INFINITE,TRUE);rn return 0;rnrnrn为什么只有FileReadCompletionRoutine被调用?rn我跟踪了一下,FileWriteCompletionRoutine一直都没被执行

SOCKET I/O模型求助

01-06

[code=C/C++]// testiocp.cpp : Defines the entry point for the console application.rn//rnrn#include "StdAfx.h"rn#include rn#include rn#pragma comment(lib, "ws2_32.lib")rnrnrntypedef struct _OVERLAPPEDPLUSrnrn OVERLAPPED ol;rn SOCKET socket;rn int nOpCode;rn WSABUF wsaBuf;rn DWORD dwFlags;rn DWORD dwBytes;rn char pBuf[4096];rnOVERLAPPEDPLUS, *POVERLAPPEDPLUS;rnrnrnDWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID);rnrnvoid main()rnrn WORD wVersionRequested;rn WSADATA wsaData;rn int err;rn wVersionRequested = MAKEWORD( 2, 2 );rn err = WSAStartup( wVersionRequested, &wsaData );rn if ( err != 0 )rn rn printf("WSAStartup errors!\n");rn return;rn rn if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )rn rn WSACleanup( );rn return;rn rnrn SOCKET sockSvr = WSASocket(AF_INET, SOCK_STREAM, 0, 0, 0, WSA_FLAG_OVERLAPPED);rn if(INVALID_SOCKET == sockSvr)rn rn printf("WSASocket errors!\n");rn return;rn rn SOCKADDR_IN addrSvr;rn ZeroMemory(&addrSvr, sizeof(SOCKADDR_IN));rn addrSvr.sin_family = AF_INET;rn addrSvr.sin_port = htons(6000);rn addrSvr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);rn int nRet = bind(sockSvr, (SOCKADDR*)&addrSvr, sizeof(SOCKADDR));rn if(SOCKET_ERROR == nRet)rn rn printf("bind errors!\n");rn return;rn rn nRet = listen(sockSvr, 500);//500:max number of connect requestrn if(SOCKET_ERROR == nRet)rn rn printf("listen errors!\n");rn return;rn rnrn HANDLE hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0);rn if(!hCompletionPort)rn rn printf("CreateIoCompletionPort errors!\n");rn return;rn rn SYSTEM_INFO SystemInfo;rn UINT i = 0;rn DWORD dwThreadID = 0;rn GetSystemInfo(&SystemInfo);rn for(i=0; iol), sizeof(OVERLAPPED));rn pOlp->socket = sockAccept;rn pOlp->dwFlags = 0;rn pOlp->wsaBuf.buf = pOlp->pBuf;rn pOlp->wsaBuf.len = 4096;rn pOlp->nOpCode = FD_READ;rn nRet = WSARecv(pOlp->socket, &(pOlp->wsaBuf), 1, &(pOlp->dwBytes), &(pOlp->dwFlags), &(pOlp->ol), NULL);rn if(SOCKET_ERROR == nRet)rn rn if(WSAGetLastError() != ERROR_IO_PENDING)rn rn printf("WSARecv() failed with error %d\n", WSAGetLastError());rn return;rn rn rn rn return;rnrnDWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)rnrn HANDLE hCompletionPort = (HANDLE) CompletionPortID;rn void* re;rn DWORD berByte;rn OVERLAPPED* pOl;rn while(TRUE)rn rn BOOL bRet = GetQueuedCompletionStatus(hCompletionPort, &berByte, (LPDWORD)&re, (LPOVERLAPPED*)&pOl, INFINITE);rn if(!bRet)rn rn printf("GetQueuedCompletionStatus failed with error %d\n", GetLastError());rn return FALSE;rn rn if(0 == berByte)rn rn printf("DGFDGDGF\n");rn return FALSE;rn rn OVERLAPPEDPLUS* pOlp = (OVERLAPPEDPLUS*) pOl;rn switch(pOlp->nOpCode)rn rn case FD_READ:rn printf("%s\n", pOlp->wsaBuf.buf);rn break;rn default:rn printf("no data!!\n");rn rn pOlp->nOpCode = FD_READ;rn WSARecv(pOlp->socket, &(pOlp->wsaBuf), 1, &(pOlp->dwBytes), &(pOlp->dwFlags), &(pOlp->ol), NULL);rn rn return TRUE;rn[/code]rnrn这是人下的别人的代码,就是很多不明白的地方。。也就是说就是那几个SDK不明白,他程序的流程是怎么样的呀。。这个我不清楚。如果大家有点可以帮我看一下的话给我加一点儿注释吧。谢谢!说说你们的理解和看法!感激不尽啊!

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试