linux平台下如何让字符设备支持阻塞和非阻塞io模型,以read操作为例?
不知题主的read是指socket的read还是文件的read。 默认情况下,socket的read是阻塞的; 对文件进行read,要看内核态的read接口是注册为同步接口还是异步接口(可参见file_operations结构体)
linux阻塞指令?
1.阻塞(block)概念:指进程或线程在执行设备操作或管道,或则网络时,不能获取到资源就被挂起,
直到满足可操作的条件后在进行操作,被挂起的进程进入休眠状态,从运行队列移走,直到
等待的条件满足才继续执行。也就是执行到某些函数时必须等待某个事件发生函数才返回。
2.非阻塞(non_block):进程就算没有获取到资源或没有等到事件发生时不挂起,通常会直接放弃或不断查询,
直到可以进行的位置。也就是函数的执行不必等待事件发生,一旦执行肯定返回,用返回值来反应函数执行情况。
3.例如:read读取输入输出设备/dev/tty
4.read设备文件时发生阻塞
Linux下read函数默认到底是阻塞的还是非阻塞的?
不知题主的read是指socket的read还是文件的read。
默认情况下,socket的read是阻塞的; 对文件进行read,要看内核态的read接口是注册为同步接口还是异步接口(可参见file_operations结构体)
线程进入阻塞时,线程会不会让出CPU?
那要看操作系统context switch的机制。一般windows linux ios都会给定每个线程指定的执行时间,如果时间到了会出现计时器中断信号(timer interrupt signal),而线程会被动丢失CPU的使用权。
而有些简单的嵌入式系统没有这个机制,context switch一般是要求线程主动放弃CPU使用权而交给kernel。
如果这时候当前线程被阻塞那就会导致死循环,这时候要主动的叫reschedule 或者 yield等函数给kernel发信号。
当然有timer的系统也可以叫这些函数要当前线程提早主动放弃CPU资源从而避免在循环里等待浪费时间。
Linux内存占用过高的问题解决方案?
1.首先考虑增加物理内存,2G太少了2.查看mysql里的线程,观察是否有长期运行或阻塞的sql:show full processlist3.查看mysql内存,缓存的相关配置,使用如show global variables like ‘%sort_buffer_size%’;如不符合当前系统负载量,说明当前配置不合理,需要进行调整