API网关用来管理API,但是API的实现一般在一个叫作Controller层的地方。这一层对外提供API。由于是让陌生人访问的,我们能看到目前业界主流的,基本都是RESTful的API,是面向大规模互联网应用的。 资源的状态不应该维护在业务逻辑层,而是在最底层的持久化层,一般会使用分布式数据库和ElasticSearch。 这些服务端的状态,例如订单、库存、商品等,都是重中之重,都需要持久化到硬盘上,数据不能丢,但是由于硬盘读写性能差,因而持久化层往往吞吐量不能达到互联网应用要求的吞吐量,因而前面要有一层缓存层,使用Redis或者memcached将请求拦截一道,不能让所有的请求都进入数据...

  4Txe79BjyroE   2023年11月22日   11   0   0 RPC协议

内存映射不仅仅是物理内存和虚拟内存之间的映射,还包括将文件中的内容映射到虚拟内存空间。这个时候,访问内存空间就能够访问到文件里面的数据。而仅有物理内存和虚拟内存的映射,是一种特殊情况。 对于堆的申请来讲,mmap是映射内存空间到物理内存。 如果一个进程想映射一个文件到自己的虚拟内存空间,也要通过mmap系统调用。这个时候mmap是映射内存空间到物理内存再到文件。 如果是匿名映射,则调用mm_struct里面的get_unmapped_area函数。这个函数其实是arch_get_unmapped_area。它会调用find_vma_prev,在表示虚拟内存区域的vm_area_struct红...

  4Txe79BjyroE   2023年11月19日   18   0   0 虚拟内存物理内存

内核态的内存映射机制,主要包含以下几个部分: 内核态内存映射函数vmalloc、kmap_atomic是如何工作的; 内核态页表是放在哪里的,如何工作的?swapper_pg_dir是怎么回事; 出现了内核态缺页异常应该怎么办? 内核页表的顶级目录init_top_pgt,定义在__INITDATA里面。它们都有代码段,还有一些初始化了的全局变量,放在.init区域。这些说的就是这个区域。可以看到,页表的根其实是全局变量,这就使得我们初始化的时候,甚至内存管理还没有初始化的时候,很容易就可以定位到。 因为level3_ident_pgt是在虚拟地址的内核代码段里的,而__START_KER...

  4Txe79BjyroE   2023年11月19日   17   0   0 内核态

对于运行的进程来说,内存就像一个纸箱子,仅仅是一个暂存数据的地方,而且空间有限。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在外部存储中。就像图书馆这种地方,不仅空间大,而且能够永久保存。 我们最常用的外部存储就是硬盘,数据是以文件的形式保存在硬盘上的。为了管理这些文件,我们在规划文件系统的时候,需要考虑到以下几点。 第一点,文件系统要有严格的组织形式,使得文件能够以块为单位进行存储。这就像图书馆里,我们会设置一排排书架,然后再把书架分成一个个小格子,有的项目存放的资料非常多,一个格子放不下,就需要多个格子来存放。我们把这个区域称为存放原始资料的仓库区。 ...

  4Txe79BjyroE   2023年11月19日   16   0   0 文件系统

硬盘分成相同大小的单元,我们称为块(Block)。一块的大小是扇区大小的整数倍,默认是4K。在格式化的时候,这个值是可以设定的。 一大块硬盘被分成了一个个小的块,用来存放文件的数据部分。这样一来,如果我们像存放一个文件,就不用给他分配一块连续的空间了。我们可以分散成一个个小块进行存放。这样就灵活得多,也比较容易添加、删除和插入数据。 文件还有元数据部分,例如名字、权限等,这就需要一个结构inode来存放。 inode里面有文件的读写权限i_mode,属于哪个用户i_uid,哪个组i_gid,大小是多少i_size_io,占用多少个块i_blocks_io。i_atime是accesstime,...

  4Txe79BjyroE   2023年11月19日   15   0   0 ext

