上下文切换

聊聊线程技术与线程实现模型

我的未来我决定 提交于 2019-12-01 22:41:34
摘要 做多线程应用开发,对于线程的理解是非常重要的,我们要为我们创建的每一个线程负责。这篇文章主要聊聊操作系统线程相关的主题,在了解线程定义、用户态与内核态、模态切换、线程上下文切换的基础之上再对常见的三种线程模型进行进一步介绍,希望对大家能够有所帮助。 线程概论 线程定义 什么是线程?《POSIX Threads Programming》中有一段话对线程的定义进行描述: A thread is defined as an independent stream of instructions that can be scheduled to run as such by the operating system. 线程可以被认为是一个可以被独立调度的实体,这个实体共享进程的地址空间、文件描述符、代码和数据,且拥有自己私有的栈、寄存器上下文、和程序计数器。 为什么要线程 我们在github上面给开源项目提交代码的时候,按照comment格式都要写Motivation这部分,我们今天讨论线程这个存在,也要讨论线程为什么存在。 在很多应用中需要同时执行多个任务,这些任务大部分甚至全部都可以相互独立的并行的执行。比如一个网络代理,传统的实现是用一个进程作为监听器来监听网络端口,当有客户端连接进来的时候,当前进程将会fork一个新的进程来处理客户端的请求。这种体系结构不好的地方如下:

Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾

痞子三分冷 提交于 2019-12-01 01:05:50
Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾 【编者按】近日,Cyber Engineering Solutions Group 技术经理 Hasan Yasar 在 SEI 攥文盘点了当下流行的 DevOps 思想和工具,其中包括Fabric、Ansible、Docker、Chaos Monkey等。本文系 OneAPM 联合高效运维联合编译整理: 在2014年年底,SEI 博客发表了一系列有关 DevOps 的博客文章,提供指南,实用的建议和教程。这些帖子针对越来越多的采用 DevOps 的企业(2011年以来,高达26%)。根据最近的研究,这些组织部署变更代码比传统的方式快30倍。尽管 DevOps 的好处显而易见,但是许多企业仍不敢采用 DevOps,因为这需要转变心态、文化和技术要求,对于传统企业是非常大的挑战。鉴于这些障碍,CERT 研究人员的文章主要集中在介绍 Amazon和 Netflix DevOps 的成功案例,以及一些 DevOps 流行技术的教程,如 Fabric、Ansible 和 Docker 。这个帖子介绍了过去六个月,10个最流行的 DevOps 相关文章(根据访问次数排序)。 1. DevOps 技术:Fabric 与 Ansible 这篇博客文章 DevOps 技术:Fabric 与Ansible

flask 源码解析:上下文(一)

时光毁灭记忆、已成空白 提交于 2019-11-30 19:20:27
文章出处 https://www.cnblogs.com/jackchengcc/archive/2018/11/29/10025949.html 一:什么是上下文    每一段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行。你为了使他们运行,就要给所有的外部变量一个一个写一些值进去。这些值的集合就叫上下文。   在 flask 中,视图函数需要知道它执行情况的请求信息(请求的 url,参数,方法等)以及应用信息(应用中初始化的数据库等),才能够正确运行。 最直观地做法是把这些信息封装成一个对象,作为参数传递给视图函数 。但是这样的话,所有的视图函数都需要添加对应的参数,即使该函数内部并没有使用到它。flask 的做法是把这些信息作为类似全局变量的东西,视图函数需要的时候,可以使用 from flask import request 获取。 但是这些对象和全局变量不同的是——它们必须是动态的,因为在多线程或者多协程的情况下,每个线程或者协程获取的都是自己独特的对象,不会互相干扰。 二:实现过程    在python多线程中,有threading.local,可以实现多个线程访问某个变量时,每个线程只能看到自己的数据(flask上下文中,每个线程也只能访问自己请求所封装的数据),其内部原理大致为

Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC

那年仲夏 提交于 2019-11-28 14:00:44
Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性。 一、简单过程 Java程序运行的场所是内存,当在命令行下执行: java HelloWorld 命令的时候,JVM会将HelloWorld.class加载到内存中,并形成一个Class的对象HelloWorld.class。 其中的过程就是类加载过程: 1、寻找jre目录,寻找jvm.dll,并初始化JVM; 2、产生一个Bootstrap Loader(启动类加载器); 3、Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。 4、Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为Extended Loader。 5、最后由AppClass Loader加载HelloWorld类。 以上就是类加载的最一般的过程。 二、类加载器各自搜索的目录 为了弄清楚这个问题,首先还要看看System类的API doc文档。 1、Bootstrap Loader(启动类加载器):加载System