当前位置: 首页 > news >正文

网站开发有哪些企业网站建设既可以外包给专业的网站建设服务公司

网站开发有哪些,企业网站建设既可以外包给专业的网站建设服务公司,娄底网站建设开发,商场设计公司作者 | 闪客sun来源 | 低并发编程读取硬盘数据到内存中#xff0c;是操作系统的一个基础功能。读取硬盘需要有块设备驱动程序#xff0c;而以文件的方式来读取则还有要再上面包一层文件系统。把读出来的数据放到内存#xff0c;就涉及到内存中缓冲区的管理。上面说的每一件事… 作者 | 闪客sun来源 | 低并发编程读取硬盘数据到内存中是操作系统的一个基础功能。读取硬盘需要有块设备驱动程序而以文件的方式来读取则还有要再上面包一层文件系统。把读出来的数据放到内存就涉及到内存中缓冲区的管理。上面说的每一件事都是一个十分庞大的体系我们今天的文章一个都不展开讲哈哈。我们就讲讲读取块设备与内存缓冲区之间的桥梁块设备请求项的初始化工作。我们以 Linux 0.11 源码为例发现进入内核的 main 函数后不久有这样一行代码。void main(void) {...blk_dev_init();... }看到这个方法的全部代码后你可能会会心一笑也可能一脸懵逼。void blk_dev_init(void) {int i;for (i0; i32; i) {request[i].dev  -1;request[i].next  NULL;} }这也太简单了吧就是给 request 这个数组的前 32 个元素的两个变量 dev 和 next 附上值看这俩值 -1 和 NULL 也可以大概猜出这是没有任何作用时的初始化值。我们看下 request 结构体。/** Ok, this is an expanded form so that we can use the same* request for paging requests when that is implemented. In* paging, bh is NULL, and waiting is used to wait for* read/write completion.*/ struct request {int dev;        /* -1 if no request */int cmd;        /* READ or WRITE */int errors;unsigned long sector;unsigned long nr_sectors;char * buffer;struct task_struct * waiting;struct buffer_head * bh;struct request * next; };注释也附上了。哎哟这就有点头大了刚刚的函数虽然很短但看到这个结构体我们知道了重点在这呢。这也侧面说明了学习操作系统其实把遇到的重要数据结构牢记心中就已经成功一半了。比如主内存管理结构 mem_map知道它的数据结构是什么样子其功能也基本就懂了。收继续说这个 request 结构这个结构就代表了一次读盘请求其中dev 表示设备号-1 就表示空闲。cmd 表示命令其实就是 READ 还是 WRITE也就表示本次操作是读还是写。errors 表示操作时产生的错误次数。sector 表示起始扇区。nr_sectors 表示扇区数。buffer 表示数据缓冲区也就是读盘之后的数据放在内存中的什么位置。waiting 是个 task_struct 结构这可以表示一个进程也就表示是哪个进程发起了这个请求。bh 是缓冲区头指针这个后面讲完缓冲区就懂了因为这个 request 是需要与缓冲区挂钩的。next 指向了下一个请求项。这里有的变量看不懂没关系。不过我们倒是可以基于现有的重点参数猜测一下比如读请求时cmd 就是 READsector 和 nr_sectors 这俩就定位了所要读取的块设备可以简单先理解为硬盘的哪几个扇区buffer 就定位了这些数据读完之后放在内存的什么位置。这就够啦想想看这四个参数是不是就能完整描述了一个读取硬盘的需求了而且完全没有歧义就像下面这样。而其他的参数肯定是为了更好地配合操作系统进行读写块设备操作嘛为了把多个读写块设备请求很好地组织起来。这个组织不但要有这个数据结构中 hb 和 next 等变量的配合还要有后面的电梯调度算法的配合仅此而已先点到为止。总之我们这里就先明白这个 request 结构可以完整描述一个读盘操作。然后那个 request 数组就是把它们都放在一起并且它们又通过 next 指针串成链表。好本文讲述的两行代码其实就完成了上图所示的工作而已。但讲到这就结束的话很多同学可能会不太甘心那我就简单展望一下后面读盘的全流程中是怎么用到刚刚初始化的这个 request[32] 结构的。读操作的系统调用函数是 sys_read源代码很长我给简化一下仅仅保留读取普通文件的分支就是如下的样子。int sys_read(unsigned int fd,char * buf,int count) {struct file * file  current-filp[fd];struct m_inode * inode  file-f_inode;// 校验 buf 区域的内存限制verify_area(buf,count);// 仅关注目录文件或普通文件return file_read(inode,file,buf,count); }看入参 fd 是文件描述符通过它可以找到一个文件的 inode进而找到这个文件在硬盘中的位置。另两个入参 buf 就是要复制到的内存中的位置count 就是要复制多少个字节很好理解。钻到 file_read 函数里继续看。int file_read(struct m_inode * inode, struct file * filp, char * buf, int count) {int left,chars,nr;struct buffer_head * bh;left  count;while (left) {if (nr  bmap(inode,(filp-f_pos)/BLOCK_SIZE)) {if (!(bhbread(inode-i_dev,nr)))break;} elsebh  NULL;nr  filp-f_pos % BLOCK_SIZE;chars  MIN( BLOCK_SIZE-nr , left );filp-f_pos  chars;left - chars;if (bh) {char * p  nr  bh-b_data;while (chars--0)put_fs_byte(*(p),buf);brelse(bh);} else {while (chars--0)put_fs_byte(0,buf);}}inode-i_atime  CURRENT_TIME;return (count-left)?(count-left):-ERROR; }整体看就是一个 while 循环每次读入一个块的数据直到入参所要求的大小全部读完为止。直接看 bread 那一行。int file_read(struct m_inode * inode, struct file * filp, char * buf, int count) {...while (left) {...if (!(bhbread(inode-i_dev,nr)))} }这个函数就是去读某一个设备的某一个数据块号的内容展开进去看。struct buffer_head * bread(int dev,int block) {struct buffer_head * bh  getblk(dev,block);if (bh-b_uptodate)return bh;ll_rw_block(READ,bh);wait_on_buffer(bh);if (bh-b_uptodate)return bh;brelse(bh);return NULL; }其中 getblk 先申请了一个内存中的缓冲块然后 ll_rw_block 负责把数据读入这个缓冲块进去继续看。void ll_rw_block(int rw, struct buffer_head * bh) {...make_request(major,rw,bh); }static void make_request(int major,int rw, struct buffer_head * bh) {... if (rw  READ)req  requestNR_REQUEST;elsereq  request((NR_REQUEST*2)/3); /* find an empty request */while (--req  request)if (req-dev0)break;... /* fill up the request-info, and add it to the queue */req-dev  bh-b_dev;req-cmd  rw;req-errors0;req-sector  bh-b_blocknr1;req-nr_sectors  2;req-buffer  bh-b_data;req-waiting  NULL;req-bh  bh;req-next  NULL;add_request(majorblk_dev,req); }看这里就用到了刚刚说的结构咯。具体说来就是该函数会往刚刚的设备的请求项链表 request[32] 中添加一个请求项只要 request[32] 中有未处理的请求项存在都会陆续地被处理直到设备的请求项链表是空为止。具体怎么读盘就是与硬盘 IO 端口进行交互的过程了可以继续往里跟直到看到一个 hd_out 函数为止本讲不展开了。具体读盘操作后面会有详细的章节展开讲解本讲你只需要知道我们在 main 函数的 init 系列函数中通过 blk_dev_init 为后面的块设备访问提前建立了一个数据结构作为访问块设备和内存缓冲区之间的桥梁就可以了。往期推荐进程切换的本质是什么一次限制进程的 CPU 用量的实操过程Redis 内存满了怎么办这样置才正确手工模拟实现 Docker 容器网络点分享点收藏点点赞点在看
http://www.pierceye.com/news/589124/

