计算机操作系统
文章平均质量分 70
darkness0604
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
IO那些事15-RPC调用的组合方式
RPCRPC,远程服务调用,只是一种调用行为的名称,而进行连接的双方使用的协议是不受限定的,可以是自定义的某种协议(自定义消息头和消息体,自行对传输消息的格式进行约定),也可以是比较公知的例如http协议(但其本质,应该说HTTP协议也是一种比较公认的自定义协议),但这无非就是调用协议层面的事情,整体来说,都是一种RPC的表现,所谓的通信有无状态,完全是看协议的实现是如何约定的。HTTP协议消费端,可以使用第三方HTTP类库,也可以使用netty支持的http协议客户端形式进行调用。服务端,既可以原创 2021-04-21 15:38:42 · 226 阅读 · 0 评论 -
IO那些事14-RPC优化点
RPC的层次感作为RPC调用来说,更多的还需要考虑用户体验度,对于用户来说,就是面向接口调用。然而实际上一个RPC的端点,可能既需要作为consumer去调用远程的provider的服务,而自身也作为一个provider提供着一些服务,作为这个端点来说,它对外提供的服务,对它自身肯定是一些本地的方法调用。所以我们在设计RPC通信时,调用的时候,不单单需要考虑只有远程调用,而应该首先去判断一下这个服务的实现方法在本地有没有,如果有的话,没必要再走RPC最终再调到自己身上来。 public stati原创 2021-04-21 15:36:32 · 341 阅读 · 0 评论 -
IO那些事13-IO的思考
多个ServerBootstrap可以实现一套计算资源,不同的处理逻辑IO密集型和计算密集型IO密集型就是和kernel打交道很多,会有比较多的系统调用。计算密集型则相反,更多的是在单纯用CPU做计算,而不怎么与内核打交道。正常来说,网卡到程序的过程中一定伴随着中断操作的干预,而当网卡数据来临非常频繁时,底层会进行优化,内核会关闭中断,然后直接让CPU疯狂从网卡的buffer中取出数据到内核的buffer中,且这个过程是底层系统硬件实现的。 但即使是这样,如果我们程序不尽快取走内核buffer中的数原创 2021-04-21 15:33:52 · 164 阅读 · 2 评论 -
IO那些事08-JAVA API层面的IO历程01
selector前面大篇幅的描述了IO的发展史,并谈到了多路复用的级别模型IO,当描述的这一切,都只是内核级别的调用,或者说是C级别的调用,而作为一个java程序员来说,更多的应该是API层面的使用。作为java api来说,无论是哪种模型,都统一抽象成了selector。来看一段java代码来了解:import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import jav原创 2021-01-12 15:19:24 · 217 阅读 · 0 评论 -
IO那些事07-多路复用IO之select,poll,epoll
多路复用器下的实现所有的多路复用器都是基于POSIX的规范进行实现的。SELECT最通用的多路复用器,也就是基本所有操作系统都有的,就是selectman 2 selectselect的参数可以发现是传入若干个文件描述符(读的和写的),但是一次调用可以操作的文件描述符FD_SETSIZE最大不能超过1024个。nfds:操作多少个文件描述符readfds:读的文件描述符集合writefds:写的文件描述符集合timeout:等待的时间,超过时间后,直接返回当前的文件描述符的状态。.原创 2021-01-04 11:17:25 · 255 阅读 · 0 评论 -
IO那些事06-网络IO之IO角度下的NIO
NIO的语义在java中,NIO意思是New IO在操作系统中,NIO意思是非阻塞IO代码实例import java.net.InetSocketAddress;import java.net.StandardSocketOptions;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.原创 2020-12-21 10:55:45 · 173 阅读 · 0 评论 -
IO那些事05-网络IO之IO角度下的BIO
/** * BIO 多线程的方式 */public class SocketIOPropertites { //server socket listen property: private static final int RECEIVE_BUFFER = 10; private static final int SO_TIMEOUT = 0; private static final boolean REUSE_ADDR = false; //当线程不够原创 2020-12-21 10:53:30 · 224 阅读 · 0 评论 -
IO那些事04-网络IO之TCP
传统的BIO模型下的,服务端代码:/** * BIO 多线程的方式 */public class SocketIOPropertites { //server socket listen property: private static final int RECEIVE_BUFFER = 10; private static final int SO_TIMEOUT = 0; private static final boolean REUSE_ADDR =原创 2020-12-21 10:48:22 · 281 阅读 · 0 评论 -
IO那些事03-几种常见的文件IO模型
java中的普通write和buffer read的重要差距?每次写数据data:“123456789\n”通过查看追踪系统调用线程文件,发现普通write,每一次write,实质都是一次系统调用,也就是都会发生一次内核态切换:通过查看追踪系统调用线程文件,发现buffered的write,每一次write,写的是一个缓冲区的若干个“123456789\n”:NIO在jdk新版,除了传统IO,又出现了新的IO,也就是NIO,也暴露了新的API,ByteBuffer public voi原创 2020-11-30 15:28:01 · 435 阅读 · 0 评论 -
IO那些事02-PageCache
PageCache为了提升IO的效率,计算机的整体各处都是存在页缓存的概念的。作为应用进程来说,一般都会存在以4k为单位的缓存页,也就是buffer,可以想象java中的bufferreader等。。接着,作为系统内核来说,它内部也存在页缓存(pagecache)。最后,对于硬盘的驱动本身,也存在缓冲区。因此可以想象,读取一份文件,会从磁盘驱动本身开始,每次读到缓冲区大小的内容才会向上级返回,这样大大提高IO的效率。而除了多级缓存之外,我们也不难想到,IO是个很慢的操作,如果一直让CPU去频原创 2020-11-30 15:20:42 · 395 阅读 · 0 评论 -
IO那些事01-IO总述和文件描述符
VFS内核既管内存,又管磁盘IO。作为LINUX内核来说,它在内存中构建了一个虚拟文件系统VFS,不同于windows上的物理文件系统结构,C盘代表的就是物理的C盘分区,D盘就是D盘的物理分区,VFS本质就是一颗目录树,每个目录可以映射代表不同的物理设备。为什么要有VFS?因为VFS相当于一个中间的解耦层,下层的存储源的存储形式可能是各不相同的,可能是来自不同的硬件设备,但需要将这些包成一个统一的对外接口暴露给上层应用使用。pagecache在VFS中,每一个文件都有一个inode id作为.原创 2020-11-30 15:17:59 · 1871 阅读 · 0 评论 -
JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单制作
汇编实现引导程序编写汇编码; 文件名 boot.asm org 7c00h ; BIOS读入MBR(Master Boot Record主引导记录)后,从0x7c00h处开始执行,所以这里把程序扔到内存的0x7c00h中去 ; 下面部分和10h有关中断,10h中断用来显示字符mov ax, csmov es, axmov ax, msgmov bp, ax ; ES:BP表示显示字符串的地址mov cx, msgLen原创 2020-10-25 21:56:24 · 434 阅读 · 1 评论 -
JAVA程序员需要知道的计算机底层基础09-内核同步机制
关于同步理论的一些基本概念临界区(critical area)访问或操作共享数据的代码段。简单理解:synchronized大括号中部分(原子性)竞争条件(race conditions)两个线程同时拥有临界区的执行权数据不一致(data unconsistency)由竞争条件引起的数据破坏同步(synchronization)避免race conditions锁完成同步的手段(门锁,门后是临界区,只允许一个线程存在)这意味着上锁解锁的操作必须具备原子性。底层lock指令支持原原创 2020-10-25 21:52:13 · 341 阅读 · 4 评论 -
JAVA程序员需要知道的计算机底层基础08-内存管理的发展历程与现代内存管理机制
DOS时代在DOS时代 ,内存很小,同一时间只能有一个进程在运行(也有一些特殊算法可以支持多进程,通过栈来手动实现多进程之间的切换,但这个比较特殊很少见,不做讨论)Winwods9X时代内存变大,可以让多个进程装入内存。但依然存在问题:1、内存不够用,多个进程同时装入,但内存时有限的。2、互相打扰,因为多个进程同时存在于内存中,那意味着某一个进程可以随意去访问另外一个进程的物理内存地址,这也是非常危险的一件事情,恶意攻击将变得非常容易。为了解决这两个问题,诞生了现在的内存管理系统:虚拟地址 分原创 2020-10-25 21:49:46 · 340 阅读 · 0 评论 -
JAVA程序员需要知道的计算机底层基础07-中断
中断是和操作系统内核通信的一种机制,它本身也是一种信号,举个例子,一个应用程序运行过程中出现了卡顿,此时CPU在全力执行这个程序的进程,我们想通过键盘或者鼠标的某个按键来告诉操作系统将这个进程进行关闭(也就是想通过硬件的操作来让软件有个反馈),此时就需要用到中断,也就是说发送了一个紧急信号,希望内核命令应用程序可以停下手头的工作,然后优先进行处理我的某个操作。中断分为硬中断和软中断,我们上面描述的例子,其实就是硬中断的一个过程。硬中断1、键盘按下了一个键。2、中断控制器(一个芯片)收到了来自键盘.原创 2020-10-25 21:46:15 · 437 阅读 · 0 评论 -
JAVA程序员需要知道的计算机底层基础06-进程调度
一个操作系统往往是存在很多进程的,虽然内存是各自独立的,但CPU确是共享,那势必存在一个多个进程之间调度执行的问题,也就是什么时候执行这个进程,什么时候执行另外一个进程的,各自执行多久?这种问题。linux中的调度方式非常灵活,不是像其他有些操作系统一样固定只有一种的,而是可以根据对应的调度策略进行调度,而调度策略可以由开发内核的进行自定义策略编写,当然linux自身也已经提供了一些调度策略,一般来说我们不需要手动去编写(能编写那你也得会写内核)。进程调度发展历程早期的dos系统只支持单任务运行,.原创 2020-09-28 14:16:09 · 276 阅读 · 0 评论
分享