摘要: 1、文件与其元数据Linux获取文件状态的时候会把其相关的元数据放在stat结构中,如下:struct stat { dev_t st_dev; //文件设备节点 ino_t st_ino; //ino mode_t st_mode; //文件模式 nlink_t st_nlink; //硬链接数目 uid_t st_uid; //用户ID gid_t st_gid; //组ID dev_t st_rdev; //如果是设备,设备编号 ... 阅读全文
posted @ 2011-10-19 16:18 GG大婶 阅读(1309) 评论(0) 推荐(0) 编辑
摘要: 基本概念观察者模式中有最基本的两个角色:Observable和Observer。涉及到的基本操作有:Observable在Observer中订阅,要接受消息。Observable取消注册(或者Observer将其删除)。Observer有了消息之后通知Observable。总的来看还是比较简单的。Observer中保存所有的Observable,然后在需要通知的时候调用notifyObservers来实现。下面是观察者模式的类图:对于java中的观察者模式框架下面给出一个例子:import java.util.Observable;import java.util.Observer;class 阅读全文
posted @ 2011-10-17 13:58 GG大婶 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 1、让出处理器 Linux提供一个系统调用运行进程主动让出执行权:sched_yield。进程运行的好好的,为什么需要这个函数呢?有一种情况是用户空间线程的锁定。如果一个线程试图取得另一个线程所持有的锁,则新的线程应该让出处理器知道该锁变为可用。用户空间锁没有内核的支持,这是一个最间单、最有效率的做法。但是现在Linux线程实现引入一个使用futexes的优化解决方案。 另一个情况是在有处理器密集型程序可用周期性调用sched_yield,试图将该进程对系统的冲击减到最小。不管怎么说,如何调度程序应该是系统的事情,而不是进程自己去管。eg:int main(){ int ret, i... 阅读全文
posted @ 2011-10-17 09:55 GG大婶 阅读(1678) 评论(2) 推荐(1) 编辑
摘要: polling下面包含了实现了基于轮询策略的select调用或其他类型的I/O轮询系统调用的基类。先看抽象类AbstractPollingIoAcceptor,成员如下:public abstract class AbstractPollingIoAcceptor<T extends AbstractIoSession, H> extends AbstractIoAcceptor { private final IoProcessor<T> processor; private final boolean createdProcessor; private final 阅读全文
posted @ 2011-10-15 18:11 GG大婶 阅读(561) 评论(0) 推荐(0) 编辑
摘要: 1、IoSession与底层的传输层类型无关,表示通信双端的连接。提供用户自定义属性,可以用于在过滤器和处理器之间交换用户自定义协议相关信息。每个会话都由一个Service来提供服务,同时有一个Handler负责此会话的I/O事件处理。最重要的两个方法就是read和write,这两个方法都是异步执行,如要真正完成必须在其结果上进行等待。关闭会话的方法close也是异步执行的,也就是应等待返回的CloseFuture,此外,还有另一种关闭方式closeOnFlush,它和close的区别是会先flush掉写请求队列中的请求数据,但同样是异步的。会话的读写类型是可配置的,在运行中可设置此端是否可读 阅读全文
posted @ 2011-10-14 13:20 GG大婶 阅读(22698) 评论(0) 推荐(2) 编辑
摘要: 1、TransportMetadata定义了一组操作底层的元数据信息,它的一个实现是DefaultTransportMetadata,维护的信息如下: private final String providerName; private final String name; private final boolean connectionless; private final boolean fragmentation; private final Class<? extends SocketAddress> addressType; private fin... 阅读全文
posted @ 2011-10-13 17:24 GG大婶 阅读(1079) 评论(0) 推荐(0) 编辑
摘要: 与进程相关的用户ID有四个:真实的、有效的、被保存的、文件系统的用户ID。真实的ID是指启动进程的用户的ID。有效用户ID是指正在运行的进程的用户ID。被保存的ID是进程最初的有效用户ID。有效用户ID最重要,是确认进程凭证期间所检查的用户ID,真实ID和被保存的ID可作为替代品。root用户可以给uid提供任何值,但是普通用户只能提供真实ID或者被保存的用户ID。下面是和各种ID相关的方法,不详细:int main(){ printf("uid:%d\n", (int)getuid()); printf("pid:%d\n", (int)getpid( 阅读全文
posted @ 2011-10-13 09:41 GG大婶 阅读(323) 评论(5) 推荐(0) 编辑
摘要: 可以通过execl函数把新的程序加载到内存中,把当前进程的映像替换成新的映像。path指向程序的位置,arg是新程序的第一个参数,省略号表示数目不定的参数,但是必须以NULL结束:int execl(const char *path, const char *arg, ...);下面是该函数的一个例子,该段代码加载了ls对应的程序,ls运行结束之后返回,而不再执行main中在其后面的代码:int main(){ int ret = execl("/bin/ls","ls", NULL); if(ret == -1){ printf("调用exe 阅读全文
posted @ 2011-10-13 08:41 GG大婶 阅读(1329) 评论(1) 推荐(0) 编辑
摘要: “同步”和“异步”这两个概念强调的是I/O操作在返回之前是否需要等待某个时间,而“同步化”强调的是必须发生何种事件。比如写入操作的四种情况如下:“同步化”+“同步”:操作会等到数据被刷入磁盘后返回,比如文件以O_SYNC模式打开;“同步化”+“异步”:虽然操作会在请求插入队列的时候就返回,但是该操作会保证数据刷入磁盘“异步化”+“同步”:数据写入内核缓冲中才返回,但是该操作只会影响内核缓冲区,这是通常方式;“异步化”+“异步”:操作插入请求队列就马上返回了。为什么会需要异步I/O操作?操作的时候不想被阻塞,那么是不是可以认为I/O操作的开销为0?把插入队列、I/O提交内核、接受操作完成通知等动 阅读全文
posted @ 2011-10-12 14:34 GG大婶 阅读(1858) 评论(0) 推荐(2) 编辑
摘要: 可以调用posix_fadvise函数来设置一些操作文件的方式,比如要清楚一定区域内的缓存可以使用下面代码:int main(){ int fd = open("test", O_RDWR); int ret = posix_fadvise(fd, 0, 10, POSIX_FADV_DONTNEED); printf("%d\n", ret); if(ret == -1){ printf("posix_fadvise调用失败!\n"); } close(fd); return 0;}调用该函数后内核会把所指定的范围从页面缓冲区回收, 阅读全文
posted @ 2011-10-11 20:10 GG大婶 阅读(3286) 评论(1) 推荐(0) 编辑