多生产者多消费者
多生产者多消费者1. 多生产者多消费者的概念多生产者多消费者是指有多个生产者和多个消费者,生产者和消费者之间通过一个缓冲区或队列进行通信。 2. 使用锁的多生产者多消费者 使用信号量 信号量是一个整型变量,可以对其执行两种操作:增加和减少。通常用于保护临界区资源。 信号量的值大于等于0时,表示可用资源的数量;小于0时,表示等待资源的进程数量。 信号量的操作有两种:P操作和V操作。 P操作:如果信号量的值大于0,就将其减1;如果信号量的值等于0,就将调用进程阻塞。 V操作:将信号量的值加1,如果有进程在等待资源,就唤醒其中一个。 使用互斥锁 3....
用户态进入内核态
用户态进入内核态在操作系统中,进程在运行过程中可能会从用户态(User Mode)切换到内核态(Kernel Mode),这种切换通常发生在以下情况下: 系统调用(System Call): 进程通过系统调用请求操作系统提供的服务或功能,如文件操作、网络通信、进程管理等。 当进程执行系统调用时,会触发从用户态切换到内核态,让操作系统内核来执行相应的系统调用服务。 异常(Exception): 异常是指在程序执行过程中发生的非正常事件,例如除零错误、访问非法内存、页错误等。 当进程发生异常时,CPU会暂停当前指令的执行,并切换到内核态,让操作系统内核来处理异常情况。 外部中断(External Interrupt): 外部中断是指由外部设备或信号引起的中断事件,例如硬件中断、定时器中断、输入输出设备中断等。 当外部中断发生时,CPU会暂停当前进程的执行,并切换到内核态,让操作系统内核来处理中断事件。 内部中断(Internal...
进程上下文切换开销
进程上下文切换开销1....
进程和线程
进程和线程1. 进程和线程的概念进程和线程是操作系统中的两个重要概念,用于管理程序的执行。进程是程序的一次执行过程,是程序在执行过程中分配和管理资源的基本单位。线程是进程中的一个执行单元,是操作系统调度的基本单位。 1.1 进程的虚拟地址空间表格: 虚拟地址空间 描述 代码段 存放程序的指令代码 数据段 存放程序的全局变量和静态变量 堆 存放动态分配的内存空间,由程序员管理 栈 存放函数的局部变量、函数参数、返回地址等信息 命令行参数 存放命令行参数和环境变量 环境变量 存放程序运行的环境变量 内核空间 用于操作系统内核的代码和数据 2. 进程和线程的区别 定义:进程是程序的一次执行过程,是程序在执行过程中分配和管理资源的基本单位。线程是进程中的一个执行单元,是操作系统调度的基本单位。 资源分配:进程拥有独立的地址空间、文件描述符、信号处理器等资源,线程共享进程的地址空间、文件描述符、信号处理器等资源。 3....
锁和优先级反转
锁和优先级反转当一个进程(比如进程p1)获得了一个资源的锁,然后由于中断或调度原因而让出CPU时,这个资源锁通常还是被进程p1所持有的,因为资源锁是在内核层级上进行管理和控制的。 具体来说,当进程p1获得资源锁时,内核会将这个信息记录在进程控制块(Process Control Block,PCB)或者类似的数据结构中。 优先级反转当一个进程(比如进程p1)获得了一个资源的锁,然后由于中断或调度原因而让出CPU,这时由于p2的优先级比p1高,p2会被调度执行,但是p2需要访问p1持有的资源,这时就会发生优先级反转。发生死锁。 优先级反转的解决方案 优先级继承:将低优先级的进程的优先级提升到高优先级的进程的优先级,直到低优先级的进程释放资源锁为止。 优先级调度:在调度时考虑进程的优先级,优先调度优先级高的进程。 注意创建新进程时,要继承父进程的运行优先级,而不是调度优先级,避免优先级反转。因为调度优先级是动态变化的,可能因为加锁被临时提升,而运行优先级是固定的。
死锁
死锁1. 死锁的概念死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 2. 死锁的必要条件 互斥条件:一个资源每次只能被一个进程使用 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放 不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系 3. 死锁的处理 预防死锁 破坏互斥条件, 例如共享资源,spooling技术,可以将打印机作为共享资源 破坏请求与保持条件, 一次性申请所有资源 破坏不剥夺条件, 资源可以被剥夺,使用trylock,如果获取不到资源,就释放已经获取的资源 破坏循环等待条件, 给资源编号, 按序申请 避免死锁 银行家算法: 安全状态和不安全状态 安全状态: 当前系统状态下, 存在一个安全序列, 使得每个进程都能顺利完成 不安全状态: 不存在安全序列 比如有5个进程, 3个资源, 进程1需要3个资源, 进程2需要2个资源, 进程3需要2个资源, 进程4需要1个资源,...
通信协议
通信协议串口通信串口通信的基本原理串口通信是一种通过串行通信接口进行数据传输的通信方式。串口通信是一种异步通信方式,通信双方通过一个共享的时钟信号来同步数据传输。串口通信的基本原理是通过串行通信接口将数据分割成一个个的数据包,然后通过串行通信接口将数据包发送到接收端,接收端再将数据包还原成原始数据。 特点: 全双工通信:串口通信是一种全双工通信方式,通信双方可以同时发送和接收数据。波特率:串口通信的速度是通过波特率来控制的,波特率越高,数据传输速度越快。单位是波特/秒。二进制下的波特率是指每秒钟传输的位数。 发送格式 起始位:逻辑0 数据位:数据位的个数是一个字节的数据位数,通常是8位,范围5-8位,先发低位 校验位:校验位是用来检验数据传输是否正确的,通常有奇校验和偶校验两种方式 停止位:停止位是用来标识数据传输结束的,通常有1位或2位 每次一字节完毕通过停止位分割,通过波特率区分连续1,校准,防止累计误差 I2C通信I2C(Inter-Integrated...
Java基础
Java基础接口和抽象类的共同点和区别 接口和抽象类都是不能被实例化的 接口和抽象类都可以被继承 接口和抽象类都可以包含抽象方法,抽象方法只有方法的声明,没有方法体 都可以有默认的方法实现 区别: 接口中的方法默认是public,抽象类中的方法可以是public、protected、default 接口中的变量默认是public static final,抽象类中的变量可以是public、protected、default 接口中不能有静态代码块,抽象类中可以有静态代码块 一个类只能继承一个抽象类,但是可以实现多个接口 接口中不能有构造方法,抽象类中可以有构造方法 接口中不能有静态方法,抽象类中可以有静态方法 接口主要用于定义类型,抽象类主要用于代码复用 字符串对象通过”+”连接的效率问题字符串对象通过”+”连接,实际上是通过StringBuilder的append方法实现的,所以效率比较高,但是如果在循环中使用”+”连接字符串,会创建很多StringBuilder对象,效率较低。 如果直接使用StringBuilder对象的append方法,效率会更高。 String...
面试题1
Java面试题1. Mysql联合索引和普通索引的区别 联合索引是将多个字段组合在一起创建索引,普通索引是单个字段创建索引 联合索引的查询效率高于普通索引,因为联合索引可以减少索引的数量,减少磁盘I/O次数 联合索引的字段顺序很重要,查询时必须按照索引字段的顺序查询,否则无法使用索引 联合索引的字段越多,索引的效率越低,因为索引的维护成本会增加 2. Mysql事务索引失效的原因 事务中的字段没有建立索引 事务中的字段使用了函数,导致索引失效 事务中的字段使用了运算符,导致索引失效 事务中的字段使用了类型转换,导致索引失效 事务中的字段使用了模糊查询,导致索引失效 事务中的字段使用了排序,导致索引失效 事务中的字段使用了范围查询,导致索引失效 事务中的字段使用了NULL值,导致索引失效 事务中的字段使用了OR条件,导致索引失效 3....
LinkedHashMap
LinkedHashMapLinkedHashMap的特点 LinkedHashMap继承自HashMap,底层是通过HashMap实现的,所以具有HashMap的特点 LinkedHashMap是有序的,可以按照插入顺序或者访问顺序进行排序 LinkedHashMap可以通过构造方法指定排序方式,有三种排序方式:插入顺序、访问顺序、自定义排序 LinkedHashMap的排序方式是通过维护一个双向链表实现的,所以插入和删除元素的效率比HashMap低 LinkedHashMap 在HashMap的基础上重写了afterNodeAccess、afterNodeInsertion、afterNodeRemoval方法,实现了有序的功能 LinkedHashMap如何实现LRU缓存public class LRUCache<K, V> extends LinkedHashMap<K, V> { private int capacity; public LRUCache(int capacity) { ...