阻塞的两个阶段: 内核准备数据(将数据从磁盘拷贝到内核缓冲区),内核拷贝数据到进程(数据从内核缓存区拷贝到进程缓存区)。 1. 阻塞I/O: 线程发出请求之后,如果内核没有准备好数据,线程就会交出CPU,并处于阻塞状态,直到内核返回数据。 2. 非阻塞I/O: 线程发出请求后会立刻对内核的返回结果就行判断,如果返回error说明内核没有准备好数据,线程会重新发起请求,直到获取到数据。 也就是再内核准备数据的阶段不断询问内核准备好了没有。 3. I/O多路复用: 通过一个线程轮询多个socket的状态,只有当socket真正有读写的需求时才会占用I/O资源。 即专门开辟一个线程(select,poll,epoll)来为多个socket等待内核准备数据,一旦有任何一个socket的数据准备完成,select就会返回。优点是能够处理更多的连接。 4. 信号驱动I/O: 当线程发起一个I/O请求时,会给socket注册一个信号函数,然后线程会继续执行。 当内核准备好数据后,会发送一个信号给线程,线程接收到信号后开始执行信号函数来执行实际的I/O操作。 5.异步I/O: 当线程发起一个I/O请求后会继续执行,内核接收到请求后立即返回一个信号表示请求发起成功。 接着内核会进行数据准备和将数据拷贝拷贝到线程的工作,当这些工作都完成之后,内核会再发送一个信号给线程,线程直接调用数据,没有任何阻塞过程。
Buffer: buffer的作用是减少磁盘IO写入次数。相当于开辟一块内存,将多个长度较短的写入操作放到其中,统一进行一次磁盘IO读取.所以通常叫write-buffer。 Cache: Cache的作用是减少磁盘IO读取操作。相当于开辟一块内存,保存着用户常用的一些变量。用户再次使用时不用访问磁盘,˙只需要访问内存,提高效率。所以通常叫read-cache。 cache需要提供随机读写的功能。
常用命令:top,netstat,ifconfig,ps,tcpdump,curl,echo,ping,iostat,df,free(查看内存使用情况),grep,find,cat,less,cd,cp,ls,mkdir,touch, 常用命令:用户控制、权限控制、进程控制、系统状态查询之类的 查看端口号:netstat 查看进程:pstree 关闭进程:pkill 实时查看cpu和内存状态:top uptime:top命令的第一行,查看服务器的运行时间以及平均负载(最近1分钟,5分钟,15分钟) who:当前用户在线信息 last:近期重要操作 at:一次性任务计划。 atq:查看 atrn:删除 at 时间 >>命令 >>ctrl+d crontab:周期性定时任务 -e 编辑 -l 查看 -r 删除 分 时 日 月 星期 Linux状态分析:CPU(top)、内存(top和free,注意buffer和cache区别)、磁盘(fdisk和df)、IO(iostat)等 电脑运行慢的主要原因:内存 top命令可以查看cpu和内存的使用情况 TOP: VIRT:虚拟内存大小 RES:物理内存大小
dev: 系统的硬件管文件夹,其中的每个文件对应的都是一个硬件。
虚拟内存的概念: Linux中,为了更好的解决各个进程的内存分配问题,提出了虚拟内存的概念。 虚拟内存从本质上说就是一个映射表,表中记录着每个虚拟内存地址到物理内存地址的映射。在32位操作系统中,每个映射需要8个字节(32位虚拟内存->32位物理内存)。 实际使用时,系统会以4K内存为一页,建立映射,这样4G内存只需要8M的映射表(4M虚拟内存地址,4M物理内存地址)。 CPU中有着专门的内存管理单元MMU(Memory Management Unit)来进行虚拟内存到物理内存之间的映射。 功能: 解决多个进程访问内存冲突的问题。 有益于进程内存管理,在进程眼中获取到总是连续的内存。 便于进行数据共享 在物理内存不够时,可以将暂时不用的内存复制到SWAP区,在使用结束后再复制回来。 常见问题: 32位系统和64位系统相关: 对于32位系统,相当于寻址地址最大为32位,对应的寻址空间最大为4G。64位系统的寻址地址为64位,寻址空间最大为256G。 利用32位的虚拟内存对64位的物理内存寻址是可行的,不过有好多内存访问不到。但是用64位虚拟内存映射到32位物理内存是不可行的。
