系统调用

【Linux】malloc 与共享内存原理区别

戏子无情 提交于 2019-12-14 01:15:06
本文主要分析内存以及I/O相关的系统调用和库函数的实现原理,根据原理给出在使用过程中需要注意的问题和优化的侧重点,本文涉及到的系统调用包括readahead,pread/pwrite,read/write,mmap,readv/writev,sendfile,fsync/fdatasync/msync,shmget,malloc。 本文先简单介绍应用程序对内存的使用以及I/O系统对内存的使用的基本原理,这对理解上述系统调用和库函数的实现有很大帮助。 1 内存管理基础 Linux对物理内存的管理是以页为单位的,通常页大小为4KB,Linux在初始化时为所有物理内存也分配了管理数据结构,管理所有物理页面。 每一个应用程序有独立的地址空间,当然这个地址是虚拟的,通过应用程序的页表可以把虚拟地址转化为实际的物理地址进行操作,虽然系统可以实现从虚拟地址到物理地址的转换,但并非应用程序的每一块虚拟内存都对应一块物理内存。Linux使用一种按需分配的策略为应用程序分配物理内存,这种按需分配是使用缺页异常实现的。比如一个应用程序动态分配了10MB的内存,这些内存在分配时只是在应用程序的虚拟内存区域管理结构中表示这一区间的地址已经被占用,内核此时并没有为之分配物理内存,而是在应用程序使用(读写)该内存区时,发现该内存地址对应得物理内存并不存在,此时产生缺页异常

安全容器在边缘计算场景下的实践

為{幸葍}努か 提交于 2019-12-12 18:04:19
导读: 随着云计算边界不断向边缘侧延展,传统 RunC 容器已无法满足用户对不可信、异构工作负载的运行安全诉求,边缘 Serverless、边缘服务网格等更是对容器安全隔离提出了严苛的要求。本文将介绍边缘计算场景如何构建安全运行时技术基座,以及安全容器在架构、网络、监控、日志、存储、以及 K8s API 兼容等方面的遇到的困难挑战和最佳实践。 正文: 本文主要分为四个部分,首先前两个部分会分别介绍一下ACK安全沙箱容器和边缘容器(Edge Kubernetes),这两个方向内容目前大部分人接触并不是很多。第三部着重分享安全沙箱容器在边缘这边的解决方案与实践经验,最后会介绍一下我们在安全容器方向新的探索和实践-可信/机密计算。 安全容器运行时 据 Gartner 预测,2019 年一半以上的企业会在其开发和生产环境中使用容器部署应用,容器技术日趋成熟稳定,然而在未容器化的企业或用户中,42% 以上的受访者表示容器安全成为其容器化的最大障碍之一,主要包括容器运行时安全、镜像安全和数据安全加密等。 端到端的云原生安全架构 在讲安全沙箱容器之前简单介绍下端到端云原生安全架构,主要分为三部分: 1.基础架构安全 基础架构安全依赖于云厂商或者是专有云一些基础设施安全能力,也包括 RAM认证,细粒度RAM授权,支持审计能力等等。 2.安全软件供应链 这部分包括镜像签名,镜像扫描,安全合规等等

Linux_UNIX编程手册-读书笔记-第四章(文件I/O:通用的I/O模型)

北战南征 提交于 2019-12-11 19:27:45
4.1 概述 所有执行I/O操作的系统调用都以文件描述符,一个非负数(通常是最小整数),来指代打开的文件。 针对每个进程,文件描述符都自成一套 应该就是每个进程相互之间文件描述符不冲突 在程序开始运行之前,shell代表程序打开这三个文件描述符:stdin,stdout,stderr. 这三个文件描述符默认指向shell运行所在终端。 四个主要的I/O系统调用: fd = open ( pathname , flags , mode ) ; numread = read ( fd , buffer , count ) ; numwritten = write ( fd , buffer , count ) ; status = close ( fd ) ; 4.2 通用I/O 看不懂 4.3 open flag:用于指定文件的访问模式 分为三类:文件访问模式标志,文件创建标志,已打开的文件标志(如下表) 其中,第一类不能同时使用。 mode:指定了文件的访问权限 如果open()调用成功,必须保证其返回值为进程未用文件描述符中数值最小者。 如果在close(STDIN_FILENO)后调用OPEN,则得到的fd为0. 4.4 read() 4.5 write() 4.6 close() 显式关闭不再需要的文件描述符往往是良好的编程习惯 4.7 lseek() 文件打开时

IO系统-基本知识

最后都变了- 提交于 2019-12-10 22:55:53
注:本文档主要整理了Linux下IO系统的基本知识,是整理的网易云课堂的学习笔记,老师讲得很不错,链接如下: Linux IO系统 1.Linux操作系统的基本构成 内核:操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统;控制系统和硬件之间的相互通信;决定着系统的性能和稳定性。 shell:提供给用户界面的软件。 文件系统、应用程序 1.1 基本术语 1.文件和文件系统 文件:数据或设备的一种逻辑组织; 文件系统:文件间关系管理的一种逻辑组织。 2.程序和进程 程序:计算机执行的指令集合; 进程:程序的一个运行实例,操作系统资源分配的最小单位。 3.线程(轻量级进程) 程序运行的基本单位,一个进程内部可以有一个或若干线程同时运行。 4.信号 Linux系统中进程通信的一种技术,异步程序设计的基础。 5.客户端和服务器 2 启动流程 芯片和部分外围电路的初始化 加载内核 加载最小文件系统 加载硬盘上的根文件系统 启动1号进程/sbin/init bootloader:就是在操作系统内核运行之前运行的一段小程序,主要功能有:初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。它是严重依赖于硬件,在嵌入式开发中建立一个通用的bootloader几乎是不可能的。在Linux中称为grub。

sendfile机制学习(转)

橙三吉。 提交于 2019-12-10 19:35:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码: read(file, tmp_buf, len); write(socket, tmp_buf, len); 以上两行代码是传统的read/write方式进行文件到socket的传输。 当需要 对一个文件进行传输的时候,其具体流程细节如下: 1、调用read函数,文件数据被copy到内核缓冲区 2、read函数返回,文件数据从内核缓冲区copy到用户缓冲区 3、write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。 4、数据从socket缓冲区copy到相关协议引擎。 以上细节是传统read/write方式进行网络文件传输的方式,我们可以看到,在这个过程当中,文件数据实际上是经过了四次copy操作: 硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎 而sendfile系统调用则提供了一种减少以上多次copy,提升文件传输性能的方法。Sendfile系统调用是在2.1版本内核时引进的: sendfile(socket, file, len); 运行流程如下: 1、sendfile系统调用,文件数据被copy至内核缓冲区 2