论文地址:https://www.usenix.org/conference/osdi16/technical-sessions/presentation/litton
论文官网:http://www.cs.umd.edu/projects/lwc/
参考资料:http://ytliu.info/blog/2016/12/15/sa-fan-na-xiao-zhen-shang-de-osdi2016/
  • 问题

进程间切换性能开销大:    
    OS中内存隔离、特权分离等必须运行在分离的进程中,但进程间切换和通信会导致内核调度、资源审计、上下文切换等开销。
     然而,实际上真正作用到硬件上的开销少得多:如果将TLB作为地址空间标记器,切换上下文只需要一个系统调用和加载CPU寄存器。
线程基本没有相互隔离的能力。

  • 解决方法

新的OS抽象——light-weight context(lwC)
与进程关系:进程内包含多个lwC,但是lwC的虚拟内存映射、文件描述符以及证书等资源独立,通过配置可共享。
与线程关系:
lwC与线程完全正交,不是可调度的实体。线程可以在lwC之间切换,切换的时可以原子地改变线程的虚拟内存映射、文件表项、权限、指令指针和栈指针。
多个线程也可以同时运行在同一个lwC中,lwC为每个线程保持状态来确保一个进入lwC的线程能够在它创建或上次切换出这个lwC的地点继续执行。
lwC适用于:高效的实现快照回滚、保护权限(通过证书限制)、会话隔离和区域保护(使用虚拟内存和资源映射)。

  • lwC的设计

lwC是进程里隔离、权限、运行状态的独立单元。每个lwC有自己的虚拟地址空间、页映射集合、绑定的文件描述符和证书等。lwC以文件描述符命名,每个进程初始有一个root lwC。

  • lwC API

lwCreate


用法:当lwC在当前进程中创建新的child lwC调用此方法。
实现:
与fork类似,child lwC一开始是parent lwC的拷贝,除描述符外其他均相同。
不同于fork的是,此操作不会创建新的线程,child lwC不会执行任何内容,直至线程切换到child lwC。
返回值:
parent lwC调用时,将child lwC的描述符返回(new)。
线程第一次切换到child lwC时,lwCreate返回调用此方法的lwC描述符(caller)和parent lwC的文件描述符(new)。
参数:通过设置resource-spec决定自身资源对child lwC的可见性。

lwSwitch


用法:当线程在不同的lwC之间的切换时调用此方法。
此方法会维护线程在从当前lwC切换时的状态,便于以后切换回来。
可以看做权限隔离的协同程序。

资源共享


静态方式中,lwCreate默认的规则是copy-on-write,该规则可以通过参数resource-spec修改。
动态规则定义,通过另外一个接口lwOverlay中resource-spec参数进行定义。

系统调用——lwSyscall


用法:parent lwC可以通过lwSyscall来定义child lwC的系统调用规则,如可以通过LWC_SYSTRAP flag来对子lwC中的某些系统调用进行拦截。
在lwC C内的线程发起系统调用时,如果C不具有执行此系统调用的能力,可以切换到C的parent lwC,parent lwC选择代替child lwC执行或者拒绝。

lwRestrict
限制lwC的权限。
lwOverlay
引入其他lwC授予当前lwC的新的资源。
信号机制
SIGSEGV和SIGFPE可指派的信号传送给引发信号的lwC。
SIGKILL和SIGUSR1等不可指派的信号则传送给进程中root lwC和以LWC_SHARESIGNALS为参数创建的lwC。
fork系统调用
fork创建子进程时,任意被标记为MAP_SHARE的内存区域可以在父子进程中对应lwCs共享,这是跨进程的共享。

lwC隔离
每个lwC没有互相访问其他lwC的内存状态、文件描述符等的权限,这可以实现进程内的权限隔离。
lwC安全
Threat model:child lwC创建时,parent lwC有对child lwC的所有权限,且不会授予child lwC多余的权限,同时假设parent lwC不会被劫持;lwC的API不允许进程内lwC的通信。
Security properties:进程内的lwC不会有比进程更多的权限,任意lwC也不会比进程有更弱的机密性和完整性(confidentiality and integrity)。

  • lwC的使用场景——Snapshots

以下例子用于在Apache web server中实现在处理完每个session后,回滚至之前的快照。

在处理request前执行12行snapshot(),此时执行第三行,返回快照句柄snap;处理完request后,执行14行的rollback(snap)的lwSwitch切换到lwC快展,从而执行至第2行,然后跳转至第6行,此时caller为原来的lwC,关闭原来的lwC,执行snapshot()时会从第2行执行,并将结果返回到12行向下继续执行。

  • lwC的使用场景——session隔离