Linux可以支持多达数十种不同的文件系统。它们的实现各不相同,因此Linux内核向用户空间提供了虚拟文件系统这个统一的接口,来对文件系统进行操作。它提供了常见的文件系统对象模型,例如inode、directoryentry、mount等,以及操作这些对象的方法,例如inodeoperations、directoryoperations、fileoperations等。 解析系统调用是了解内核架构最有力的一把钥匙。 mount系统调用用于挂载文件系统; open系统调用用于打开或者创建文件,创建要在flags中设置O_CREAT,对于读写要设置flags为O_RDWR; read系统调用用...

  4Txe79BjyroE   2023年11月19日   10   0   0 文件系统

 文件系统的读写,其实就是调用系统函数read和write。下面的代码就是read和write的系统调用,在内核里面的定义。 SYSCALL_DEFINE3(read,unsignedint,fd,char__user,buf,size_t,count) { structfdf=fdget_pos(fd); ...... loff_tpos=file_pos_read(f.file); ret=vfs_read(f.file,buf,count,&pos); ...... } SYSCALL_DEFINE3(write,unsignedint,fd,constchar_...

  4Txe79BjyroE   2023年11月19日   18   0   0 缓存

计算机系统中CPU并不直接和设备打交道,它们中间有一个叫作设备控制器(DeviceControlUnit)的组件,例如硬盘有磁盘控制器、USB有USB控制器、显示器有视频控制器等。这些控制器就像代理商一样,它们知道如何应对硬盘、鼠标、键盘、显示器的行为。 控制器其实有点儿像一台小电脑。它有它的芯片,类似小CPU,执行自己的逻辑。它也有它的寄存器。这样CPU就可以通过写这些寄存器,对控制器下发指令,通过读这些寄存器,查看控制器对于设备的操作状态。 CPU对于寄存器的读写,可比直接控制硬件,要标准和轻松很多。这就相当于你和代理商的标准产品交付。 输入输出设备我们大致可以分为两类:块设备(Block...

  4Txe79BjyroE   2023年11月19日   15   0   0 输入输出

一个内核模块应该由以下几部分组成。 第一部分,头文件部分。一般的内核模块,都需要include下面两个头文件: include<linux/module.h> include<linux/init.h> 第二部分,定义一些函数,用于处理内核模块的主要逻辑。例如打开、关闭、读取、写入设备的函数或者响应中断的函数。 例如,logibm.c里面就定义了logibm_open。logibm_close就是处理打开和关闭的,定义了logibm_interrupt就是用来响应中断的。再如,lp.c里面就定义了lp_read,lp_write就是处理读写的。 第三部分,定义一个f...

  4Txe79BjyroE   2023年11月19日   16   0   0 字符设备

要处理中断,需要有一个中断处理函数。定义如下: irqreturn_t(irq_handler_t)(intirq,voiddev_id); / enumirqreturn @IRQ_NONEinterruptwasnotfromthisdeviceorwasnothandled @IRQ_HANDLEDinterruptwashandledbythisdevice @IRQ_WAKE_THREADhandlerrequeststowakethehandlerthread / enumirqreturn{ IRQ_NONE=(0<<0), IRQ_HANDLED=(1<...

  4Txe79BjyroE   2023年11月19日   12   0   0 中断处理

块设备的mknod还是会创建在/dev路径下面,这一点和字符设备一样。/dev路径下面是devtmpfs文件系统。这是块设备遇到的第一个文件系统。我们会为这个块设备文件,分配一个特殊的inode,这一点和字符设备也是一样的。只不过字符设备走S_ISCHR这个分支,对应inode的file_operations是def_chr_fops;而块设备走S_ISBLK这个分支,对应的inode的file_operations是def_blk_fops。 接下来,我们要调用mount,将这个块设备文件挂载到一个文件夹下面。如果这个块设备原来被格式化为一种文件系统的格式,例如ext4,那我们调用的就是ex...

  4Txe79BjyroE   2023年11月19日   19   0   0 块设备

 对于ext4文件系统,最后调用的是ext4_file_write_iter,它将I/O的调用分成两种情况: 第一是直接I/O。最终我们调用的是generic_file_direct_write,这里调用的是mapping->a_ops->direct_IO,实际调用的是ext4_direct_IO,往设备层写入数据。 第二种是缓存I/O。最终我们会将数据从应用拷贝到内存缓存中,但是这个时候,并不执行真正的I/O操作。它们只将整个页或其中部分标记为脏。写操作由一个timer触发,那个时候,才调用wb_workfn往硬盘写入页面。 接下来的调用链为:wb_workfn-&g...

  4Txe79BjyroE   2023年11月19日   16   0   0 块设备

管道是一种单向传输数据的机制,它其实是一段缓存,里面的数据只能从一端写入,从另一端读出。如果想互相通信,我们需要创建两个管道才行。 管道分为两种类型,“|”表示的管道称为匿名管道,意思就是这个类型的管道没有名字,用完了就销毁了。就像上面那个命令里面的一样,竖线代表的管道随着命令的执行自动创建、自动销毁。用户甚至都不知道自己在用管道这种技术,就已经解决了问题。所以这也是面试题里面经常会问的,到时候千万别说这是竖线,而要回答背后的机制,管道。 另外一种类型是命名管道。这个类型的管道需要通过mkfifo命令显式地创建。 mkfifohello hello就是这个管道的名称。管道以文件的形式存在,...

  4Txe79BjyroE   2023年11月19日   14   0   0 进程间通信

在Linux操作系统中,为了响应各种各样的事件,也是定义了非常多的信号。我们可以通过kill-l命令,查看所有的信号。 kill-l 1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP 6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)SIGUSR1 11)SIGSEGV12)SIGUSR213)SIGPIPE14)SIGALRM15)SIGTERM 16)SIGSTKFLT17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP 21)SIGTTIN22)SIGTTOU23)SIGURG24)SIGXCPU2...

  4Txe79BjyroE   2023年11月19日   14   0   0 信号处理

