进程调度

一、Kubernetes系列之介绍篇

风格不统一 提交于 2019-12-16 21:13:14
•Kubernetes介绍 1.背景介绍   云计算飞速发展     - IaaS     - PaaS     - SaaS   Docker技术突飞猛进     - 一次构建,到处运行     - 容器的快速轻量     - 完整的生态环境 2.什么是kubernetes   首先,他是一个 全新的基于容器技术的分布式架构领先方案 。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。   Kubernetes是一个完备的分布式系统支撑平台, 具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力 。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。 Kubernetes中,Service是分布式集群架构的核心,一个Service对象拥有如下关键特征: 拥有一个唯一指定的名字 拥有一个虚拟IP(Cluster IP、Service IP、或VIP)和端口号 能够体统某种远程服务能力

操作系统(三)

巧了我就是萌 提交于 2019-12-14 23:32:31
title: 操作系统(三) date: 2019-12-13 16:28:30 categories: 操作系统 tags: 11. 进程高级通信的主要方式 共享存储器系统 互相通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信 管道通信系统 “管道”是用于连接一个读进程和一个写入进程以实现他们之间的通信的一个共享文件。 输入进程 ——> 数据 ——> 管道 | ——> 数据 ——> 接收进程 消息传递系统 以格式化的(Message) 消息 为单位,将通信的数据封装在消息中,并利用操作系统提供的一组通信命令,在进程间进行消息传递 直接通信 发送进程利用OS通过的发送命令,直接发送消息给目标进程 间接通信 通过某个中间实体进行消息传递。 信箱通信 (数据结构) 信箱头 存放有关信箱的描述 信箱体 存放若干消息的信箱格组成,数目与大小在创建信箱时确定 客户机-服务器系统 套接字(Socket) 一个通信标识类型的数据结构 通信目的地址 通信使用的端口号 通信网络的传输层协议 进程所在的网络地址 针对客户或服务器程序提供的不同系统调用(API函数) 远程过程调用和远程方法调用 过程调用 通信协议 该协议允许一台主机系统上的进程调用另一台主机系统上的进程,而对程序员表现为常规的过程调用 两个进程: 本地客户进程 、远程服务器进程 统称为 网络守护进程 12.

Unix / Linux 线程的实质

天涯浪子 提交于 2019-12-13 01:15:49
Unix / Linux 线程的实质 线程与进程的比较 概述: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。 区别: 进 程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个 进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序 健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 简而言之,一个程序至少有一个进程,一个进程至少有一个线程

linux性能调优总结

断了今生、忘了曾经 提交于 2019-12-12 14:42:08
系统性能一直是个热门话题。做运维这几年也一直在搞性能调优,写这个文章也算是对工作的总结。 讲调优第一步是,要讲为什么要调优?也就是系统分析,分析还需要有指标,做好性能监控的情况下,看到确实需要调优才能进行。不能为了调优而 “调优“ 那不是调优,那是破坏。 性能分析的目的 找出系统性能瓶颈 为以后的优化提供方案或者参考 达到良好利用资源的目的。硬件资源和软件配置。 影响性能的因素 想确定有哪些因素,首先确定你的应用是什么类型的? 例如: cpu密集型 例如web服务器像nginx node.js需要CPU进行批处理和数学计算都属于此类型 io密集型 例如数据库常见的mysql,大量消耗内存和存储系统,对CPU和网络要求不高,这种应用使用CPU来发起IO请求,然后进入sleep状态。 确定了应用类型就开始分析有哪些情况能影响性能: 大量的网页请求会填满运行队列、大量的上下文切换,中断 大量的磁盘些请求 网卡大量的吞吐 以及内存耗尽等。。 归结起来就是4个方面 cpu memory i/o network 系统检测的工具 我们知道了这四大块影响着我们的性能,那我们有什么工具进行检测呢? 系统调优.png-341.3kB 上图时某国外大神总结的。 我个人在工作中常用到的有: htop vmstat iotop sar strace iftop ss lsof ethtool mtr等

浅谈Linux进程调度过程

本秂侑毒 提交于 2019-12-09 21:52:41
在操作系统运行过程中,由于CPU bound和I/O bound,进行进程的调度自然是常事。进行进程调度时,操作系统使用某些特定算法(如FIFO、SCBF、轮转法等)在进程队列中选出一个进程作为下一个运行的进程,调用schedule。进行进程调用的时机有以下几种: 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(); 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度; 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。 相对于可以高风亮节主动让出系统资源的内核态进程,用户态进程只能接受被动调度。而被动调度分为抢占式调度和强制调度。 schedule函数进行调度时,首先选择一个新的进程来运行,然后调用context_switch进行上下文的切换,这个宏又调用switch_to进行关键上下文的切换。 next = pick_next_task(rq, prev);//进程调度算法都封装这个函数内部 context_switch(rq, prev, next);//进程上下文切换 switch_to利用了prev和next两个参数

spinlock与linux内核调度的关系

烈酒焚心 提交于 2019-12-09 20:22:18
作者: 刘洪涛, 华清远见嵌入式学院 高级讲师,ARM公司授权ATC讲师。 关于自旋锁用法介绍的文章,已经有很多,但有些细节的地方点的还不够透。我这里就把我个人认为大家容易有疑问的地方拿出来讨论一下。 一、自旋锁(spinlock)简介 自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。 二、信号量简介 这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。 Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。 三、自旋锁和信号量对比 在很多地方自旋锁和信号量可以选择任何一个使用,但也有一些地方只能选择某一种。下面对比一些两者的用法。 表1-1自旋锁和信号量对比 应用场合 信号量or 自旋锁 低开销加锁(临界区执行时间较快) 优先选择 自旋锁 低开销加锁(临界区执行时间较长) 优先选择 信号量 临界区可能包含引起睡眠的代码 不能选自旋锁,可以选择 信号量 临界区位于非进程上下文时,此时不能睡眠 优先选择 自旋锁 ,即使选择信号量也只能用 down_trylock 非阻塞的方式