相关文章:

  • wordpress商城视频教程苏州推广关键词优化
  • 网站游戏正规网站建设安卓系统软件开发培训机构
  • 关于网站集约化建设的讲话周口seo公司
  • 长沙做网站的公司哪家最好服务公司取名
  • 网站缩略图制作宁波商城网站建设
  • 公司网站公众号维护怎么做湖南网站建设
  • 商务网站建设实训结论装饰装修工程
  • dw做网站简单吗网络科技建设网站
  • 天台建设局网站wordpress编辑器没有16px
  • 携程网站建设计划管理与进度控制志鸿优化设计电子版
  • 网站一级域名和二级域名wordpress 插件 页面
  • 怎么做免费网站如何让百度收录网网站建设设计
  • 河北建设工程信息网官方网站证件在线制作免费
  • 推广网官方推广网站wordpress用户角色权限
  • 电子商务网站模板html淘宝网页版登录
  • 忆达城市建设游戏网站佛山市和城乡建设局网站
  • 备案后的域名改网站名青浦建设机械网站
  • 网站地图怎么做html网络营销论文2000字
  • 武进区城乡建设局网站组建网站建设团队
  • 做淘宝链接模板网站广安网站建设兼职
  • 受欢迎的网站建设平台有用的网站地址
  • 网站建设推广岗位网站建设法规
  • ftp两个网站子域名的绑定郑州网站推广公司
  • 安庆网站设计哈尔滨工程招标信息网
  • 精湛的佛山网站设计太原网站建设培训
  • 邹城市住房和建设局网站深圳比较好的vi设计公司
  • 企业网站建设维护方案一元购物网站怎么做
  • 网站建设优化公司哪家好兰州做网站公司es5188
  • jsp网站开发工资住建网查询
  • 长沙建网站需要多少钱夹江移动网站建设