首页 > 其他 > 详细

《深入理解计算机系统》速读笔记

时间:2019-10-25 20:55:59      阅读:110      评论:0      收藏:0      [点我收藏+]

问题一 条件码

条件码寄存器中保存着单个位的条件码,由CPU维护,如:
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志

有几类指令能够修改条件码:
算术指令:既改变操作数,也有可能改变条件码。
CMP指令:右操作数减左操作数,只可能改变条件码。
TEST指令:两操作数相与,只可能改变条件码。

条件码寄存器不能直接读取,有三种方法:
set指令:根据条件码,设置一个字节。
jump指令:根据条件码进行跳转,即控制的条件转移。
cmov条件传送指令:根据条件码决定是否进行mov操作。

问题二 RIO包

  • RIO,全称 Robust I/O,即健壮的IO包。它提供了与系统I/O类似的函数接口,在读取操作时,RIO包加入了读缓冲区,一定程度上增加了程序的读取效率。
  • RIO函数提供了带缓冲的读操作,与无缓冲的写操作
  • RIO帮助我们处理了可修复的错误类型:EINTR。考虑read和write在阻塞时被某个信号中断,在中断前它们还未读取/写入任何字节,则这两个系统调用便会返回-1表示错误,并将errno置为EINTR。这个错误是可以修复的,并且应该是对用户透明的,用户无需在意read 和 write有没有被中断,他们只需要直到read 和 write成功读取/写入了多少字节,所以在RIO的rio_read()和rio_write()中便对中断进行了处理。
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
 
ssize_t rio_readn(int fd, void *usrbuf, size_t n)
{
    size_t nleft = n;
    ssize_t nread;
    char *bufp = usrbuf;
 
    while (nleft > 0)
    {
        if ((nread = read(fd, bufp, nleft)) < 0)
        {
            if (errno == EINTR)
            {
                nread = 0;
            }
            else
            {
                return -1;
            }
        }
        else if (nread == 0)
        {
            break;
        }
 
        nleft -= nread;
        bufp += nread;
    }
 
    return (n-nleft);
}
 
ssize_t rio_writen(int fd, void *usrbuf, size_t n)
{
    size_t nleft = n;
    ssize_t nwritten;
    char *bufp = usrbuf;
 
    while (nleft > 0)
    {
        if ((nwritten = write(fd, bufp, nleft)) <= 0)
        {
            if (errno == EINTR)
            {
                nwritten = 0;
            }
            else
            {
                return -1;
            }
        }
 
        nleft -= nwritten;
        bufp += nwritten;
    }
 
    return n;
}

《深入理解计算机系统》速读笔记

原文:https://www.cnblogs.com/20199321zjy/p/11740575.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!