非阻塞socket
12345678910111213141516171819202122232425262728293031323334353637383940414243#服务端from socket import *import times=socket(AF_INET,SOCK_STREAM)s.bind(('127.0.0.1',8080))s.listen(5)s.setblocking(False) #设置socket的接口为非阻塞conn_l=[]del_l=[]while True: try: conn,addr=s.accept() conn_l.append(conn) except BlockingIOError: print(conn_l) for conn in conn_l: try: data=conn.recv(1024) if not data: del_l....
Readme
操作系统 0 概述 1 操作系统引论 2 进程管理 2.1 进程的基本概念 2.2 进程控制 2.3 进程同步 2.4 进程通信 2.5 进程与线程 2.6 协程 3 处理机管理 4 内存管理 4.1 层次结构与装入链接 4.2 连续存储管理 4.3 分页存储管理 4.4 分段存储管理 4.5 虚拟存储器 5 设备IO管理 5.1 Linux IO模型 5.2 Windows IO模型 5.3 IO多路复用模型 5.4 IO多路复用与线程进程 5.5 IO多路复用与回调函数 6 文件系统 7 操作系统接口 附录1 课后习题答案 附录10 动态内存的原理 附录12 并发编程 附录13 网络编程 附录2 操作系统总结 附录3 互斥量、信号量、条件变量 附录4 寄存器 附录5 协程 附录6 中断 附录7 模式切换与进程切换 附录8 同步异步、阻塞非阻塞 附录9 网络编程和web开发 面试问题整理
16 Redis消息队列
参考文献 redis做消息队列 1 List队列List 底层的实现就是一个「链表」,在头部和尾部操作元素,时间复杂度都是 O(1),这意味着它非常符合消息队列的模型。如果把 List 当作队列,你可以这么来用。 读非阻塞的消息队列 生产者使用 LPUSH 发布消息: 1234127.0.0.1:6379> LPUSH queue msg1(integer) 1127.0.0.1:6379> LPUSH queue msg2(integer) 2 消费者这一侧,使用 RPOP 拉取消息: 1234127.0.0.1:6379> RPOP queue"msg1"127.0.0.1:6379> RPOP queue"msg2" 但这里有个小问题,当队列中已经没有消息了,消费者在执行 RPOP 时,会返回 NULL。 12127.0.0.1:6379> RPOP queue(nil) // 没消息了 而我们在编写消费者逻辑时,一般是一个「死循环」,这个逻辑需要不断地从队列中拉取消...
0 消息队列
消息队列消息队列本质定义生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者  消息:就是要传输的数据,可以是最简单的文本字符串,也可以是自定义的复杂格式(只要能按预定格式解析出来即可)。 队列:大家应该再熟悉不过了,是一种先进先出数据结构。它是存放消息的容器,消息从队尾入队,从队头出队,入队即发消息的过程,出队即收消息的过程。 再看今天我们最常用的消息队列产品(RocketMQ、Kafka 等等),你会发现:它们都在最原始的消息模型上做了扩展,同时提出了一些新名词,比如:主题(topic)、分区(partition)、队列(queue)等等。 2 消息模型队列模型P2P模式最初的消息队列就是上一节讲的原始模型,它是一个严格意义上的队列(Queue)。消息按照什么顺序写进去,就按照什么顺序读出来。不过,队列没有 “读” 这个操作,读就是出队,从队头中...
1 kafka入门
参考文献 原文链接:《超详细“零”基础kafka入门篇》 1 认识 kafkaKafka 是一个分布式流媒体平台 流媒体平台有三个关键功能: 发布和订阅记录流,类似于消息队列或企业消息传递系统。 以容错的持久方式存储记录流。 记录发生时处理流。 Kafka 通常用于两大类应用: 构建可在系统或应用程序之间可靠获取数据的实时流数据管道 构建转换或响应数据流的实时流应用程序 几个概念: Kafka 作为一个集群运行在一个或多个可跨多个数据中心的服务器上。 Kafka 集群以称为 topics主题 的类别存储记录流。 每条记录都包含一个 键,一个 值 和一个 时间戳。 Kafka 有四个核心 API: Producer API(生产者API): 允许应用程序发布记录流至一个或多个 kafka 的 topics(主题)。 Consumer API(消费者API): 允许应用程序订阅一个或多个 topics(主题),并处理所产生的对他们记录的数据流。 Streams API(流API): 允许应用程序充当流处理器,从一个或多个 topics(主题)消耗的输入流,并产生一个输出...
15 Redis缓存
1 缓存使用缓存步骤 前台请求,后台先从缓存中取数据,取到直接返回结果, 取不到时从数据库中取,数据库取到更新缓存,并返回结果, 数据库也没取到,那直接返回空结果 缓存预热缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据! 解决方法:1、直接写个缓存刷新页面,上线时手工操作下2、数据量不大,可以在项目启动的时候自动进行加载3、定时刷新缓存 缓存降级当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。 降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。 在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级 2 Redis作为缓存可能会出现的问题缓存穿透问题:当有大量用户不走我们设置的键值,就会直接走数据库,就会给数据库造成极大的压力,导...
附录1 面试问题
1 redis相比memcached有哪些优势? Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 3 redis常见性能问题和解决方案?(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内(4) 尽量避免在压力很大的主库上增加从库(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3… 4 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰...
2 智能指针
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117template <typename T>class SmartPtr{private: T *ptr; //底层真实的指针 int *use_count; //保存当前对象被多少指针引用计数public: SmartPtr(T *p); //SmartPtr<int>p(new int(2)); SmartPtr(const SmartPtr<T> &orig); //SmartPtr<int>q(p); ...
1 内存分配器
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105#ifndef __JJALLOC__#define __JJALLOC__#endif#include<new> // for placement new#include<iostream> //for cerr#include<cstddef> //for ptrdiff_t#include<cstdlib> // for exit()#include<climits> // for UINT_MAXnamespace my{ // 申请内存空间。调用operator new 。 // ...
5 时间类
6 实例——MyTime的实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192//------mytime...














