kafka进阶篇:日志存储
介绍了Kafka日志存储相关的一些知识点,例如消息的具体存储格式、消息的检索以及消息的清理规则。
kafka基础篇:体系架构,生产者,消费者
介绍了kafka的体系架构、生产者与消费者的原理和使用方式。
synchronized与锁
Java 6 为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁“。在Java 6 以前,所有的锁都是”重量级“锁。所以在Java 6 及其以后,一个对象其实有四种锁状态,它们级别由低到高依次是:
无锁状态
偏向锁状态
轻量级锁状态
重量级锁状态
无锁就是没有对资源进行锁定,任何线程都可以尝试去修改它,无锁在这里不再细讲。
几种锁会随着竞争情况逐渐升级,锁的升级很容易发生,但是锁降级发生的条件会比较苛刻,锁降级发生在Stop The World期间,当JVM进入安全点的时候,会检查是否有闲置的锁,然后进行降级。
注意:不同于大部分文章说锁不能降级,实际上HotSpot JVM 是支持锁降级的,在这篇博文中提及。
首先需要明确的一点是:Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁。
还有一点需要注意的是,我们常听到的类锁其实也是对象锁。
Java类只有一个Class对象(可以有多个实例对象,多个实例共享这个Class对象),而Class对象也是特殊的Java对象。所以我们常说的类锁,其实就是Class对象的锁。
Java对象头前面我们提 ...
os:IO子系统
I/O分类三种常见的设备接口类型
字符设备:键鼠、串口等
块设备:磁盘驱动器、磁带驱动器、光驱等
网络设备:以太网、无线、蓝牙等
设备访问特征:
字符设备:以字节为单位顺序访问;I/O命令使用get()、put()等,通常使用文件访问接口和语义
块设备:均匀的数据块访问;I/O命令使用 原始I/O 或 文件系统接口 或 内存映射文件访问
网络设备:格式化报文交换;I/O命令使用send/receive网络报文,通过网络接口支持多种网络协议
同步与异步I/O:
阻塞I/O Wait
读数据时 进程进入等待状态 直到完成数据读出
写数据时 进程进入等待状态 直到设备完成数据写入处理
非阻塞I/O Don’t Wait(可能会失败 或者少写)
立即从read或write系统调用返回 返回值为成功传输的字节数
read或write的传输字节数可能为0
异步I/O Tell Me Later
读数据时 使用指针标记好用户缓冲区 立即返回 稍后内核将填充缓冲区并通知用户
写数据时 使用指针标记好用户缓冲区 立即返回 稍后内核将处理数据并通知用户
IO请求的流程:
用户发 ...
os_lab8:文件系统
课程主页:https://www.xuetangx.com/course/THU08091000267/5883104?channel=i.area.learn_title实验指导书:https://objectkuan.gitbooks.io/ucore-docs/content/github:https://github.com/chyyuu/ucore_os_lab (master 分支)
前置知识设备驱动程序、文件系统、虚拟文件系统。
改动点相比于 lab7 源代码,lab8 主要做了如下改动:
proc.h 扩展 struct proc_struct 成员属性
1234567891011121314151617181920212223struct proc_struct { ... // 同以往结构的属性 struct files_struct *filesp; // 当前进程的文件集信息};struct files_struct { struct inode *pwd; // 当前 ...
os:文件系统
文件系统概念文件系统和文件文件系统:操作系统中管理持久性数据的子系统,提供数据存储和访问功能
组织、检索、读写访问功能
大多数计算机系统都有文件系统
Google也是一个文件系统
文件:具有符号名,由字节序列构成的数据项集合。
文件系统的基本数据单位
文件名是文件的表示符号
文件系统的功能
分配文件磁盘空间
管理文件块(位置和顺序)
管理空闲空间(位置)
分配算法(策略)
管理文件集合:
定位:通过文件名定位文件并读取其内容
命名:对文件命名
文件系统结构:文件的组织方式
数据可靠和安全
可靠:持久保存文件,避免错误和崩溃
安全:多层次保护数据安全,减少攻击危害
文件的属性包括:名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间等
文件头:文件系统元数据中的文件信息
文件属性
文件存储位置和顺序
文件系统种类
磁盘文件系统:文件存储在数据存储设备上,如磁盘
例如FAT,NTFS,ext2/3,ISO9660
不同文件系统的安全要求不同,按照所需选取对应协议即可。
数据库文件系统:
文件特征是可被寻址(辨识)的
例如WinFS ...
os:死锁和进程通信
死锁死锁概念死锁是由于竞争资源或者通信关系,两个或更多线程在执行中出现的,永远相互等待只能由其他进程引发的事件 的状态。
我们使用进程和资源的关系来对死锁进行描述。系统中存在各种类型的资源(CPU执行时间、内存空间、I/O设备等),每类资源都可能有多个实例。
进程访问资源时,有如下流程:
请求/获取:申请空闲资源
使用/占用:进程占用资源
释放:资源状态由占用变成空闲
而资源可以分为如下两类:
可重用资源(Reusable):资源不能删除,互斥,可重用,比如处理器、I/O通道,主副存、文件、数据库、信号量等等,在各占一部分资源时会出现死锁
消耗资源(Consumable):资源创建和销毁,在I/O缓冲区的中断、信号、消息等,相互等待通信时可能死锁。
进程和资源之间的分配和占用可以用资源分配图表示,这是一个有向图,其中资源和进程间的分配和占用关系如下图所示:
出现死锁的必要条件:
互斥
任何时刻只能有一个进程使用一个资源实例
持有并等待
进程保持至少一个资源 并正在等待获取其他进程持有的资源
非抢占
资源只能在进程使用后自愿释放
循环等待
死锁和非死锁的资源分 ...
os_lab7:同步互斥
课程主页:https://www.xuetangx.com/course/THU08091000267/5883104?channel=i.area.learn_title实验指导书:https://objectkuan.gitbooks.io/ucore-docs/content/github:https://github.com/chyyuu/ucore_os_lab (master 分支)
前置知识临界区、信号量、条件变量、管程。
改动点相比于 lab6 源代码,lab7 主要做了如下改动:
sched.[ch] 增加定时器机制,用以实现 do_sleep() 功能
wait.[ch] 实现基于链表形式的等待队列
sem.[ch] 实现信号量机制
monitor.[ch] 实现基于管程的条件变量机制
练习零该练习用于了解定时器机制的实现流程。
为实现此机制,首先需要使用相关数据结构以表示定时器:
123456789// 表示定时器结构typedef struct { unsigned int expires; // 定时器的到期时间 (实际实现 ...
os:信号量
信号量概念信号量(Semaphore)是另一种临界区的保护机制,它是操作系统提供的一种协调共享资源访问的方法。它将资源纳入全局考虑,从操作系统的层面对资源进行宏观的调配。
这个机制由Dijkstra在20世纪60年代提出,是早期操作系统的主要同步机制。
信号量是一种抽象的数据结构:
由一个整型变量(sem)和两个原子操作组成
P() sem - 1 若 sem < 0 进入等待 否则继续
V() sem + 1 若 sem <= 0 唤醒一个等待进程
信号量中的整数sem就是这个系统资源剩余量。具体的实现接口P()和V(),分别是荷兰语中增加prolagg和减少verhoog的缩写。
信号量的具体实现伪代码(其中sem是剩余资源)
12345678910111213141516171819class Semaphore { int sem; WaitQueue q; // 等待队列}Semaphore::P(){ sem--; if (sem < 0) { Add thread t to q; block(p); ...
os:同步互斥
背景、问题和基本概念对于独立程序
不和其他程序共享资源
输入状态决定结果,具有确定性
可重现起始条件
在计算机科学中,再现性是指只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿地执行,还是“停停走走”地执行,都将获得相同的结果
调度顺序不重要
但对于并发进程来说,多个进程间有资源共享,可能会因为不同顺序出现相互的干扰。从而
产生不确定性
不可重现
未定义行为,程序错误是间歇性发生的
实际上我们又希望使用多进程并发执行,提升效率、实现协同、模块化设计等,所以我们需要使用一些方式来克服并发设计的坏处(例如,使用一些原子操作)。
原子操作(Atomic Operation)指一次不存在任何中断或者失败的操作,要么操作完成,要么没有执行,不会出现半途而废、部分执行的情况。
临界区进程的交互关系,根据相互感知程度的不同分为如下三种:
相互感知的程度
交互关系
进程间的影响
相互不感知
独立
一个进程的操作对于其他进程的结果没有影响
间接感知(双方都与第三方方交互,如共享资源 )
通过共享进行协作
一个进程的结果依赖于共享资源的状 ...