- 博客(21)
- 收藏
- 关注
原创 web server工作线程解读
类封装了与单个HTTP连接相关的所有操作,包括读取请求、解析请求、处理请求、生成响应和发送响应。方法来执行这一任务。工作线程的主要任务是处理客户端发起的HTTP请求。类封装了处理HTTP连接的逻辑,而工作线程通常会调用。类的方法来完成对每个客户端请求的处理。
2024-03-20 20:48:04
283
原创 xv6操作系统问答式梳理(MIT6.S081)
栈帧是因函数运行而临时开辟的空间,每调用一次函数,便会在栈上创建一个独立栈帧,其中存放函数中的必要信息,如局部变量、函数传参、返回值等。当函数运行完毕栈帧将会销毁。栈从高地址向低地址增长,sp指向栈顶(当前栈帧的位置,会移动),fp指向栈底,创建新的栈帧时对指针做减法栈帧大小不同,但return address、指向前一个栈帧的指针在固定位置栈帧中从高到低第一个 8 字节fp-8是 return address,也就是当前调用层应该返回到的地址。栈帧中从高到低第二个 8 字节fp-16。
2024-03-18 20:39:03
1153
原创 web server日志、定时器等相关面试题
需要记录日志时,日志类中的写方法会先检查日志行数有没有达到最大值,随后将日志信息添加到队列中,再由后台线程取出日志信息写入文件(后台线程处理,保证了不会阻塞主线程的运行)服务器启动时,创建监听套接字,绑定到指定端口,并开始监听;先私有化其构造函数(该类不能被外界实例化,构造方法只能为private),自行实例化(实例是当前类的静态成员变量),并用一个公有的静态方法获取该实例。为方便管理,日志是用单例模式实现的,首先调用方法获取日志的单例实例,并对日志初始化(指定日志级别、最大队列大小、同步or异步等)
2024-03-18 17:34:11
427
原创 web server线程池相关面试题
每个工作线程都会调用worker方法,该方法内部调用run执行任务,run在一个循环中运行,收到信号量通知,加上互斥锁,并从队头取一个任务,执行该任务,执行完释放互斥锁,等待下一个任务,直到线程池被停止。创建一个有最大线程数和最大请求队列长度的线程池,把线程设置为脱离状态,这样在线程结束时不会占用系统资源,并初始化一个信号量和互斥锁。当线程池不再使用时,会设置停止标志位通知工作线程停止工作,等待所有工作线程结束后,释放工作队列和线程数组占用的内存。你的线程池工作线程处理完一个任务后的状态是什么?
2024-03-18 15:28:31
256
原创 web server线程池解读
线程池是一种在程序运行时创建和管理线程的机制,它用于提高多线程程序的性能和响应能力。通过线程池,可以避免频繁创建和销毁线程的开销,同时可以有效地控制并发线程的数量,提高资源的利用率。
2024-03-18 14:56:49
403
原创 第七章:存储类、作用域、生命周期、链接属性
链接时.o目标文件→最终可执行程序,符号和对应的段链接起来(如:一个函数调用另一个函数时,已知符号,从别的.o文件中根据符号找到代码段,找到的代码和现有代码链接起来)只读数据段:程序运行时只能读不能写,烧录下载时可以写,const常量可能在只读数据段中(不同平台不一样,linux中放在普通数据段).data数据段和.bss段本质一样,分开是c语言编译器优化的结果,数据段中的内容需要一个个的复制(读写内存多)编译后生成.o目标文件,目标文件中有很多符号(编程中的变量名、函数名)、代码段、数据段、bss段。
2023-11-30 08:54:32
30
原创 第六章:宏定义、预处理、函数、函数库
宏定义会递归替换:直接解析到不是宏的部分//生成的汇编文件M换成10int b[10];宏定义第二部分可以带参数,称为带参宏 #define X(a,b) ((a)*(b)),第三部分可以有空格,且每个参数都应当加括号,最后再加括号//出错示例//得到z=(1*2+4),实际上想实现的是(1*(2+4))//MAX宏示例(a):(b))//int溢出可以设成无符号数,空间会大一倍#define NUM (32800UL)//16位机器会溢出,16位机器int为2字节带参函数&带参宏。
2023-11-30 08:48:29
41
原创 第五章:内存、字符串、结构体、共用体
三种申请方式都可以存储数据,如何选择?函数内部临时用→栈,局部变量变量只在程序一个阶段有用→堆变量存在程序始终→数据段。
2023-11-25 16:42:07
47
原创 第四章:指针高级应用
内存角度看,一维数组和二维数组没有本质差别,都是连续分布的格子,访问效率完全一样,但更好理解(另:平面直角坐标系、四轴飞行器用三维数组)typedef重命名的是类型(相当于数据模板,不占内存,对应C++中的类),不是变量(真实数据,占用内存,对应C++中的对象)二重指针也是指针变量,占四个字节,指针指向的变量是一重指针/指针数组,可以看成指针数组的指针,编译器会帮忙做类型检查。二维数组初始化:int a[2][2]={{1,2},{3,4}}或int a[2][2]={1,2,3,4}
2023-11-24 17:11:19
24
原创 第三章:指针
指针的实质是变量,但用途不同,指针变量存的是地址指针的出现是对间接寻址的封装高级语言JAVA,C#没有指针,语言本身封装了指针定义指针变量、为指针变量赋值(不赋值存随机数字)、解引用(*p=555)
2023-11-24 16:15:17
26
原创 第二章:位操作
bit 3 置1:a |=(1<<3)bit 3~bit 7置1:a |=(0b11111<<3)或者 a |=(0x1f<<3)bit 5清除:a &=(~(1<<5))bit 15~bit 23清除:a&=(~(0x1ff<<15))取出bit 3~bit 8:a&=(0x3f<<3),a>> =3bit 3~bit 8不变,其余清零,然后右移三位(先取数,再移动)
2023-11-24 16:03:51
22
原创 第一章:内存
内存单元大小的单位:位(一定是1 bit)、字节(一定是8 bit)、半字(一般16 bit)、字(一般32bit),字和半字取决于系统的位数,ARM系统一般是32位。C++:对内存进一步封装,可以使用new创建对象、分配内存,delete删除对象、释放内存(C、C++没有free,delete会内存泄露)堆内存申请指定大小,大小不变,要变化需要remalloc(重新申请、释放原空间、返回新的空间给用户,类似java的可变数组)内存可以随机访问,且可以读写,n位内存代表一个地址单元有n位(内存位宽为n)
2023-11-24 16:00:43
24
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人