精华内容
下载资源
问答
  • ABAP WAIT UP TO n SECONDS

    千次阅读 2019-10-14 10:05:58
    ABAP添加等待时间:WAIT UP TO n SECONDS 说明:n为整数或小数,小数需要用单引号引上。 over。

    ABAP添加等待时间:WAIT UP TO n SECONDS
    说明:n为整数或小数,小数需要用单引号引上。
    例子:

    WAIT UP TO 1 SECONDS.  "等待1秒
    WAIT UP TO '0.5' SECONDS.  "等待0.5

    over。

    展开全文
  • sleep() 和 wait() 有什么区别

    万次阅读 2019-05-15 10:19:31
    sleep() 和 wait() 有什么区别? sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法 sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常...

    sleep() 和 wait() 有什么区别?

    • sleep() 是 Thread 类的静态本地方法;wait() 是Object类的成员本地方法
    • sleep() 方法可以在任何地方使用;wait() 方法则只能在同步方法或同步代码块中使用,否则抛出异常Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
    • sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;wait() 方法放弃持有的对象锁,进入等待队列,当该对象被调用 notify() / notifyAll() 方法后才有机会竞争获取对象锁,进入运行状态
    • JDK1.8 sleep() wait() 均需要捕获 InterruptedException 异常

    测试代码

    public class TestWaitSleep {
    
    	private static Object obj = new Object();
    	
    	public static void main(String[] args) {
    		
    		//测试sleep()
    		//测试 RunnableImpl1 wait(); RunnableImpl2 notify()
    		Thread t1 = new Thread(new RunnableImpl1(obj));
    		Thread t2 = new Thread(new RunnableImpl2(obj));
    		t1.start();
    		t2.start();
    		
    		//测试RunnableImpl3 wait(long timeout)方法
    		Thread t3 = new Thread(new RunnableImpl3(obj));
    		t3.start();
    	}
    
    	
    }
    
    class RunnableImpl1 implements Runnable {
    
    	private Object obj;
    	
    	public RunnableImpl1(Object obj) {
    		this.obj = obj;
    	}
    	
    	public void run() {
    		System.out.println("run on RunnableImpl1");
    		synchronized (obj) {
    			System.out.println("obj to wait on RunnableImpl1");
    			try {
    				obj.wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			System.out.println("obj continue to run on RunnableImpl1");
    		}
    	}
    }
    
    class RunnableImpl2 implements Runnable {
    
    	private Object obj;
    	
    	public RunnableImpl2(Object obj) {
    		this.obj = obj;
    	}
    	
    	public void run() {
    		System.out.println("run on RunnableImpl2");
    		System.out.println("睡眠3秒...");
    		try {
    			Thread.sleep(3000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		synchronized (obj) {
    			System.out.println("notify obj on RunnableImpl2");
    			obj.notify();
    		}
    	}
    }
    
    class RunnableImpl3 implements Runnable {
    
    	private Object obj;
    	
    	public RunnableImpl3(Object obj) {
    		this.obj = obj;
    	}
    	
    	public void run() {
    		System.out.println("run on RunnableImpl3");
    		synchronized (obj) {
    			System.out.println("obj to wait on RunnableImpl3");
    			try {
    				obj.wait(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			System.out.println("obj continue to run on RunnableImpl3");
    		}
    	}
    }

    打印结果

    run on RunnableImpl2
    睡眠3秒...
    run on RunnableImpl1
    obj to wait on RunnableImpl1
    run on RunnableImpl3
    obj to wait on RunnableImpl3
    obj continue to run on RunnableImpl3
    notify obj on RunnableImpl2
    obj continue to run on RunnableImpl1
    

     


    【Java面试题与答案】整理推荐

     

    展开全文
  • void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)用于将wait queue 加入到wait queue head 这个队列中,并设置当前thread的状态为state。与此具有有相同功能的函数是add_wait_queue。...
    void  prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)用于将wait queue
    加入到wait queue head 这个队列中,并设置当前thread的状态为state。与此具有有相同功能的函数是add_wait_queue。区别在于
    调用prepare_to_wait 在将wait_queue_t *wait加入到wait_queue_head_t *q中时,会判断wait_queue_t *wait 中
    是否包含要唤醒的进程.
    void
    prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state)
    {
    	unsigned long flags;
    
    	wait->flags &= ~WQ_FLAG_EXCLUSIVE;
    	spin_lock_irqsave(&q->lock, flags);
    //判断当前wait->task_list 为null,如果为null,说明没有进程需要唤醒,也就没有
    //必要添加到wait_queue_head_t *q,
    	if (list_empty(&wait->task_list))
    		__add_wait_queue(q, wait);
    
    	set_current_state(state);
    	spin_unlock_irqrestore(&q->lock, flags);
    }
    这个函数会清除WQ_FLAG_EXCLUSIVE 。如果不需要清除WQ_FLAG_EXCLUSIVE的话,可以调用prepare_to_wait_exclusive
    相比add_wait_queue,prepare_to_wait 多了一层判断wait->task_list 是否为null,应优先使用这个函数
    void
    prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state)
    {
    	unsigned long flags;
    
    	wait->flags |= WQ_FLAG_EXCLUSIVE;
    	spin_lock_irqsave(&q->lock, flags);
    	if (list_empty(&wait->task_list))
    		__add_wait_queue_tail(q, wait);
    	set_current_state(state);
    	spin_unlock_irqrestore(&q->lock, flags);
    }
    这个函数会置位WQ_FLAG_EXCLUSIVE,并将wait_queue_t *wait 添加到ait_queue_head_t *q的最后.
    

    展开全文
  • Linux TCP Finwait2/Timewait状态要义浅析

    千次阅读 2018-08-11 08:37:17
    * Move a socket to time-wait or dead fin-wait-2 state. */ void tcp_time_wait( struct sock *sk, int state, int timeo) { ... if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_...

    我讨厌TCP。但是我的工作中总是要接触TCP!
    近期三四个礼拜,接连碰到三三两两TCP的问题,这些都无关拥塞控制,这些都是状态机方面的问题,但无论怎样,我是非常讨厌的,以至于恶心,我释放大量的感情色彩在TCP协议…

    但这不能否认我对TCP的理解以及对其性情的掌握已经超出了大多数人,我在咒骂中成长。我咒骂着TCP,同时也可能被别人鄙视着…那就来吧。

    本周本来不想写技术文章的,很多的pending的事情尘埃落定,我想干点别的,我哪能有心思搞什么我最烦的TCP!然而非也…

    除了我最烦的TCP,我还能搞什么?无路可走!不如再写一些感悟,期待能帮助一些需要帮助的人。

    那就再说说TCP吧。


    首先我们来看RFC793上标准的TCP状态图:

    这里写图片描述

    再看一下这个标准RFC的状态图中潜在的风险:

    这里写图片描述

    标准归标准,实现归实现。

    标准需要完成一个闭环,而实现则要兼顾各种限制条件。在TCP状态机上看,RFC793实现了单一CLOSED出口,虽然TIMEWAIT状态本身就不完美,但至少它是主动关闭方唯一的出口。然而如图所示,在实现上,这里会遇到潜在的DoS风险,如何规避这个风险呢?

    Linux内核TCP实现是这么做的:

    这里写图片描述

    你可以说,这个状态机违反了RFC793所述原汁原味的全双工独立控制的TCP协议。是的,它违反了,有谁规定我不能单独关闭一个方向的数据传输而在另一个方向继续呢?

    然而,事实上没有人这么做,没有人单独关闭一个方向的数据传输,当你关闭一个方向的数据传输时,潜规则是,告诉对方,你也关闭吧。如果你真的想关闭一个方向的数据传输,你不发任何数据便是,事实上很多协议不都是单方向传输数据的吗?比如文件下载,除了一开始的几个交互外,后续几乎就是单方向的。

    历史地看问题,在1970-1980年代,人们认为交互会被平等的分为两类,以Telnet双向交互和文件下载准单向传输为代表,如此环境设计出来的TCP协议,当然要让二者平分秋色了。可以说,应用模式的事情,TCP帮着做了太多。

    TCP过渡设计了。

    到了1990年代,一直持续到21世纪,Linux时代和TCP/IP初上舞台的时代已经有大不同。此时人们根据现实的要求,不光要兼顾应用对传输协议的使用,还要应对公共无界无障碍的Internet上的各种攻击,当人们认识到现实的攻击带来的危害其影响远重要于理论上的闭环自洽的时候,这个状态机就被改变了,至少是在Linux内核是被改变了。


    这里不得不闲扯几句。

    被改变的不止TCP的状态机,还包括TCP Timewait的时间,不再是RFC所说的2MSL即120秒,而是简单的60秒,为什么?因为这会在不伤大雅的情况下,节省资源!

    在Linux内核inet_twsk_schedule函数中,有下面的注释请阅读:

    /* timeout := RTO * 3.5
    *
    * 3.5 = 1+2+0.5 to wait for two retransmits.
    *
    * RATIONALE: if FIN arrived and we entered TIME-WAIT state,
    * our ACK acking that FIN can be lost. If N subsequent retransmitted
    * FINs (or previous seqments) are lost (probability of such event
    * is p^(N+1), where p is probability to lose single packet and
    * time to detect the loss is about RTO*(2^N - 1) with exponential
    * backoff). Normal timewait length is calculated so, that we
    * waited at least for one retransmitted FIN (maximal RTO is 120sec).
    * [ BTW Linux. following BSD, violates this requirement waiting
    * only for 60sec, we should wait at least for 240 secs.
    * Well, 240 consumes too much of resources 8)
    * ]
    * This interval is not reduced to catch old duplicate and
    * responces to our wandering segments living for two MSLs.
    * However, if we use PAWS to detect
    * old duplicates, we can reduce the interval to bounds required
    * by RTO, rather than MSL. So, if peer understands PAWS, we
    * kill tw bucket after 3.5*RTO (it is important that this number
    * is greater than TS tick!) and detect old duplicates with help
    * of PAWS.
    */

    同时,如果你看HTTP的标准的话,也是没有规定HTTP头部的长度,然而这会让Web服务器端在读到\r\n\r\n之前不断的执行malloc-strncpy循环,这会耗尽服务器的内存,于是在实现上,Web服务器会对HTTP头长度进行限制!


    理论上的分析应该可以到底为止了。在具体的实现上,如果你撸代码的话,还是有不少难以用文字表达的trick。


    首先我们简单想一下,Linux会为每一个进入finwait2状态或者timewait状态的socket都启动一个timer来计时吗?非也。同样的设计和TCP不会为每一个数据包启动一个重传定时器一样。

    最直观的解法就是,将进入timewait的TCP socket按照进入timewait时间点的FIFO原则排队,仅仅启动一个timer,设置队头的timewait到期时间为timer到期的时间。这是Linux内核标准的实现方式。

    然而这里面的trick在于,Linux对finwait2状态的实现和timewait的实现进行了复用,这个在代码的清晰度上减了分。

    具体来讲,Linux内核用tcp_time_wait一个函数,实现了两个状态:
    这里写图片描述

    请撸下面的代码:

    /*
     * Move a socket to time-wait or dead fin-wait-2 state.
     */
    void tcp_time_wait(struct sock *sk, int state, int timeo)
    {
        ...
    
        if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp)
            recycle_ok = tcp_remember_stamp(sk); // trick!!
    
        ...
    
        if (tw != NULL) {
            ...
    
            /* Get the TIME_WAIT timeout firing. */
            if (timeo < rto)
                timeo = rto;
    
            if (recycle_ok) {
                tw->tw_timeout = rto; // about 3.5 rto
            } else {
                tw->tw_timeout = TCP_TIMEWAIT_LEN;
                if (state == TCP_TIME_WAIT)
                    timeo = TCP_TIMEWAIT_LEN;
            }
            // 事实上是两类timer:
            // 1. 标准的TIMEWAIT-TIMEOUT=60ms的timer
            // 2. 非标准的TIMEOUT=3.5RTO的TIMER
            inet_twsk_schedule(tw, &tcp_death_row, timeo,
                       TCP_TIMEWAIT_LEN);
            inet_twsk_put(tw);
        } else {
            ...
        }
        ...
    }

    你以为这就结束了吗?非也。

    我想表达的是Linux在实现TCP timewait的时候,它真的是能预先判定什么情况下可以违背一点规则。就比如说,什么情况下可以让一个处于timewait状态的TCP连接不在那个状态待60秒(已经是一个违反原则的优化后的值了),而是可以马上释放。

    用什么可以check?答案是PAWS!具体详见我在很久以前写的一篇文章,必须看哦:
    TCP的TIME_WAIT快速回收与重用https://blog.csdn.net/dog250/article/details/13760985
    有理论分析,有实验,没有代码…不过我觉得2013年的文章(并不严谨,但就是那个意思),还可以了,当时我记得是同事北京出差回来,一个问题没有搞定在讨论,当时大家叫我老湿,同时大家的讨论也被我听到了,我当时也不知道到底为什么,后来大家把这个问题淡化以后,我默默做了几个实验,终于明白了原因…事后就写了上面那篇文章。

    一直以来,我都是很讨厌TCP的,但是我就是可以搞定TCP的任何问题,上天作弄!


    现在来看Linux关于PAWS的优化。

    摘录一段上述我自己在2013年写的文章的一个段落

    于是需要有一定的手段避免这些危险。什么手段呢?虽然曾经连接的tuple信息没有了,但是在IP层还可以保存一个peer信息,注意这个信息不单单是用于TCP这个四层协议的,路由逻辑也会使用它,其字段包括但不限于:
    对端IP地址
    peer最后一次被TCP触摸到的时间戳

    在快速释放掉TIME_WAIT连接之后,peer依然保留着。丢失的仅仅是端口信息。不过有了peer的IP地址信息以及TCP最后一次触摸它的时间戳就足够了,TCP规范给出一个优化,即一个新的连接除了同时触犯了以下几点,其它的均可以快速接入,即使它本应该处在TIME_WAIT状态(但是被即快速回收了):
    1.来自同一台机器的TCP连接携带时间戳;
    2.之前同一台peer机器(仅仅识别IP地址,因为连接被快速释放了,没了端口信息)的某个TCP数据在MSL秒之内到过本机;
    3.新连接的时间戳小于peer机器上次TCP到来时的时间戳,且差值大于重放窗口戳。

    同时满足上述3个条件,方可拒绝一个连接,否则,即便一个timewait还没有结束的连接也依然可以被重用(前提是你要打开tw reuse这个sysctl参数)

    我曾经想过,为什么这个优化没有写在TCP的RFC中。

    因为你可以看到,这个优化完全基于IP层dst_entry,完全基于peer这个IP层的东西,如果要设计一个协议的话,是绝对不应该依赖其它的层级的,也就是说,你设计的协议越闭环越好,越不依赖别的层级越好!

    然而,在实现上,那就没有限制了。在Linux内核中,到处都有这些违法原则的实现。也许吧,Linux是一个宏内核,什么东西都懂…


    好了,我总结有三:

    • Linux TCP的timewait超时60秒
    • Linux TCP的finwait2和timewait共用一套实现
    • Linux TCP状态机有大不同
    • Linux TCP针对PAWS是依赖IP层的


    这周末本来不想写技术文章的,但今日深圳大雨到暴雨,后半夜无眠,听雨作文,成就这篇!其实我本来是想写一篇文章抨击一下戾气或者说杠精,然而在我自己获得认可之后,所有的戾气突然间成了美好,我也就没有什么好抨击的了,只有感激。

    PS:温州皮鞋厂老板(这是我的朋友,一个真实的人,不是虚构的)终于AT要成功了,我当然很欣慰。然而这也意味着温州皮鞋厂老板再一次离我而去…这我很伤心。

    接下来还想喷一下burst和pacing,有谁前来讨论吗?哈哈。。。

    展开全文
  • C语言 wait

    千次阅读 2019-04-24 21:31:53
    孤儿进程:父进程死,子进程被init领养 子进程被领养后,ctrl+c不能停止,因为该bash已经没有子进程了,只能通过kill杀死 #include <...sys/wait.h> int main(void) { pid_t pid; pid = fork(); ...
  • java.lang.Process.waitFor()方法将导致当前的线程等待,如果必要的话,直到由该Process对象表示的进程已经终止。此方法将立即返回,如果子进程已经终止。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。...
  • oracle for update wait 解析

    千次阅读 2019-12-20 15:51:10
    select for update 可以看成 select for update wait UN-LIMITED ——查询记录如果被锁,则等待释放。执行过程中"自己"也会上行级锁,直到事务提交 select for update wait X—— 对某个记录进行查询,如果有被锁...
  • CLOSE_WAIT状态的原因与解决方法

    万次阅读 2017-12-24 18:03:28
    这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司竟然都面...说起CLOSE_WAIT状态,如果不知道的话,还是先瞧一下TCP的状态转移图吧。 关闭socket分为主动关闭(Activ
  • 相信很多小伙伴和我一样,在使用SSH连接时出现这么一行packet_write_wait: Connection to xxx.xxx.xxx.xxx port 22: Broken pipe. 我也是尝试了很多办法才解决,主要文件设置有关。 首先切换到root命令,打开~/.ssh...
  • packet_write_wait: Connection to XXX XXX XXX XXX port 22: Broken pipe 在网上找的一些方法都不行,所以我就登陆root用户修改了这个普通用户的密码,再次登陆还是不行。 2.我用root切换到su - 普通用户报错...
  • TCP在FIN_WAIT1状态到底能持续多久以及TCP假连接问题

    万次阅读 多人点赞 2018-08-16 08:52:35
    而主机B上却没有任何关于主机A的连接信息,经查明,这是由于主机A和主机B的发送/接收缓冲区差异巨大,导致主机B进程退出后,主机A暂时憋住,主机B频繁发送零窗口探测,FIN_WAIT1状态超时,进而连接被销毁,然而主机A...
  • 使用内网穿透时,一段时间没用操作命令行发现会自动断开,出现错误:packet_write_wait: Connection to xxx Broken pipe。有时候想远程跑代码,结果出个这个错误就很难受了。解决方法如下: 正常来说是这样来连接...
  • 界面一直停留在“A start job is running for wait for Plymouth Boot Screen to Quit”; 解决方法: 1.按ctrl+Alt+F3通过命令行进入系统; 2.执行图形界面安装命令:yum groupinstall -y "GNOME Desktop"...
  • Please wait while Jenkins is getting ready to work (jenkins) 如果界面提示Jenkins正在启动,请稍后…或者提示 Please wait while Jenkins is getting ready to work… 换了清华的镜像进去之后下载插件无数失败 ...
  • - 为什么wait、notify必须被同步块包裹着? - notify之后 一定会立刻唤醒么? synchronized代码块通过javap生成的字节码中包含 monitorenter 和 monitorexit 指令。 正如wait方法的注释所说: ...
  • 现象: 树莓派装了ubuntu18.04的系统后,开机总会卡在等待网络连接好长时间。 解决办法: ...查看该文件夹,该文件夹下有三个文件,systemd-networkd-wait-online.service、networking.service、Netwo...
  • Please wait while Jenkins is getting ready to work... 解决方法: 需要你进入jenkins的工作目录,打开 hudson.model.UpdateCenter.xml 把http://updates.jenkins-ci.org/update-center.json改成http...
  • 一个TCP FIN_WAIT2状态细节引发的感慨

    万次阅读 多人点赞 2018-07-28 08:14:15
    #define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT * state, about 60 seconds */ 你不信吗?试试看呗,还是刚才那个Low逼实验,这次把iptables规则去掉,Ctrl-]+q之后,观察TIME...
  • ssh连接到另一台主机一会儿不动老掉线怎么办? 解决办法:可以使用ServerAliveInterval参数设置;ServerAliveInterval会在隧道无通信后的一段设置好的时间后发送一个请求给服务器要求服务器响应。...
  • 解决Jenkins安装出现Please wait while Jenkins is getting ready to work... http://mirror.xmission.com/jenkins/updates/update-center.json 重启tomcat就行了
  • 如果用公司网络或者vpn下载gradle完全没问题,但是当在家里网络不好时下载gradle就很有可能报Gradle Sync: Wait for the other thread to finish acquiring the distribution。然后一直停在更新或下载的界面直到失败...
  • 问题 打算从远程仓库克隆项目到本地时,报错: $ git clone git@github.com:EverChan6/meetingDemo.gitCloning into 'meetingDemo'...packet_write_wait: Connection to 52.74.223.119 port 22: Broken pip...
  • 如果以上操作没有起作用,还是一直停留在Please wait while Jenkins is getting ready to work...页面,可以试试将hudson.model.UpdateCenter.xml修改成如下所示的镜像,再次重启Jenkins服务!
  • 功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩.    还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()...
  • 在client登录添加参数即可 # ssh -o ServerAliveInterval=60 uersname@ip
  • “/tmp/modconfig-71euqe/vmhgfs-only/page.c:1649:23: error: too many arguments to function ‘wait_on_bit’” 一个个去解压了找的 解压指令  tar xf vmhgfs.tar 修改目录下的page文件的1639行 ...
  • 方案1 实测可解决问题 1. Connect to the remote device using ssh ssh @ 2. Run the below commands (In my case, ".... Restart PyCharm and wait a little bit for the progress bar at bottom right to complete.
  • 虚拟机Centos7.4在编译软件时候,更新了一些软件,第二天无法启动图形桌面,开机一直卡在“A start job is running for wait for Plymouth Boot Screen to Quit”,并且无法进入命令行模式; 解决方法如下: 第一...
  • 问题:卡在“A start job is running for wait for network to be Configured”两分多钟。 解决办法: cd /etc/systemd/system/network-online.target.wants/ 查看该目录下文件 vi systemd-networkd-wait-on...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 434,506
精华内容 173,802
关键字:

towait是什么意思