事实证明,我的确是一个挖坑好手!挖得一手好坑,坑得一手好人!可惜每每别人没坑着,总是坑了自己。灰头土脸之余,来回首一下今天这个陨石洞!
小弟最近在用java Socket开发一个通信传输小应用,在满怀激情挥洒汗水一阵乱码之后,很不幸果然不出小弟所料,这个应用不work啊。不仅该传的东西没传,Server上处理本次通信的线程还被Block住了。事已至此啥也不说了,赶紧撸起袖管子~看Dump呗。一看Dump,线程被block在一个叫socketRead0的方法上~啥?socketRead0,?谁TM命名这么不规范!定睛一瞧,这是一个native方法,我伙呆~小弟这个navie小弱码渣居然在有生之年能被native方法坑到,坑得值啊!想到这里,小弟心里不禁油油然起来鸟!
那到底为啥子小弟会被这个native方法block到呢~经过认真仔细的考证学习,是因为socketWrite0方法会把数据写到Tcp buffer里等着对方来读,如果这个buffer被写满了,却没有被读,这样的话socketWrite0就闷声block线程(如果你设置了一个非常长的timeout)~
于是乎,真相只有一个!就是小弟的程序里必然有一个地方把这个buffer写满了没有被读啊!果不其然,原因就是这样,至于小弟在程序里的什么地方,用什么方式坑到了自己,就不细说了,人艰不拆啊!!!
PS.这个错误还常见于log4j的SocketAppender上~大家要小心呦,不要因为一句log就block了整个线程呦
分享到:
相关推荐
进程还需要运行时间ALLTIME,进程运行完毕ALLTIME=0, 已用CPU时间----CPUTIME、 进程的阻塞时间STARTBLOCK-表示当进程在运行STARTBLOCK个时间片后,进程将进入阻塞状态 进程的阻塞时间BLOCKTIME--表示当进程阻塞...
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STATE。 队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: 进程在就绪队列中呆一个...
•••• 进程被阻塞的时间BLOCKTIME,表示已足赛的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 •••• 进程状态START。 •••• 队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: •••进程...
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STATE。 队列指针NEXT,用来将PCB排成队列。 优先数改变的原则: 进程在就绪队列中呆一个时间片,优先数加1。...
进程控制块(Process Control Block,PCB)是操作系统用来管理进程的数据结构。它包含了进程的所有信息,如进程标识符、进程状态、优先级、内存地址等。PCB 是进程的唯一标识符,它是操作系统管理进程的关键。 3. ...
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STATE。 队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: 进程在就绪队列中呆一个...
从内核版本 2.6.15 开始,内核源代码的顶级目录下增加了一个名为“block”的子目录,这标志着 Block 层被正式引入到了 Linux 内核的核心架构中。 在 2.6.22.1 版本的内核中,我们可以通过以下命令查看 block 目录的...
pl/0中block的分析,有流程图和代码注释等。学生答辩必备
每个进程都由一个进程控制块(Process Control Block,简称PCB)来表示。PCB中包含了多个字段用于记录进程的关键信息,包括但不限于: - 进程名 - 优先数 - 到达时间 - 需要运行时间 - 已用CPU时间 - 进程状态 其中...
该算法的主要思想是,每个进程都被赋予一个优先级,优先级越高的进程将被优先执行。同时,我们还将使用时间片轮转法来分配系统资源。 变量说明 在实验代码中,我们定义了以下变量: * `ALLTIME`:每个进程的总...
例如,若进程到达时间为31、2、1、0、43、4、16、42、12、8,第一个到达的进程3(执行时间为25)会被首先执行,然后在25之前寻找下一个最短的进程。 实验的设计涉及到了以下数据结构和编程技术: - **PCB(Process...
6. **进程被阻塞的时间 BLOCKTIME**:对于已经处于阻塞状态的进程,该字段记录了它还需要等待多少个时间片才能重新变为就绪状态。 7. **进程状态 STATE**:当前进程的状态,可以是 R(就绪)、E(运行)、B(阻塞)...
例如,采用先进先出(FIFO)策略时,进程通常被添加到队列的末尾。在C语言中,可以使用结构体指针来实现链表的插入操作。 实现进程在队列之间的转换涉及到状态改变。例如,当进程执行完毕,需要将其从运行队列移除...
2. **进程控制块(PCB,Process Control Block)**:PCB是操作系统用来记录和控制进程状态的重要数据结构。它存储了关于进程的各种信息,如进程名、进程优先级、轮转时间片、CPU使用时间、进程状态和当前队列指针等...
在操作系统中,PCB(Process Control Block,进程控制块)是系统用来管理和调度进程的核心数据结构。PCB包含了描述进程状态和控制进程执行的所有必要信息,它相当于进程在内存中的身份证,记录了进程的基本属性和...
在iOS编程中,Block常被用作回调,这是因为Block可以直接访问和修改其定义时的作用域内的变量,这使得异步操作的结果可以方便地回传到调用者。例如,网络请求、定时器、动画等操作,都可以通过Block来实现回调。 三...
1. 选择屏幕:在SAP程序中,选择屏幕允许用户输入参数,这些参数随后在Coding Block中被用于筛选或过滤数据。通过定义选择屏幕事件,如INITIAL SCREEN和AFTER OUTPUT,可以实现与用户交互的功能。 2. 表处理:在...