进程、线程和协程之间的区别和联系
进程、线程和协程之间的区别和联系一、进程 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。 【进程间通信(IPC)】: 管道(Pipe)、命名管道(FIFO)、消息队列(Message Queue) 、信号量(Semaphore) 、共享内存(Shared Memory);套接字(Socket)。 二、线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。 三、进程和线程的区别与联系【区别】: 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位; 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行; 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统...
进程间的通信⽅式有哪些?区别是什么,为什么需要?
进程间的通信⽅式有哪些?区别是什么,为什么需要?导图有笔记 https://www.processon.com/view/link/60ef10dae0b34d06fba96f3d 进程的通信有 6 种,分别是:管道、消息队列、共享内存、信号量、socket,信号。 他们的区别,有哪些应⽤,为什么需要这些? 管道匿名管道: Linux 命名的估计都懂这条语句的含义,其中”|“是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。并且这种通信方式是**单向**的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要互相通信的话,那么需要创建两个管道。 命名****管道: 下面我们来创建一个命名管道。 执行之后会卡住 在另一个进程里面执行输出管道内容就可以了 从上面的例子可以看出,管道的通知机制类似于缓存,就像一个进程把数据放在某个...
迭代器模式Iterator
定义迭代器的接口,以及对应的hasNext以及next方法 注意定义的时候使用泛型,不然接口方法的返回值只能是Object,实际使用的时候还需要强制转换 在被迭代的接口里面定义获取迭代器的方法 注意使用泛型 在需要被迭代的对象里面实现一个具体迭代器,专属于这个对象的迭代器以及对应的迭代方法,每一个对象的迭代遍历的方法应该是不一样 注意实现被迭代接口的时候标注的泛型依旧是被迭代对象 public class MyArrayList<E> implements MyCollection<E> 实现(注意适应泛型)定义迭代器的抽象方法1234567891011package com.deltaqin.designPattern.d06_iterator;/** * @author deltaqin * @date 2021/3/27 10:38 上午 */public interface MyIterator<T> { boolean hasNext(); T next();} 定义集合的抽象方法12...
适配器_转换器模式adapter
Target(目标接口):所需要转换的所期待的接口 Adaptee(源角色):需要适配的接口 Adapter(适配器):将原接口适配成目标接口,继承原接口,实现目标接口 一些流处理器是对其它类型的流源的适配。这就是适配器模式的应用 FutureTask接收Runnabel转换为Callable 使用的是Executors 里面的RunnableAdapter 自己有Runnable属性,自己还实现了Callable接口。在call里面调用了run方法,实现适配、 传进去Runnable,拿到一个Callable来使用 [Input/Output]Stream[Reader/Writer]流InputStreamReader实现了Reader接口,并持有了InputStream的引用,这里是通过StreamDecoder类间接持有的,因为从byte到char要经过解码。 适配器就是InputStreamReader类, 源角色就是InputStream代表的实例对象, 目标接口就是Reader类了。 I/O类库中还有很多类似的用法,如Stri...
通过一台服务器采集所有阿里云账单费用数据
费用视图预览 安装部署 说明:示例 Linux 版本为:CentOS Linux release 7.8.2003 (Core)通过一台服务器采集所有阿里云账单费用数据 前置条件 服务器 <安装 Datakit> 服务器 <安装 Func 携带版> 阿里云 RAM 访问控制账号授权 RAM 访问控制 登录 RAM 控制台 https://ram.console.aliyun.com/users 新建用户:人员管理 - 用户 - 创建用户 保存或下载 AccessKeyID 和 AccessKey Secret 的 CSV 文件 (配置文件会用到) 用户授权(账单权限) 配置实施 登录 Func,地址 http://ip:8088(默认 admin/admin) 输入标题/描述信息 编辑脚本 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616...
远程仓库操作
git clone远程仓库: git clone 远程使用虚线表示 本地仓库多了一个名为 o/master 的分支, 这种类型的分支就叫远程分支。远程分支反映了远程仓库(在你上次和它通信时)的状态。 远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。 为什么有 o/?远程分支有一个命名规范 —— 它们的格式是: <remote name>/<branch name> 因此,如果你看到一个名为 o/master 的分支,那么这个分支就叫 master,远程仓库的名称就是 o。 大多数的开发人员会将它们主要的远程仓库命名为 origin,并不是 o。这是因为当你用 git clone 某个仓库时,Git 已经帮你把远程仓库的名称设置为 origin 了不过 origin 对于我们的 UI 来说太长了,因此不得不使用简写 o :) 但是要记住, 当你使用真正的 Git 时, 你的...
雪花算法
原文连接: https://blog.csdn.net/lq18050010830/article/details/89845790 SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的 这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号 1 bit:是不用的,为啥呢?因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。 41 bit:表示的是时间戳,单位是毫秒。41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。 10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^1...
阻塞、非阻塞、同步、异步的区别是什么?
同步异步描述的是被调用方。阻塞非阻塞描述的是调用方。二者没有必然联系。 阻塞是调用方A发出命令后,必须等待B返回结果。非阻塞是调用方A发出命令后,A不需要等待B,可以做自己的事情。 同步是B收到A的指令之后会立即执行,A可以得到结果。异步是B收到A的指令之后不会立即执行要做的事情,A的本次调用不会得到结果,但是B执行完要做的事情之后会通知A。 我们常常混淆的同步异步、阻塞非阻塞其实是放在特定场景下的,不能一概而论,IO也分为磁盘IO和网络IO。这里所讲的IO一般指网络IO。 阻塞IO和非阻塞IO:指的是socket编程中发起read函数系统调用读取数据后是否阻塞住 如果一直等待到有数据才返回,这个read就是阻塞的,也是同步的 如果没有数据就返回-1而不是等待,这个read就是非阻塞的,也是同步的 同步IO和异步IO:指的操作系统内核是否自动将数据从内核空间拷贝到用户空间 如果需要read函数自己将数据拷贝到用户空间就是同步IO 如果内核自动将数据拷贝到用户空间,并且通知用户,就是异步IO(一般在Linux上用的少,windows有完整实现) 同步执行和异步执行:指...
项目编译打包部署最佳实践
运行的环境使用 JVM 参数方式,而不是写死在配置文件里面的: 打包jar 的Maven 编译插件需要指定对应的 finalName,就是生成的 jar 的名字: 打包的时候避免使用测试用例
设计模式、设计原则、重构与编码规范(设计模式之美笔记)
设计模式要干的事情就是对复杂解耦。利用更好的代码结构将一大坨代码拆分成职责更单一的小类,让其满足高内聚低耦合等特性。 创建型模式是将创建和使用代码解耦,结构型模式是将不同的功能代码解耦,行为型模式是将不同的行为代码解耦。 而解耦的主要目的是应对代码的复杂性。设计模式就是为了解决复杂代码问题而产生的。 为什么设计模式? 面试会问 提高复杂代码的设计和开发能力。避免只是框架用的溜。 如何分层、分模块、分类 每个类应该有哪些属性和方法 怎么设计类之间的交互,用继承还是组合 使用接口还是抽象类,怎么做到解耦、高内聚和低耦合 该用单例模式还是静态方法 用工厂模式创建对象还是直接new出来 如何避免使用了设计模式提高扩展性的同时降低了可读性 告别写被人吐槽的烂代码,团队里面的代码标杆,不经意间写出来的代码,都能作为同事学习、临摹的范例。 读源码的时候根据设计模式推测作者的思路,做到事半功倍。 如何评价代码质量的好坏?即使一段代码的可扩展性很好,但可读性很差,那我们也不能说这段代码质量高。常见的评价指标: 可维护性:分层清晰、模块化好、高内聚低耦合、遵从基于接口而非实现编程的设...