对于硬件触发的,无论是中断,还是信号,肯定是先到内核的,然后内核对于中断和信号处理方式不同。一个是完全在内核里面处理完毕,一个是将信号放在对应的进程task_struct里信号相关的数据结构里面,然后等待进程在用户态去处理。当然有些严重的信号,内核会把进程干掉。但是,这也能看出来,中断和信号的严重程度不一样,信号影响的往往是某一个进程,处理慢了,甚至错了,也不过这个进程被干掉,而中断影响的是整个系统。一旦中断处理中有了bug,可能整个Linux都挂了。 有时候,内核在某些情况下,也会给进程发送信号。例如,向读端已关闭的管道写数据时产生SIGPIPE信号,当子进程退出时,我们要给父进程发送SIG...

  4Txe79BjyroE   2023年11月19日   18   0   0 信号处理

广义上来说,容器技术是动态的容器、静态的镜像和远端的仓库这三者的组合。 容器,就是一个特殊的隔离环境,它能够让进程只看到这个环境里的有限信息,不能对外界环境施加影响。 对于Linux操作系统来说,一个不受任何限制的应用程序是十分危险的。这个进程能够看到系统里所有的文件、所有的进程、所有的网络流量,访问内存里的任何数据,那么恶意程序很容易就会把系统搞瘫痪,正常程序也可能会因为无意的Bug导致信息泄漏或者其他安全事故。虽然Linux提供了用户权限控制,能够限制进程只访问某些资源,但这个机制还是比较薄弱的,和真正的“隔离”需求相差得很远。 容器技术的另一个本领就是为应用程序加上资源隔离,在系统里切分...

  4Txe79BjyroE   2023年11月13日   13   0   0 容器

镜像就是一个打包文件,里面包含了应用程序还有它运行所依赖的环境,例如文件系统、环境变量、配置参数等等。 环境变量、配置参数这些东西还是比较简单的,随便用一个manifest清单就可以管理,真正麻烦的是文件系统。为了保证容器运行环境的一致性,镜像必须把应用程序所在操作系统的根目录,也就是rootfs,都包含进来。 容器镜像内部并不是一个平坦的结构,而是由许多的镜像层组成的,每层都是只读不可修改的一组文件,相同的层可以在镜像之间共享,然后多个层像搭积木一样堆叠起来,再使用一种叫“UnionFS联合文件系统”的技术把它们合并在一起,就形成了容器最终看到的文件系统。 dockerinspect来查看镜...

  4Txe79BjyroE   2023年11月13日   16   0   0 DockerFile

Kubernetes是一个生产级别的容器编排平台和集群管理系统,能够创建、调度容器,监控、管理服务器。 操作系统的一个重要功能就是抽象,从繁琐的底层事务中抽象出一些简洁的概念,然后基于这些概念去管理系统资源。 Kubernetes也是这样,它的管理目标是大规模的集群和应用,必须要能够把系统抽象到足够高的层次,分解出一些松耦合的对象,才能简化系统模型,减轻用户的心智负担。 Kubernetes采用了现今流行的“控制面/数据面”(ControlPlane/DataPlane)架构,集群里的计算机被称为“节点”(Node),可以是实机也可以是虚机,少量的节点用作控制面来执行集群的管理维护工作,其他...

  4Txe79BjyroE   2023年11月13日   18   0   0 k8s

Kubernetes使用的YAML语言有一个非常关键的特性,叫“声明式”(Declarative),对应的有另外一个词:“命令式”(Imperative)。 大多数编程语言也属于命令式,它的特点是交互性强,注重顺序和过程,你必须“告诉”计算机每步该做什么,所有的步骤都列清楚,这样程序才能够一步步走下去,最后完成任务,显得计算机有点“笨”。 “声明式”,在Kubernetes出现之前比较少见,它与“命令式”完全相反,不关心具体的过程,更注重结果。我们不需要“教”计算机该怎么做,只要告诉它一个目标状态,它自己就会想办法去完成任务,相比起来自动化、智能化程度更高。 YAML是JSON的超集,支持整数...

  4Txe79BjyroE   2023年11月13日   19   0   0 YAML

首先你要知道,应用程序有很多类别的配置信息,但从数据安全的角度来看可以分成两类: 一类是明文配置,也就是不保密,可以任意查询修改,比如服务端口、运行参数、文件路径等等。 另一类则是机密配置,由于涉及敏感信息需要保密,不能随便查看,比如密码、密钥、证书等等。 这两类配置信息本质上都是字符串,只是由于安全性的原因,在存放和使用方面有些差异,所以Kubernetes也就定义了两个API对象,ConfigMap用来保存明文配置,Secret用来保存秘密配置。 因为在ConfigMap里的数据都是Key-Value结构,所以--from-literal参数需要使用k=v的形式。 把YAML样板文件修...

  4Txe79BjyroE   2023年11月13日   21   0   0 k8sConfigMap
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~