摘要:
我们当然可以根据栈的特性,向实现链表一样实现栈。但是,如果能够复用已经经过实践证明的可靠数据结构来实现栈,不是可以更加高效吗? so,今天我们就复用Linux内核链表,实现栈这样的数据结构。 要实现的功能很简单,如下(项目中如需更多功能,可自行添加): 我们先来说,栈的创建: 非常简单,和内核链表一 阅读全文
摘要:
本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offsetof和container_of宏,并对内核链表设计原因作出了解释,一步步引导到list_for_eac 阅读全文
摘要:
以前学生时代,只是完成功能就行,进入公司之后,由于产品的特殊性,需要非常考虑效率,发现有以下几个策略(该文不定时更新): hash%length==hash&(length-1)的前提是length是2的n次方 当 B满足是2的n次方时,有 A%B == A & (B-1) 使用后者的效率比求余操作 阅读全文
摘要:
这是yjy的习题库,中途我在使用fgest时颇费了一点心思,特此记录一下。 阅读全文
摘要:
/* 未知数 p1,p2,p3,p4,p5,满足: (1) p1 与 p3 均为 2 位的正整数;p5 为 3 位的正整数; (2) p2 与 p4 低两位(例:数值‘123’取低两位则为‘23’)数值相等; (3) 且: p2 = p1 * 809 + 1; p3 = p1 * 8; p4 ... 阅读全文
摘要:
线程是进程中最小的执行单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 线程,其实也是轻量级的进程。一个进程,即使我们没有主动创建线程,也会有一个默认的主线程(即 阅读全文
摘要:
操作系统相关的代码,始终还是代码,即肯定需要相应的调试工具。 Bochs是一种十分轻便的使用c++编写的开源IA-32(x86)电脑模拟器,可以运行在最受欢迎的平台上。能仿真英特尔x86 CPU、常见的I/O设备、和定制的BIOS,支持断点调试,调试方法和GDB非常相似。 现在官网下载Bochs的源 阅读全文
摘要:
1.管道 对于具有公共祖先的进程,其管道是建立在3-4G的内核空间中的。每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制 阅读全文
摘要:
fork 函数,创建子进程。 函数原型: 关于其返回值: fork函数一次调用,两次返回。子进程中返回0,父进程中,返回子进程的ID。如果fork失败,返回-1.并且不会创建子进程,同时错误代码errno会被设置。 fork的读时共享,写时复制机制。子进程拥有和父进程一样的0-3G用户空间,但是3- 阅读全文
摘要:
ls -l 通常会显示r w x权限,分别对应:读,写,执行权限。 但是有时我么会看到,s或t这类权限标识。 eg: 首先在主目录下面的文件夹里面编译并执行该test.c文件,生成a.out可执行程序,由于umask为0002的原因,权限为:775而不是777。 在此时执行a.out会生成hello 阅读全文
摘要:
有符号数的溢出本就是不确定的(标准未定义),编译器不同可能有不同的实现。 但即使是这样(上面两种方式最后结果都一样),上面的结果也是正确的。 复杂的数学推倒就不打算研究了。 通俗理解就是,上面的语句,即使溢出去,也会溢回来。 链接:https://www.nowcoder.com/questionT 阅读全文
摘要:
题目描述 时间限制:1秒 空间限制:32768K 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的 阅读全文