- Linux内核函数wait_event_interruptible的condition参数踩坑
六个九十度
驱动开发C/C++wait_queue等待队列
wait_event_interruptible简介wait_event_interruptible(以及wait_event打头的其他变体)是Linux的waitqueue机制提供的线程同步接口,它的定义如下#definewait_event_interruptible(wq,condition)\({\int__ret=0;\might_sleep();\if(!(condition))\__
- Linux串口驱动(4) - write详解
四季帆
#ttydriveruartLinux
0.前言经过前面三个部分的初始化,后面的操作就是直接使用前面的配置了。1.用户空间write的操作实现tty_write-->ld=tty_ldisc_ref_wait(tty);-->wait_event(tty_ldisc_wait,(ld=tty_ldisc_try(tty))!=NULL);//tty_ldisc_wait等待队列一直等待直到等待的条件成立,所以接下来的关键要看tty_ld
- 同步与互斥linux系统,Linux系统驱动同步与互斥的处理——深圳培训linux
能睡
同步与互斥linux系统
Linux系统驱动无法同步怎么办?Linux系统驱动出现互斥应该如何是好?授人以鱼,不如授人以渔,本文讲述的是解决Linux系统驱动同步与互斥的方法,希望可以教会你这种方法,能给你提供到帮助。事件等待队列一般用于linux驱动的异步通信,也可以叫做申请设备使用权等待队列。当多个进程去操作一个设备时,这个时候一般要用到事件队列。1、不可中断睡眠:wait_event(queue,condition)
- wait_event-wake_up中间用一个atomic_t来作为唤醒的cond到底安不安全
杨枫mind
1.从时序上讲,atomic_t可以保障wait_event在醒来的cond判断的准确性,只要保证wake_up发生在对atomic写之后,而不需要dmb之类的屏障的2.但是还有有两个可怕的点在等待:2.1首先是atomic写语句被编译器优化到了wake_up之前,所以需要用一下barrier(),分断编译器优化,但这样并不是就可以高枕无忧了
- linux内核中等待队列(wait_event,wake_up...)
张鸷
Linux
根据内核3.1.6版本源码、书籍和网上资料,对几个函数进行分析介绍这几个函数,不得不先介绍等待队列wait_queue_head_t等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。等待队列(一)数据结构等待队列结构如下,因为每个等待队列都可以再中断时被修改,因此,在操作等待队列之前必须获得一个自旋锁。struct__wait_queue
- linux内核中等待队列 (函数wait_event与wake_up)
weixin_30361641
根据内核3.1.6版本源码、书籍和网上资料,对几个函数进行分析介绍这几个函数,不得不先介绍等待队列wait_queue_head_t与完成量completion。等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。完成量机制是基于等待队列的,内核利用该机制等待某一操作的结束。这两种经常被使用。一、等待队列(一)数据结构等待队列结构如下,因为
- _wait_event 具体实现过程
开心an
网络文摘
来自:http://www.linuxforum.net/forum/showthreaded.php?Board=linuxK&Number=572220是不是当前进程要等待某个condition,然后就把它加到这个等待这个condition的wq中_wait_event是当前进程调用它,也就是在宏DEFINE_WAIT(_wait)中的_wait就是把当前进程设置成_wait加到等待队列里,以
- 高级字符设备驱动操作(wait_event/poll/访问控制)
花一样的阿衰
Linux驱动
wait_event阻塞指的是当执行操作的时候,如果条件未满足,则挂起线程直至条件满足之后在进行操作,被挂起的线程进入睡眠状态。当一个进程被置为休眠状态的时候,它会被标记为一种特殊状态并且从运行队列中移除。直到某些情况下修改了这个状态,进程才会继续运行。休眠的进程会被搁置到一边,等待将来某个事件的发生。说明如何进入休眠状态前,请牢记两条规则:1、永远不要在原子上下文中进入休眠。2、当我们被唤醒时,
- PostgreSQL中的等待事件wait_event
运维yuanyuan
PostgreSQLpostgresql运维
PostgreSQL9.6版本开始,加入了wait_event特性。通过查阅pg_stat_activity中的wait_event_type和wait_event我们可以了解到每个sql进程“当前”更详细的执行状态,无论是对于异常定位排查,还是系统优化来说都更加方便了。这篇博文简单讨论下wait_event相关的原理。一、等待事件分类I.事件类型:共有9个分类,每一类都由不同事件组成/*----
- linux c++ epoll的简单实现
IT小狼狗
#include#include#include#include#include#include#include#include#include#include#include#defineOPEN_MAX100000intmain(){structepoll_eventevent;structepoll_event*wait_event;intsockfd=socket(AF_INET,SOCK
- PostgreSQL_96 pg_stat_activity
Enast
平时遇到数据库,查询慢,或者数据库故障问题,怎么办,可以看看数据库相关的一些状态视图,快速定位问题pg_stat_activity是postgrsql实例维护的一个进程相关的视图,是实时变化的。1、pg_stat_activity表(9.6版本之后pg_stat_activity视图的waiting字段被wait_event_type和wait_event字段取代,这两个字段分别代表等待事件的类型
- Java 程序员眼里的 Linux 内核 —— wait_event 源码分析
虾饺的开发手记
看Linux的wait_event源码时,联想到我们平时经常用得比较多的wait/notify、double-check和volatile,突然意识wait_event简简单单几行代码的背后,涉及的知识点其实非常丰富。本篇文章我们就一起了来探索它背后的知识,然后尝试着和我们的日常开发关联起来。wait_event这里使用Linux-2.6.24版本的源码背景在某些情况下,我们会需要等待某个事件,在
- Java 程序员眼里的 Linux 内核 —— wait_event 源码分析
初级程序员虾饺
JavaLinux
看Linux的wait_event源码时,联想到我们平时经常用得比较多的wait/notify、double-check和volatile,突然意识wait_event简简单单几行代码的背后,涉及的知识点其实非常丰富。本篇文章我们就一起了来探索它背后的知识,然后尝试着和我们的日常开发关联起来。wait_event这里使用Linux-2.6.24版本的源码背景在某些情况下,我们会需要等待某个事件,在
- wait_event族函数浅析
Q328333568
linuxlinuxschedulerLinuxwaitqueue
周末闲暇无事,聊聊内核中的wait_event*类函数的具体实现,等待事件必定涉及到某个条件,而这些函数的区别主要是等待后唤醒的方式……直奔主题,上源码wait_event_interruptible#definewait_event_interruptible(wq,condition)\({\int__ret=0;\if(!(condition))\__wait_event_interrupt
- Wait_Queue------等待队列的等待事件
小叶大孟
wait_event()宏:在等待会列中睡眠直到condition为真。在等待的期间,进程会被置为TASK_UNINTERRUPTIBLE进入睡眠,直到condition变量变为真。每次进程被唤醒的时候都会检查condition的值.wait_event_interruptible()函数:和wait_event()的区别是调用该宏在等待的过程中当前进程会被设置为TASK_INTERRUPTIBL
- linux内核中等待队列(wait_event,wake_up...)
fybon
kernel
from:http://blog.chinaunix.net/uid-27714502-id-3450323.html根据内核3.1.6版本源码、书籍和网上资料,对几个函数进行分析介绍这几个函数,不得不先介绍等待队列wait_queue_head_t等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。等待队列(一)数据结构等待队列结构如下,
- 等待队列和poll机制
君峰俊宇
linux等待队列poll机制
在Linux驱动程序中可以用等待队列来实现阻塞进程的唤醒,并能用等待队列来是实现内核中的异步事件通知机制。初始化等待队列: 利用宏:DECLARE_WAIT_QUEUE_HEAD(button_queue);//定义并初始化一个名为button_queue的等待队列(等待队列的定义和初始化有具体的函数,这个宏也是替换成或调用哪些函数)。等待事件:wait_event(queue);wai
- 等待队列和poll机制
君峰俊宇
Linux等待队列poll机制Linux驱动
在Linux驱动程序中可以用等待队列来实现阻塞进程的唤醒,并能用等待队列来是实现内核中的异步事件通知机制。初始化等待队列:利用宏:DECLARE_WAIT_QUEUE_HEAD(button_queue);//定义并初始化一个名为button_queue的等待队列(等待队列的定义和初始化有具体的函数,这个宏也是替换成或调用哪些函数)。等待事件:wait_event(queue);wait_even
- _wait_event 具体实现过程
event
作者:苗德行,华清远见嵌入式培训中心讲师。
#define __wait_event(wq, condition) do { DEFINE_WAIT(__wait);
for (;;) { &
- linux嵌入式系统驱动程序的阻塞与异步
linux
对于那些需要进程独占的设备,需要使用linux提供的阻塞编程。步骤如下:
1.在设备驱动程序中定义该设备的进程等待列多,并将其初始化
static wait_queue_head_t wait_queue;
init_waitqueue_head(&wait_queue);
2.在设备驱动程序的读操作中,调用函数wait_event 实现阻塞访问
int mix
- 解决minigui在nvr上不支持鼠标热拔插
GUI
好几个月之前遇到的问题,nvr上鼠标拔下来再插进去就失效了。调试了下发现,鼠标拔出后,在nvr上,out集并不置位,但设备文件没了。
因此在每次收到鼠标事件都判断下设备文件是否存在,如果不存在就关掉套接字,让minigui在wait_event中尝试重连。
把minigui源码中src/ial/native/native.c的331~339行,替换为if (kbddev == &kbd
- 阻塞型IO
CMQY
linux驱动
在linux中,一个等待队列通过一个“等待队列头(waitqueuehead)”来管理,等待队列头是一个类型为wait_queue_head_t的结构体,定义在中两种定义并初始化方法:DECLARE_WAIT_QUEUE_HEAD(name);wait_queue_head_tmy_queue;init_waitqueue_head(&my_queue);休眠宏:wait_event(queue,
- 阻塞型IO
CMQY
linux驱动ldd3阅读笔记
在linux中,一个等待队列通过一个“等待队列头(waitqueuehead)”来管理,等待队列头是一个类型为wait_queue_head_t的结构体,定义在中两种定义并初始化方法:DECLARE_WAIT_QUEUE_HEAD(name);wait_queue_head_tmy_queue;init_waitqueue_head(&my_queue);休眠宏:wait_event(queue,
- wait_event()函数集合详解
weiguozhihui
wait_event()函数集合
在对当前的运行的进程进行阻塞时经常会用到wait_event()这个函数,来看看linux内核中时如何实现wait_event()这个函数的。 先介绍几个宏定义函数: 1.#defineDEFINE_WAIT_FUNC(name,function)\ wait_queue_tname={ \ .private=current,\
- 竟然是它:# vi /etc/resolv.conf
conf
有数据库主机; 前端tomcat应用连接慢,开发人员本地pl/sql连接也超慢;
检查了系统i/o ,nethogs,top,检查了数据listener.ora,awr,wait_event,sql top
等等 ;
最终 竟然发现是 resolv.conf中
仅仅只配置了:
nameserver 8.8.8.8
添加了
names
- linux内核中等待队列 (函数wait_event与wake_up)
hktkfly6
根据内核3.1.6版本源码、书籍和网上资料,对几个函数进行分析 介绍这几个函数,不得不先介绍等待队列wait_queue_head_t与完成量completion。 等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。 完成量机制是基于等待队列的,内核利用该机制等待某一操作的结束。这两种经常被使用。一、等待队列
- linux同步机制之wait_event和wake_up
liuxd3000
linux系列
1.关于wait_event_interruptible()和wake_up()的使用 读一下wait_event_interruptible()的源码,不难发现这个函数先将 当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(), 而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue 队列中删除。从runqueu
- wait_event
u011279649
Linux中是怎样实现wait一个事件的?1】定义一个waitqueueheadstaticDECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);2】等待某个事件,当wakeupwaitqueue时判断这个事件,也就是condition:aCexpressionfortheeventtowaitforstructtty_ldisc*tty_ldisc_ref_wait(s
- linux内核中等待队列 (函数wait_event与wake_up)
bugouyonggan
linux内核等待队列
根据内核3.1.6版本源码、书籍和网上资料,对几个函数进行分析 介绍这几个函数,不得不先介绍等待队列wait_queue_head_t与完成量completion。 等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。 完成量机制是基于等待队列的,内核利用该机制等待某一操作的结束。这两种经常被使用。一、等待队列 (
- Linux阻塞控制 wait_event与wait_event_interruptible函数详解
wang2007ling
linux驱动wait_event
Linux阻塞控制wait_event与wait_event_interruptible函数详解最近研究了一下linux驱动对进程的阻塞与非阻塞的控制,感觉linux对进程的控制真的是牛逼,各种进程的状态都会有相应的控制方案来解决,开始慢慢感受到linux的博大精深了。1、 引入阻塞的必要性刚开始学习阻塞时一直都会有疑惑,为什么需要引入阻塞,同样是等待信号,将当前线程休眠,那信号量与wait_ev
- 戴尔笔记本win8系统改装win7系统
sophia天雪
win7戴尔改装系统win8
戴尔win8 系统改装win7 系统详述
第一步:使用U盘制作虚拟光驱:
1)下载安装UltraISO:注册码可以在网上搜索。
2)启动UltraISO,点击“文件”—》“打开”按钮,打开已经准备好的ISO镜像文
- BeanUtils.copyProperties使用笔记
bylijinnan
java
BeanUtils.copyProperties VS PropertyUtils.copyProperties
两者最大的区别是:
BeanUtils.copyProperties会进行类型转换,而PropertyUtils.copyProperties不会。
既然进行了类型转换,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProp
- MyEclipse中文乱码问题
0624chenhong
MyEclipse
一、设置新建常见文件的默认编码格式,也就是文件保存的格式。
在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致,即GBK。
在简体中文系统下,ANSI 编码代表 GBK编码;在日文操作系统下,ANSI 编码代表 JIS 编码。
Window-->Preferences-->General -
- 发送邮件
不懂事的小屁孩
send email
import org.apache.commons.mail.EmailAttachment;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.MultiPartEmail;
- 动画合集
换个号韩国红果果
htmlcss
动画 指一种样式变为另一种样式 keyframes应当始终定义0 100 过程
1 transition 制作鼠标滑过图片时的放大效果
css
.wrap{
width: 340px;height: 340px;
position: absolute;
top: 30%;
left: 20%;
overflow: hidden;
bor
- 网络最常见的攻击方式竟然是SQL注入
蓝儿唯美
sql注入
NTT研究表明,尽管SQL注入(SQLi)型攻击记录详尽且为人熟知,但目前网络应用程序仍然是SQLi攻击的重灾区。
信息安全和风险管理公司NTTCom Security发布的《2015全球智能威胁风险报告》表明,目前黑客攻击网络应用程序方式中最流行的,要数SQLi攻击。报告对去年发生的60亿攻击 行为进行分析,指出SQLi攻击是最常见的网络应用程序攻击方式。全球网络应用程序攻击中,SQLi攻击占
- java笔记2
a-john
java
类的封装:
1,java中,对象就是一个封装体。封装是把对象的属性和服务结合成一个独立的的单位。并尽可能隐藏对象的内部细节(尤其是私有数据)
2,目的:使对象以外的部分不能随意存取对象的内部数据(如属性),从而使软件错误能够局部化,减少差错和排错的难度。
3,简单来说,“隐藏属性、方法或实现细节的过程”称为——封装。
4,封装的特性:
4.1设置
- [Andengine]Error:can't creat bitmap form path “gfx/xxx.xxx”
aijuans
学习Android遇到的错误
最开始遇到这个错误是很早以前了,以前也没注意,只当是一个不理解的bug,因为所有的texture,textureregion都没有问题,但是就是提示错误。
昨天和美工要图片,本来是要背景透明的png格式,可是她却给了我一个jpg的。说明了之后她说没法改,因为没有png这个保存选项。
我就看了一下,和她要了psd的文件,还好我有一点
- 自己写的一个繁体到简体的转换程序
asialee
java转换繁体filter简体
今天调研一个任务,基于java的filter实现繁体到简体的转换,于是写了一个demo,给各位博友奉上,欢迎批评指正。
实现的思路是重载request的调取参数的几个方法,然后做下转换。
- android意图和意图监听器技术
百合不是茶
android显示意图隐式意图意图监听器
Intent是在activity之间传递数据;Intent的传递分为显示传递和隐式传递
显式意图:调用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图;不指明调用的名称,根据设
- spring3中新增的@value注解
bijian1013
javaspring@Value
在spring 3.0中,可以通过使用@value,对一些如xxx.properties文件中的文件,进行键值对的注入,例子如下:
1.首先在applicationContext.xml中加入:
<beans xmlns="http://www.springframework.
- Jboss启用CXF日志
sunjing
logjbossCXF
1. 在standalone.xml配置文件中添加system-properties:
<system-properties> <property name="org.apache.cxf.logging.enabled" value=&
- 【Hadoop三】Centos7_x86_64部署Hadoop集群之编译Hadoop源代码
bit1129
centos
编译必需的软件
Firebugs3.0.0
Maven3.2.3
Ant
JDK1.7.0_67
protobuf-2.5.0
Hadoop 2.5.2源码包
Firebugs3.0.0
http://sourceforge.jp/projects/sfnet_findbug
- struts2验证框架的使用和扩展
白糖_
框架xmlbeanstruts正则表达式
struts2能够对前台提交的表单数据进行输入有效性校验,通常有两种方式:
1、在Action类中通过validatexx方法验证,这种方式很简单,在此不再赘述;
2、通过编写xx-validation.xml文件执行表单验证,当用户提交表单请求后,struts会优先执行xml文件,如果校验不通过是不会让请求访问指定action的。
本文介绍一下struts2通过xml文件进行校验的方法并说
- 记录-感悟
braveCS
感悟
再翻翻以前写的感悟,有时会发现自己很幼稚,也会让自己找回初心。
2015-1-11 1. 能在工作之余学习感兴趣的东西已经很幸福了;
2. 要改变自己,不能这样一直在原来区域,要突破安全区舒适区,才能提高自己,往好的方面发展;
3. 多反省多思考;要会用工具,而不是变成工具的奴隶;
4. 一天内集中一个定长时间段看最新资讯和偏流式博
- 编程之美-数组中最长递增子序列
bylijinnan
编程之美
import java.util.Arrays;
import java.util.Random;
public class LongestAccendingSubSequence {
/**
* 编程之美 数组中最长递增子序列
* 书上的解法容易理解
* 另一方法书上没有提到的是,可以将数组排序(由小到大)得到新的数组,
* 然后求排序后的数组与原数
- 读书笔记5
chengxuyuancsdn
重复提交struts2的token验证
1、重复提交
2、struts2的token验证
3、用response返回xml时的注意
1、重复提交
(1)应用场景
(1-1)点击提交按钮两次。
(1-2)使用浏览器后退按钮重复之前的操作,导致重复提交表单。
(1-3)刷新页面
(1-4)使用浏览器历史记录重复提交表单。
(1-5)浏览器重复的 HTTP 请求。
(2)解决方法
(2-1)禁掉提交按钮
(2-2)
- [时空与探索]全球联合进行第二次费城实验的可能性
comsci
二次世界大战前后,由爱因斯坦参加的一次在海军舰艇上进行的物理学实验 -费城实验
至今给我们大家留下很多迷团.....
关于费城实验的详细过程,大家可以在网络上搜索一下,我这里就不详细描述了
在这里,我的意思是,现在
- easy connect 之 ORA-12154: TNS: 无法解析指定的连接标识符
daizj
oracleORA-12154
用easy connect连接出现“tns无法解析指定的连接标示符”的错误,如下:
C:\Users\Administrator>sqlplus username/
[email protected]:1521/orcl
SQL*Plus: Release 10.2.0.1.0 – Production on 星期一 5月 21 18:16:20 2012
Copyright (c) 198
- 简单排序:归并排序
dieslrae
归并排序
public void mergeSort(int[] array){
int temp = array.length/2;
if(temp == 0){
return;
}
int[] a = new int[temp];
int
- C语言中字符串的\0和空格
dcj3sjt126com
c
\0 为字符串结束符,比如说:
abcd (空格)cdefg;
存入数组时,空格作为一个字符占有一个字节的空间,我们
- 解决Composer国内速度慢的办法
dcj3sjt126com
Composer
用法:
有两种方式启用本镜像服务:
1 将以下配置信息添加到 Composer 的配置文件 config.json 中(系统全局配置)。见“例1”
2 将以下配置信息添加到你的项目的 composer.json 文件中(针对单个项目配置)。见“例2”
为了避免安装包的时候都要执行两次查询,切记要添加禁用 packagist 的设置,如下 1 2 3 4 5
- 高效可伸缩的结果缓存
shuizhaosi888
高效可伸缩的结果缓存
/**
* 要执行的算法,返回结果v
*/
public interface Computable<A, V> {
public V comput(final A arg);
}
/**
* 用于缓存数据
*/
public class Memoizer<A, V> implements Computable<A,
- 三点定位的算法
haoningabc
c算法
三点定位,
已知a,b,c三个顶点的x,y坐标
和三个点都z坐标的距离,la,lb,lc
求z点的坐标
原理就是围绕a,b,c 三个点画圆,三个圆焦点的部分就是所求
但是,由于三个点的距离可能不准,不一定会有结果,
所以是三个圆环的焦点,环的宽度开始为0,没有取到则加1
运行
gcc -lm test.c
test.c代码如下
#include "stdi
- epoll使用详解
jimmee
clinux服务端编程epoll
epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linu
- Hibernate对Enum的映射的基本使用方法
linzx0212
enumHibernate
枚举
/**
* 性别枚举
*/
public enum Gender {
MALE(0), FEMALE(1), OTHER(2);
private Gender(int i) {
this.i = i;
}
private int i;
public int getI
- 第10章 高级事件(下)
onestopweb
事件
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
- 孙子兵法
roadrunners
孙子兵法
始计第一
孙子曰:
兵者,国之大事,死生之地,存亡之道,不可不察也。
故经之以五事,校之以计,而索其情:一曰道,二曰天,三曰地,四曰将,五
曰法。道者,令民于上同意,可与之死,可与之生,而不危也;天者,阴阳、寒暑
、时制也;地者,远近、险易、广狭、死生也;将者,智、信、仁、勇、严也;法
者,曲制、官道、主用也。凡此五者,将莫不闻,知之者胜,不知之者不胜。故校
之以计,而索其情,曰
- MySQL双向复制
tomcat_oracle
mysql
本文包括:
主机配置
从机配置
建立主-从复制
建立双向复制
背景
按照以下简单的步骤:
参考一下:
在机器A配置主机(192.168.1.30)
在机器B配置从机(192.168.1.29)
我们可以使用下面的步骤来实现这一点
步骤1:机器A设置主机
在主机中打开配置文件 ,
- zoj 3822 Domination(dp)
阿尔萨斯
Mina
题目链接:zoj 3822 Domination
题目大意:给定一个N∗M的棋盘,每次任选一个位置放置一枚棋子,直到每行每列上都至少有一枚棋子,问放置棋子个数的期望。
解题思路:大白书上概率那一张有一道类似的题目,但是因为时间比较久了,还是稍微想了一下。dp[i][j][k]表示i行j列上均有至少一枚棋子,并且消耗k步的概率(k≤i∗j),因为放置在i+1~n上等价与放在i+1行上,同理