Java与线程

烂漫一生 提交于 2019-12-09 13:28:46
  线程是比进程更轻量级的调度执行单位,线程的引入可以把一个进程的资源分配和执行调度分开,各个线程可以共享进程资源,又可以独立调度。   每个已经执行start()方法且还未结束的java.lang.Thread类的实例就代表了一个线程。 1.线程的实现(三种): 使用内核线程实现、使用用户线程实现、使用用户线程加轻量级进程混合实现    1)使用内核线程实现(一对一线程模型): 内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。程序一般不会直接使用内核线程,而是去使用它的一种高级接口——轻量级进程,即线程;只有先支持内核线程,才能有轻量级进程。但轻量级进程具有它的局限性:首先,由于是基于内核线程实现的,所以各种线程操作都需要进行系统调用,而系统调用代价较高,需要在用户态和内核态之间来回切换。轻量级进程要消耗一定的内核资源,因此一个系统支持的轻量级进程的数量是有限的。    2)使用用户线程实现(一对多线程模型): 从广义上,一个线程只要不是内核线程,就可以认为是用户线程。从狭义上,用户线程是指完全建立在用户空间的线程库上,系统内核不能感知线程存在的实现。用户线程的建立、同步、销毁和调度完全在用户台中完成,不需要内核的帮助。使用用户线程的优势在于不需要系统内核支援

线程绑定CPU核

喜欢而已 提交于 2019-12-07 21:36:57
简单地说, CPU 亲和性(affinity) 就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。 2.6 版本的 Linux 内核还包含了一种机制,它让开发人员可以编程实现 硬 CPU 亲和性(affinity) 。这意味着应用程序可以显式地指定进程在哪个(或哪些)处理器上运行。 1 概念 什么是 CPU Affinity ? Affinity 是进程的一个属性,这个属性指明了进程调度器能够把这个进程调度到哪些 CPU 上。 在 Linux 中,我们可以利用 CPU affinity 把一个或多个进程绑定到一个或多个 CPU 上。 CPU Affinity 分为 2 种, soft affinity 和 hard affinity 。 soft affinity 仅是一个建议,如果不可避免,调度器还是会把进程调度到其它的 CPU 上。 hard affinity 是调度器必须遵守的规则。 为什么需要 CPU 绑定? ●增加 CPU 缓存的命中率 CPU 之间是不共享缓存的,如果进程频繁的在各个 CPU 间进行切换,需要不断的使旧 CPU 的 cache

Kubernetes核心原理笔记

杀马特。学长 韩版系。学妹 提交于 2019-12-07 16:20:29
                  kubernetes权威指南阅读笔记 笔记来自kubernetes权威指南,如需更详细的教程还请阅读原书,笔记只记录相关重要知识点,当然一下总结也包含一些自己的总结,有异议可以留言交流 Kubernetes API Server原理分析:   1.Kubernetes API Server通过一个进程名为kube-apiserver的进程提供服务,默认进程在本机端口(--insecure-port)提供REST 服务,同时通过HTTPS安全端口(--secure-port=6443)来启动安全机制   2.如果只想对外提供部分REST服务,则可以在master或者其他任何节点通过运行kubectl proxy进程启动一个内部代理实现,支持 --reject-paths、--accept=hosts 限制访问路径和访问来源   3.Kubernetes API Server最主要的REST接口是资源对象的 增、删、改、查 ,除此之外,它还提供了一类特殊的REST接口——Kubernetes Proxy API 接口,这类接口的作用是代理请求,即Kubernetes API Server把收到的REST请求转发到某个Node上的kubelet守护进程的REST端口上,由kubelet进程负责响应,部分接口列表:/api/v1/proxy/nodes/

深入理解java虚拟机(23):java与多线程

倖福魔咒の 提交于 2019-12-06 12:33:47
线程有以下三种实现方式 1、使用内核线程方式实现,优点内核完成线程切换和操纵调度器进行调度,并且负责将线程任务映射到处理器上。程序一般不使用内核线程会使用一种轻量级进程,轻量级进程与内核线程一对一模型如下图。 由于内核线程支持,一个轻量级进程在系统调用中阻塞了,不会影响进程继续工作。但是轻量级进程基于内核线程实现,所以创建、析构、同步都需要进行系统调用,系统调用的代价太高需要在用户态和内核态切换来去。其次轻量级进程都需要一个内核线程的支持,因此轻量级进程需要消耗一定的内核资源,因此一个系统可以支持的轻量级进程是有限的。 2、用户线程实现 完全建立在用户空间的线程。用户线程的创建、消毁、同步、调度完全在用户态中完成,不需要在内核态完成。优点非常快速且低消耗,也可以支持规模更大的数量,缺点没有内核线程的支援创建、切换和调度都是需要考虑的问题。操作系统只把资源分配给了进程,阻塞如何处理、多处理器系统如何将线程映射到处理器上会异常困难,甚至不可能完成 3、用户级线程和轻量级线程混合实现 用户线程创建还是建立在用户空间,因此用户线程的创建、析构、切换等操作依然廉价,所以可以支持大规模并发。操作系统提供支持的轻量级进程则用作用户线程和内核间的桥梁。这样可以使用内核线程的调度和处理器映射功能,并且系统调用通过轻量进程实现,大大降低整个进程阻塞的风险。 java的线程实现方式