对今天知识的回顾40。

我们还说了一个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.执行更行语句

update mysql.user set password = password("123") where user="root" and host = "localhost";

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/zahngyu/p/11005637.html