- 博客(73)
- 收藏
- 关注
原创 进程管理方式
1、Supervisor2、Crontab设置定时任务,定时任务的粒度为分钟级的。5个星号按顺序排列如下1. 一小时内的分钟2. 一天内的小时3. 一个月内的日期4. 一年内的月份5. 一周的内的天示例:30 5 10 * * 表示该工作应该在每个月10日上午5:30运行* * * * 1-5 表示该工作应该每周一至周五运行*/2 * * * * 表示该工作应...
2020-01-09 20:55:52
325
原创 错误&异常获取
PHP内置方法1、set_exception_handler(exceptionhandler); //设置用户定义的异常处理函数; exceptionhandler规定当一个未捕获的异常发生时所调用函数的名称2、set_error_handler(error_function,error_types) ;//设置用户自定义的错误处理函数,该函数用于创建运行时期间的用户自己的...
2020-01-09 20:26:40
300
原创 零拷贝
Nginx配置中又一个sendfile配置,sendfile是零拷贝的一个方法。1、零拷贝的原理是什么1)DMA传送方式 CPU与外设之间的数据传送方式中断传送方式、DMA传送a、中断传送方式 中断传送方式是指当外设需要与CPU进行信息交换时,由外设向CPU发出请求信号,使CPU暂停正在执行的程序,转而去执行数据输入/输出操作,待数据传送结束后,C...
2020-01-06 21:02:55
196
原创 php面向对象之类的创建
<?phpclass Car{ public function __construct($name)#构造函数 { $this->name = $name; } public function __destruct()#析构函数 { echo "删除对象"; } private $name; p
2017-11-15 18:26:36
292
原创 小结小结
1.管道为什么是半双工2.原子锁,互斥锁(总线加锁),读写锁? 3.quickSort的优化,插入排序嵌套,递归变成循环,对轴的选择。4.共享内存的实现原理,内存地址映射到一块相同的物理内存。5.写时拷贝6.进程和线程的区别被其它线程读写。5.线程的并发性。6.系统开销,线程进程创建销毁的开销进程线程切换的效率大小不同,进程的效率是线
2017-10-13 21:16:53
308
原创 杂记小结
1.管道的大小有默认值65536个字节,即是2的16次方,而与tcp相比较,都是字节流,管道的大小可以通过fcntl函数来修改 全双工的管道socketpair并行性:两个及多个事件同一时刻发生并发性:两个或多个事件在同一时间间隔内发生对象:是指现实世界中具有相同属性,服从相同规则的一系列事务的抽象2.提高服务器的性能 1.分布式,何为分布式
2017-10-13 21:07:09
272
原创 锁小结
锁(程序员的自我修养,liunx)同步与互斥: 同步:对多个相关进程在执行次序上进行协调,使并发指向的诸进程之间能按照一定的规则共享系统资源,并能很好的相互合作,从而来保证程序的执行可再现性 互斥:一个时间段内,只能有一个进程访问这个资源,资源的排他性。区别与同步,诸进程间可以无序访问 信号量和互斥锁的区别: 互斥量值只
2017-10-13 21:03:54
386
转载 函数的调用方式小结
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) //表明asmlinkage是通过栈来传递参数而不通过寄存器来传递参数#define fastcall __attribute__((regparm(3))) //参数不是通过栈传递,而是直接放到寄存器里,被调用函数直接从寄存器取参数缺省的时候是通过寄
2017-10-13 21:01:54
287
转载 虚拟地址映射小结
32位----两级页表映射段寄存器16位,其中低两位表示的是在权限,内核态,用户态。第底三位表示的是GDT,LDT,其余十三位用来表示在GDT中的偏移GDT中的段描述项,表示基址32位,P位-是否在内存中,还有表示读写可执行权限 64字节CR3中存储--PGD地址MMU中:页目录项--页面表--物理页面页目录项,20位表示下一层的页面地址 最低位P位表示所映
2017-10-13 21:00:03
636
原创 进程切换小结
谁在调用schedule进行该进程的调度: 进程在运行中,会有几种情况发生中断,第一就是在时钟中断,进入中断处理程序,调用schedule,第二返回用户空间的时候ret_from_sys_call时进行检查是否该调度了。exit函数和sleep这些函数则主动调用scheduleschedule中进行进程的切换,只能是由进程在内核中主动调用,或者在当前进程从系统空间返回用户空
2017-10-13 20:58:43
907
原创 fork剖析小结
fork是完全复制 clone则是将资源有选择的复制给子进程,没有复制的资源通过指针的复制让子进程共享,其中的flag用户可以进行设置来进行选择复制共享 vfork 除了task_struct结构和系统空间堆栈以外的资源全部都通过数据结构复制的继承 子进程复制了父进程当前的寄存器值,将子进程加入到进程调度的就绪队列,父子进程拥有相同的页表,然后映射到相同的物理页
2017-10-13 20:54:02
324
原创 动态内存分配小结
malloc/calloc/free是库函数,在底层使用系统调用进行内存申请,自己添加了中间层进行管理,brk,sbrk,mmap,munmap是系统调用.申请的是虚存mmap 映射匿名页, 当发生缺页异常时, linux 内核为缺页分配一个新物理页,并将该物理页清 0对空闲的小内存块只会在 malloc 和 free 的时候进行合并主分配区与非主分配区用环形链表进行管理。 每一个分配区利用互斥锁
2017-10-13 20:48:09
429
原创 引用与指针
引用与指针的区别:1.引用同指针的底层一致,引用的底层就是指针2.引用必须初始化,且不能被NULL初始化,初始化后绑定此对象不能再被改变。指针可以不初始化,可以被NULL初始化,且可以改变指向其他的对象3.引用和指针对于sizeof,自增自减等运算符的不同4.引用比指针更加安全,引用不能为NULL,引用必须初始化等特点#include //对于引用是否有内存空间的验证using
2017-10-07 18:41:20
287
1
原创 extern的总结
extern可以修饰变量也可以修饰函数修饰变量和函数的时候,只是修饰其声明而不修饰定义,告诉编译器,此变量或者函数的定义在别的文件之中,生成的符号是global的,此相对于static关键字。extern可以用于C++和C函数的相互引用: 当C函数引用C++代码时,需要对.cpp文件中的C++代码的定义加extern "C"修饰,例如extern “C”{ void
2017-08-26 21:07:23
255
原创 使用库函数实现自定义类型的排序
class Type{public: int a; Type(int x, int y):a(x),b(y){} Type():a(0),b(0){} int b;};////////////////////////使用qsort对自定义类型进行排序,需要提供一个比较函数,传递给qsort的函数指针参数int compared(const void*x, const void *
2017-08-24 19:46:11
328
原创 socket编程之listen
打开了三个客户端端与服务器端建立连接,一个客户端发起之后会有两个条目产生,在开始前的两个client建立连接时,产生的服务器端和客户端段的状态都是estblisted,但是直到第三个时,客户端的状态端是estbllished,服务器端的是sys_recv状态。猜测在listen时已经发了三次握手中的前两次,但是第三此客户端给服务器端发送的ack可能需要accept来接收才能建立完全的连
2017-08-21 11:22:00
639
原创 虚函数的默认传参问题
class A{public: virtual void fun(int num = 10) { cout<<"A"<<num; }};class B:public A{public: virtual void fun(int num =100) { cout<<"B"<<num<<endl; }};int main(){ B b; A &a = b;
2017-08-19 11:29:24
526
原创 测试粘包现象
服务器#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;int main(int argc, char *argv[]){ int sockfd = 0;
2017-08-08 21:23:36
442
原创 管道
#include#include #include #include int main(){ int fd[2]; if(pipe(fd)<0) { return -1; } int pid = fork(); if (pid == 0) { char *str="niaho zhongguo"; sleep(12); int res = write(fd[
2017-08-02 10:56:43
541
原创 函数调用方式
#include #include //通过栈传入值的话void _fastcall funcFast(int a, int b){001C1B2F pop ecx 001C1B30 mov dword ptr [b],edx 001C1B33 mov dword ptr [a],ecx printf("%d", a+b
2017-07-31 10:13:09
473
原创 智能指针
#include using namespace std;#include //容器使用迭代器进行遍历使用//shared_ptr 强引用,将指针所指之物与自己的声明周期紧密联系,一旦自己析构,就会使得引用计数减1//weak_ptr 弱引用 不能决定底层指针的生命周期,只能根据自己的成员对象去探测是否对象存活shared_ptr test(){
2017-07-04 10:19:03
258
原创 select、poll
linux中的select,poll两种都在select.c中实现,两者的结构相似,基本原理也相似,且底层有使用相同的结构体。select参数有文件描述符的最大数+1,三种监视的事件的文件描述符位数组,分别是读事件,写事件,异常事件,还有一个超时时间。poll的参数有一个数组,数组元素是struct pollfd,其中包含了所要监视的文件描述符和所要监视的事件。还有一个文件描述符的个数和一
2017-07-02 23:26:43
302
原创 STL内存管理
STL中的内存管理分为两级配置器,一级配置器是当内存大于512B时候使用系统系统的malloc/free进行申请释放二级配置器,将内存分为大小间距为8的等长度的chunk,使用数组进行管理。数组中存储的是大小一定的链式等大小内存块。在STL中使用长度为16的数组,0处存储8Byte,然后依次16,24,36.....依次加8字节。二级配置器维护着一个内存池,如果所申请的内存块中数组的链表下为空
2017-06-25 22:39:19
1126
原创 const test
/*int main(){ //const int pp; //常量,必须进行初始化 int a = 10; int *p=&a; //int *const m;//必须进行初始化 const int *q;//可以不进行初始化 q = &a;//q 可以进行赋值 *q不能进行修改 //去掉离其最近的类型,const修饰的就是它 const int *const *u ;//
2017-05-06 23:30:53
447
原创 select范例
/////////////select server//////////////////#include #include #include #include #include #include using namespace std;#include #include #include //struct timeval//{// time_t tv_sec; 表示秒 /
2017-05-04 22:21:50
365
原创 STL容器及排序问题
deque(双端队列)底层是一是双端队列,组合结构构成,功能上和vector相似,提供了'[]'和'='运算符重载函数list(列表)的底层是一个双向链表,提供了前插,尾插,前删,尾删,提供了 '='的运算符重载函数vector(向量)的底层是一个数组,有指针失效的情况。可以通过erase和迭代器来删除其中任何一个元素可以通过insert和迭代器将数组或者某个数组插入到指定位置。提
2017-05-04 22:17:19
417
原创 流量控制和拥塞控制
滑动窗口:要保证正确的传输,要对已经发送的数据进行确认。如果每发送一个分组,等待数据的确认,然后再发送下一个分组,这样的效率太低。所以制定了滑动窗口。对于发送方来说,落在滑动窗口中的数据均可进行发送,所在在某个时刻中,滑动窗口中的数据有两种状态,一是已经发送的,一是等待发送的数据。发送完数据要等待对方的确认,确认之后,滑动窗口才可以向后移动,如果到了超时时间或者对方请求重传就重新进行发送,
2017-05-01 23:13:27
510
原创 虚继承
///d1reportSingleClassLayout**#include using namespace std;/*class A{ int a;public: virtual void af(){cout<<"a";}};class C:virtual public A{ int b;public: void af(){cout<<"b";}};int m
2017-04-21 15:37:31
263
原创 malloc内存管理
alloc一次批发一大段的地址空间,然后对其进行管理。类似操作系统发展之中为进程管理内存使用的算法:首次适应算法,最佳算法,下次适应(NF)算法,还有如伙伴系统,哈希算法等等。将堆看成一大数组,对数组内存进行管理。申请内存就是从中获得某子数组空间。管理内存方法的好坏优劣如:1>来回的的申请释放产生尽可能少的外部碎片,使得来的任务需要较大的内存能得到分配 2>申请释放时候的效率,分配时候的效率,合并内存的效率。3>较少的使用辅助的内存,提高利用率。管理内存使用的有显示链表和隐式链表,隐式链表是在数组内部通过
2017-04-16 22:30:28
515
原创 线索二叉树
利用线索二叉树实现中序遍历#include #include #include using namespace std;//构建线索化二叉树,用其进行中序遍历及中序逆遍历typedef char elemType;typedef enum thread{ LINK=1,THLINK}THREAD;typedef struct _node{ _node *leftCh
2017-04-09 13:38:21
308
原创 链表逆置递归
#include using namespace std;typedef int ElemType;typedef struct _Node{ ElemType data; struct _Node *next;}Node;Node* initNode(){ Node *ptr = (Node *)malloc(sizeof(struct _Node)); if (p
2017-03-27 16:38:41
1376
原创 斐波那契递归消除重复性
#include using namespace std;void fibo_loop(int num);int fibo_recurisv(int num);int main(){ cout<<fibo_recurisv(44); //fibo(0,1,44); return 0;}//递归方法且消除了重复性static int temp = 1;int fibo_
2017-03-16 13:20:55
524
原创 GIt命令
Git init初始当前目录为git可以管理的仓库Git add filename 添加至仓库Git commit –m “tag of this commit”Git status 查看状态Git diff filename 查看具体修改的内容Git log 查看提交日志 ----------gitreflogGit reset –hard commit_id 回退到上
2017-02-24 20:36:03
259
原创 java连接oracle之修改
import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;class alter{ String sql = null; int index = 1; public int toChose(Connection con, int chose, String st
2016-12-21 23:22:11
405
原创 java连接oracle之修改
import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;class alter{ public int toChose(Connection con, int chose, String str, String var) { sql = "update
2016-12-21 23:17:51
310
原创 java连接oracle之删除
class deleteByTerms{ int index = 1; String sql = null; public boolean toChoose(Connection con, int chose, String var) { switch(chose) { case 1: sql = "delete from worker_main where worke
2016-12-21 23:09:31
1106
原创 java连接oracle之增加
import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;class insert{ int toChose(Connection con, int chose, String str) { String sql = null; if (chose ==
2016-12-21 23:04:11
521
原创 java连接oracle之查询
class QueryByTerms{ int index = 1;//参数的位置 public ResultSet toChoose(Connection con, int chose, String var) { String sql = null; switch(chose) { case 1: sql = "select * from worker_main
2016-12-21 22:58:50
1018
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人