Nginx在仅有单线程的进程中通过事件驱动处理多个session,但是进程内的session之间没有隔离,此问题可通过lwC解决。

descriptors是用来监听client通信的socket描述符,file2lwc_map用于在当前lwC中设置socket fd的映射。
    当在lwC中处理新的描述符fd时,执行15行,在第18行创建新的lwC,并传递新的fd作为参数,然后设置fd映射。当接收到对之前fd的请求时,执行至24行,执行lwSwitch时,依次执行18、22行,在serve_request中处理请求。

  • lwC的使用场景——敏感数据隔离

以下程序用于使私有签名秘钥仅对SIGN方法可见,对程序中其他方法不可见。使用的是动态资源共享的方法。此方法用于在OpenSSL库中长期持有秘钥。

程序在11行生成私钥privkey,在12行调用lwCreate创建child lwC,作为可以访问privkey的隔离的部分,parent lwC继续执行至16行,重置key,17行之后parent lwC中代码无法访问私钥。当需要使用私钥时,调用SIGN_CSTUB方法,创建lwC后第一次执行时至15行,调用SIGN_SSTUB方法。
    在SIGN_SSTUB中,通过lwOverlay的设置,保证第一次执行时调用SIGN获取私钥,然后切换到调用者的lwC,以后的每次调用都在第7行直接返回args的值。

  • lwC的使用场景——Reference Monitor

此方法用于实现在parent lwC中拦截child lwC(如web server)的所有系统调用,并对这些系统调用进行监控。

实现监控的是root lwC,在13行以LWC_SYSTRAP为参数创建child lwC,然后root lwC执行monitor()函数。Monitor函数中,在第2行切换到child lwC执行(child lwC执行的内容为第16行),当child lwC执行系统调用时切换回root lwC至第3行,当系统调用允许执行,则进入第5行,在child lwC内执行系统调用,将返回参数设置为out;当系统调用不被允许时,进入第9行,设置错误代码,然后切换回child lwC继续执行。

  • 实现

在FreeBSD 11.0内核中实现了lwC,表明在商用OS上高效实现lwC是可能的。在使用lwC来重构Apache和Nginx等大型应用软件的过程中,发现能够在现有代码的基础上以很小的代价来引入一些诸如回滚和安全数据隔离等新的功能。
    lwCreate和lwSwitch的实现主要是在fork子进程的方法基础上进行了改进。
    需要考虑的资源主要包括:内存管理、文件表、证书、lwC权限、lwC中多线程。

  • 评估

lwC switch:因为避免了同步和调度操作,lwC切换时间约为process和内核thread的一半;用户线程切换用时之所以比lwC短是因为FreeBSD中通过系统调用实现的。

lwC creation:在微型数据集(microbenchmarks)测试进程中创建和销毁lwC用时,当没有写页时,用时87.8微秒,标准差低于1%;在child lwC中有写页时,100个页用时397微秒,用时与页大小成正比,标准差低于7%。

Reference monitoring:将lwC实现的reference monitor(lwc-mon)和添加代码的Inline Monitoring(inline)、通过socket实现的进程隔离沙箱的Process Separation(procsep)比较,前者最优。

Apache:用lwC实现session隔离。lwC的实现相比fork进程性能好,而threads和prefork方法无法实现session隔离。

Nginx:用lwC实现session隔离,可以看出,使用lwc实现session隔离和reference monitor后,性能仅有微小的下降。

Isolating OpenSSL keys:秘钥保护功能,使用SSL handshakes进行评估,实验表明lwC对性能仅有微小的影响。
FCGI fast launch:本文使用快照功能来加速PHP启动,即在FCGI server中添加pagecache调用来允许使用之前的快照。

  • 结论

本文提出了一个新的OS抽象lwC,并在FreeBSD内核中实现,并基于lwC提供的新特性对大型商业应用进行了重构,现阶段的工作已经表明利用lwC来实现某些很有价值的功能是可行的。

  • 认识

本文主要是在线程和进程之间增加了一层,思想新颖。将基本的API用于session隔离、reference monitor等有价值的工作,实现过程中工程性的工作量大。

