我们还说了一个epoll
在select中只能同时处理1024个客户端
多线程会遇到资源瓶颈,什么才是解决高并发最有效的方式了
在linux中提供了epoll这个多路复用IO模型,注意其他平台没有相应的实现,所以epoll仅在linux中使用
程序阻塞过程分析:
假设系统目前运行了三个进程 ABC
进程A正在运行以下socket程序
server = socket.socket()
server.bind(("127.0.0.1",1688))
server.listen()
server.accept()
1.系统会创建文件描述符指向一个socket对象,其包含了读写缓冲区,已经进行等待队列
2.当执行到accept/recv时 系统会将进程A从工作列表中移除
3.将进程A的引用添加到 socket对象的等待队列中
进程的唤醒:
1.当网卡收到数据后会将数据写入到缓冲区
2.发送终断信号给CPU
3.CPU执行中断程序,将数据从内核copy到socket的缓冲区
4.唤醒进程,即将进程A切换到就绪状态,同时从socket的等待队列中移除这个进程引用
select监控多个socket
select的实现思路比较直接
1.先将所有socket放到一个列表中
2.遍历这个列表将进程A添加到每个socket的等待队列中,然后阻塞进程
3。当数据到达时,cpu执行中断程序将数据copy给socket同时唤醒处于等待队列中的进程
A,为了防止重复添加等待队列,还需要移除已经存在的进程A
4.进程A唤醒后,由于不清楚那个socket有数据,所以需要遍历一变所有的socket列表
从上面的过程中不难看出:
1.select需要遍历socket列表,频繁的对等待队列进行添加移除操作
2,,数据到达后还需要给遍历所有socket才能获知那些socket有数据
俩个 操作消耗的时间随着要监控的socket的数量增加而大大增加
处于效率考虑才规定的最大只能监控1024个socket
接下来就是用epoll来解决这些问题了:
1.避免频繁的对等待队列进行操作
2.避免遍历所有socket
对于第一个问题epoll,采取的方案就是,将等待队列的维护和阻塞进程这俩个操作进行拆分
在epoll中register与unregister函数用于维护等待队列
register是进程添加到等待队列中,unregister是把进程从等待队列中删除
使用这俩个函数我们自己来控制等待队列的添加和删除,从而避免的频繁操作等待队列
epoll。poll则是用来阻塞进程的,这样一来就避免了每次处理重新操作等待队列的问题
第二个问题是select中进程无法获知那些socket是有数据的所以需要遍历
epoll为了解决这个问题,在内核中维护了一个就绪列表
1.创建epol对象,epoll也会对应一个文件,有文件系统管理
2.执行register时,将epoll对象,添加到socket的等待队列中
3.数据到达后,CPU执行中断程序,将数据copy给socket
4.在epoll中,中断 程序接下来会执行epoll队像中的回调函数,传入就绪的socket对象
5.将socket,添加到就绪列表中
6.唤醒epoll等待队列中进程
进程唤醒后,由于在就绪列表,所以不需要再遍历socket了,直接处理就绪列表就行了
---恢复内容开始---
今天主要说了数据库的相关概念:(重点)
数据库本质就是一套CS结构的TCP程序
客户端连接到服务器然后向服务器发送指令,来完成数据的操作
数据库与文件系统的对应关系(重点)
一个数据项 name=zy 本质就是文件某一行的一部分数据
一条数据 zy, 19 ,man 本质就是文件里的一行数据
一张表 本质就时一个文件
数据库 文件夹
DBMS DataBaseManagerSystem 数据库管理系统,数据库的服务器端程序
数据库服务器 运行DBMS的计算机
安装方式:(掌握)
1.下载解压包
2.解压到某个目录下
3.添加环境变量 ,将bin所在的完整路径copy 添加系统的path中
4.作为服务器,应该自启动mysql服务器 ,需要到系统服务里面调
mysql--install ,运行输入services查看是否成功
删除服务 sc delete mysql 如果需要重装的话
启动服务:net start mysql
停止服务:net stop mysql
连接服务器的指令(也要掌握)
本质是TCP程序,必须指定ip和端口,如果服务器就运行在本机上,可以省略ip,
如果端口没有改过,也可以省略端口
完整写法:
mysql -hip -p端口 -u用户名 -p密码
实例:mysql -uroot -p ,mysql 5.6默认是没有密码的
修改管理员密码(了解)
1.如果知道原始密码,可以使用mysqladmin这个工具
mysqladmin -p旧密码 -u用户名 password 新密码
实例: mysqladmin -uroot -p password 123
2.不知道原始的密码的情况下:
删除密码文件,但是会删除所有的授权信息,可以跳过授权表,
我们可以在启动服务器的时候,指定让其忽略授权信息
1.先关闭mysql服务器,直接在终端执行mysql --skip-grant-tables
2.无密码登录root账户
3.执行更行语句
---恢复内容结束---