Light-weight Contexts An OS Abstraction for Safety and Performance(OSDI 2016) 论文学习相关推荐

  1. linux C语言多线程 轻进程 LWP:Light Weight Process

    参考文章:linux 线程的绑定 PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的) 后更...

  2. linux中文入门,Ylmf OS 4.0 - 最适合国人使用和入门学习的中文Linux操作系统 (免费开源)...

    系统工具 - Linux // 2009-12-28 ] 雨林木风修改的 Windows XP 在国内可以说是相当的著名了!但由于版权问题,最终它们"解散"了.而一年后的今天,在 ...

  3. OS / 线程的 3 种实现方式(内核级,用户级 和 混合型)

    1 .线程的 3 种实现方式 在传统的操作系统中,拥有资源和独立调度的基本单位都是进程.在引入线程的操作系统中,线程是独立调度的基本单位,进程是资源拥有的基本单位.在同一进程中,线程的切换不会引起进程 ...

  4. 考研OS备考|计算机操作系统|汤小丹慕课版|课后习题答案|复试拓展

    本文主要是考研复试备考自用,所以课后习题答案主要是简答题部分,此外还有其他的简答补充.如果发现有误,欢迎在评论区或者私信指出. 计算机操作系统|汤小丹慕课版|课后习题答案|考研备考 第1章 操作系统引 ...

  5. light4java_Light Weight Component Library for Java

    2008年3月27日 Android操作系统上的一个资源管理器程序,类似Windows上的资源管理器,它具备对Android上文件系统进行层次浏览.明细展示.文件管理的能力. 由于Android主要应 ...

  6. 基于Contiki OS的智能led照明:LIFX

    最近接触了LED智能照明,但是大部分智能LED是使用私有协议或是类似Zigbee这样的协议进行组网和数据传输,这就造成除了每个灯节点外,还需要一个网关来连接节点和网络,包括飞利浦的HUE也是这样.Ph ...

  7. python os模块详细用法

    os 模块提供了非常丰富的方法用来处理文件和目录 os关于目录路径的方法 # 获取当前路径 path = os.getcwd()# 获取当前绝对路径 os.path.abspath(path)# 创建 ...

  8. Python基础-os模块 sys模块

    sys模块 与操作系统交互的一个接口 文件夹相关 os.makedirs('dirname1/dirname2')    可生成多层递归目录 os.removedirs('dirname1')    ...

  9. python os.environ windows_python 获取系统环境变量 os.environ and os.putenv

    从一段code说起 "if "BATCH_CONFIG_INI" in os.environ:" 判断环境变量的值有没有定义 如果定义的话就去环境变量的值,否则 ...

最新文章

  1. mysql 一键获取数据库表结构
  2. 图灵赠书——程序员12月书讯
  3. 基于SSM实现个人博客系统
  4. Nachos3.4系列-1 安装与环境配置 【转】
  5. Android Studio 新建项目的R文件丢失的解决方法
  6. Nginx服务器搭建和基本配置详解
  7. DHCP和DNS的概念—Vecloud微云
  8. oracle查询 :一个角色包括的系统权限,对象权限,Oracle有多少种角色,某个用户有什么角色
  9. Perl学习之四:语句(续)
  10. python词云安装什么库_python词云安装什么库
  11. 教你10分钟搭建酷炫的个人博客
  12. Design Patterns
  13. 某LINUX平台,消息队列导致崩溃
  14. 在virtualbox安装xp系统及安装oracle
  15. uVision2项目实践:HelloWorld
  16. 计算机重启打印机无法使用,为什么打印机在电脑重启后就不能用了并且也无法添加?-win7添加打印机...
  17. WARNING: The converted filename is an ASM fully qualified filename.
  18. numpy相关介绍和基本操作
  19. Windows server 2019 安装VPN
  20. 【技术文档】centernet(姿态估计)

热门文章

  1. 基于NRC词典的情感分析(含多种离散情绪)——python
  2. 重庆大学计算机学院刘然,刘然-重庆大学微电子与通信工程学院
  3. Fontconfig error: failed reading config file解决
  4. UX/UI设计师海外面试心得记录-Linsimon
  5. 你还想花钱找别人装系统吗----那样你就out了------手把手教你玩转装系统-------想装系统的看过来-----欢迎随时沟通交流
  6. MATLAB读取一张RGB图片转成YUV420格式、YUV422格式、YUV444格式
  7. Android[游戏,弹力球,弹弹球],自定义[游戏]控件
  8. 易智瑞与Esri北京研发中心的实质区别
  9. javaweb JAVA JSP停车场管理系统源码JSP停车收费系统JSP停车场管理 JSP停车场收费系统
  10. 设非零得实系数多项式 $f(x)$ (即系数都是实数得多项式)满足 $f(f(x)) = f^k(x)$,其中 $k$ 是给定得正整数。求多项式 $f(x)$