- 博客(31)
- 资源 (1)
- 收藏
- 关注
原创 一个二维矩阵,里面只有0和1,问怎样求指定某一个格与它数字相同的连通格子个数
一个二维矩阵,里面只有0和1,问怎样求指定某一个格与它数字相同的连通格子个数记录一下 感觉效率不高int iter(int x, int y, vector>& nums, vector>& dp){ int lenX = nums.size(); int lenY = nums[0].size(); if (x = lenX || y = lenY)
2016-03-18 11:08:22 4360
转载 printf缓存问题
转载至:http://www.cnblogs.com/zackyang/archive/2010/01/19/1651929.html#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main (int argc, char *argv[]){ printf("%d %d\n", getpi
2016-01-10 21:18:42 686
原创 return和exit
return和exit标签(空格分隔): APUE 在每个函数结束之后,习惯上都会return一下。而在main函数里面,既可以用return,也可以用exit来结束进程。现在来看看return到底做了什么。 先写一个简单的C程序:#include<stdio.h>int add(int ,int);int main(){ int a = 1; int b = 2;
2016-01-10 20:31:17 628
原创 软链接和硬链接
软链接和硬链接标签(空格分隔): APUE linux的文件系统里面,链接分为软链接和硬链接。现在ubuntu里面实际看一下,两者有什么区别。 先说在命令行里面怎么实现软链接和硬链接: touch file : 改变file的时间戳,如果file不存在,则新建file. ln file1 file2: 新建file2作为file1的硬链接。 ln -s file1 file2: 新建
2015-12-23 21:48:17 548
原创 MIT6.828 LAB4 PartB
JOS LAB4 PartB PartB主要讲述了fork的写时复制的实现,为了满足实现的要求,需要page_fault的实现,即页面异常处理。 这里主要实现几个系统调用函数,以供后面的fork实现调用。这些系统调用都比较简单。这里就看下 sys_exofork的实现。 sys_exofork这个函数只是fork函数的一个雏形,他的功能就是新建立一个进程,
2015-12-08 20:26:31 2139 1
原创 MIT6.828 Lab4 PartA
lab4地址:https://pdos.csail.mit.edu/6.828/2014/labs/lab4/ lab4主要是讲多核处理器的系统的实现,主要包括3个part,多核系统的实现,fork,和任务抢断。
2015-11-04 21:47:23 4043
原创 JOS 轮转调度实现
JOS的轮转调度思想比较简单,当env[i]进程来调用sched_yield()函数的时候,表示进程i要让出CPU了,此时,系统会从i开始,不停的往下寻找状态为runnable的进程,然后执行那个进程。
2015-11-04 21:19:27 1169
原创 JOS大内核锁
JOS lab4里面,采用了SMT的操作系统,所以可能存在两个CPU同时进入内核态,虽然CPU之间的内核栈,但是多核同步可能还是会出现问题,所以JOS采用大内核锁来锁住整个内核,使得每次只有一个CPU会进入内核,另外的CPU如果申请进入内核态,是进不去的。
2015-11-03 22:29:37 1067
原创 JOS 系统调用的过程
系统调用,是用户态进程转向内核态的一种安全机制,在保证了内核空间安全并且不被破坏的的前提下,让用户态程序可以实现一定的功能。通过JOS系统,来看系统调用的具体过程。系统调用,在语言层面来看,其实可以把系统调用看成是一种函数的调用。只是这种函数调用,不同于一般的用户态下的函数调用,用户态下,函数调用,只需要用栈来保存各种信息就可以了,因为调用前后,保存的信息的栈都是用户地址空间下的栈,所以只
2015-09-14 20:15:50 2813
原创 JOS 系统中第一个用户进程的建立和运行
一:进程的表示:在jos系统里面,进程用一个struct结构体Env来存储相应的信息,这个ENV的结构体有点类似于进程描述符一类的东西。struct Env { struct Trapframe env_tf; // Saved registers struct Env *env_link; // Next free Env envid_t env_id; // Un
2015-09-11 21:22:53 1789
原创 leetcode Sort List
sort list: https://leetcode.com/problems/sort-list/数组的排序比较相对于链表的,还是比较容易的。链表的排序,有一个最麻烦的地方就是,无法通过下标来访问节点,所以操作起来就没有数组那么方便。链表排序,拿到这题,第一个想到的是快排。快排的思路和数组的一模一样,只不过要多两个list指针,一个指向比较节点的left, 一个指向比较节点的r
2015-09-05 14:43:49 477
原创 二叉树遍历-----前序后序迭代遍历的新思路
leetcode二叉树遍历前序遍历:https://leetcode.com/problems/binary-tree-preorder-traversal/中序遍历:https://leetcode.com/problems/binary-tree-inorder-traversal/后序遍历:https://leetcode.com/problems/binary-tree-pos
2015-09-04 17:29:43 455
原创 ELF文件格式学习
最近的lab里面有ELF文件相关的,所以成这个几乎,学点ELF的东西。ELF,是一种文件格式。暂时,只看可执行文件的ELF文件格式。首先,给出文件的格式的布局图:光看这个很难理解,所以写一个小的程序,用readelf来结合的看。程序比较简单:#include #include int data[100] ={0};int bss[100];int main()
2015-08-30 12:22:55 2022
原创 MIT6.828 JOS系统 lab2
MIT6.828 LAB2:http://pdos.csail.mit.edu/6.828/2014/labs/lab2/LAB2里面主要讲的是系统的分页过程,还有就是简单的虚拟地址到物理地址的过程。关于系统分页,在MIT6.828 虚拟地址转化为物理地址——二级分页中有讲。下面主要是lab2的几个exercise的解题过程。1.第一个boot_alloc()函数:stat
2015-08-19 21:52:31 7648
原创 MIT6.828 虚拟地址转化为物理地址——二级分页
Mit6.828 Lab2:http://pdos.csail.mit.edu/6.828/2014/labs/lab2/lab2主要讲虚拟内存->物理内存的变换,通过一定的函数来实现软件MMU的部分。整个地址转化的过程如下图所示:首先,明确一点,在程序里面的所有地址,都是虚拟地址,程序里面是不会出现物理地址的,就算是物理地址,CPU也会把它当做虚拟地址,通过MMU转化为物理地
2015-08-06 20:14:35 3052
原创 leetcode39 Combination Sum
Combination Sum :https://leetcode.com/problems/combination-sum这道题目由于数据量比较大,所以好的方法和差的方法时间上来说,差非常的多。这道题目的主要要求就是:给定一个数组,和一个数T,要求用数组里面的数进行组合,使组合出来的数的和为数T,数组里面的数可以重复使用。如:[2,3,6,7]和数7,给出的解应该是:[7],
2015-08-05 21:48:03 458
原创 控制台下的计算器——C++实现
最近这段时间看操作系统的东西看的头晕脑胀的,所以先停个一晚上,写个命令行式的计算器,来练练栈的使用。首先,分析一下要完成的东西。输入肯定使用string类来输入的,然后第一步,就是把string的字符串转化成数字存储起来。转化的这个数字存储是中序表达式,由于运算符有优先级的问题,中序表达式直接计算结果不好计算,所以需要把他转化成后序表达式,最后进行计算。主要的函数:(1)把string
2015-07-30 20:53:57 2070 1
原创 136 Single Number
题目地址:https://leetcode.com/problems/single-number/题目:Given an array of integers, every element appears twice except for one. Find that single one.题目意思就是给一个数组,有一个数字只出现了一次,另外的数都出现了2次,要把这个出现一次的数找出来。
2015-07-05 13:20:25 483
原创 6.828 lab1 bootload
第一个练习,主要是让我们熟悉汇编,嗯,没什么好说的。Part 1: PC Bootstrap首先,整个实验使用qemu这款模拟软件来,来对代码进行调试,相当于我们在qemu这个模拟的计算机平台上,运行自己的程序。可以再qemu这个软件上进行gdb的调试,比较方便。首先看下整个内核在qemu上的模拟的结果:整个内核现在能实现的就两个功能,一个kerninfo,
2015-06-16 14:18:40 1983
原创 函数调用时程序堆栈的变化
这个主要写一点关于在C里面,堆栈是怎么保存数据的,以及调用函数时,堆栈指针的变化。首先说明两个寄存器1.rbp:栈帧指针,具体应该是指向当前函数栈的栈底,是不动的。实际的作用应该就是类似于一个基址,通过这个基址上栈中变量的寻址。2.rsp:栈顶指针。首先,写了一个比较简单的C程序:#includeint add_func(int arg1,int arg2){
2015-06-14 21:25:19 10459 2
原创 lab4 Cache Geometries 深入理解计算机系统——高速缓存
这个实验主要是将高速缓存命中的一点东西,意在告诉我们平常多注意这方面的东西。不懂java的,所以只管C的部分。You will do this several times, making small modifications to see what differences they make—how the choice of language affects
2015-06-10 20:52:25 3633
原创 csapp lab3 bufbomb 缓存区溢出攻击 《深入理解计算机系统》
这个实验主要是熟悉栈,和了解数据缓存区溢出的问题。数据缓存区溢出:程序每次调用函数时,会把当前的eip指针保存在栈里面,作为被调用函数返回时的程序指针。在被调用程序里面,栈是向下增长的。所有局部变量都存储在栈里面(静态局部变量除外)。假设有一个字符串变量str,在str读取数据时,如果缓存区没有进行一定的保护,会造成缓存区的溢出。由于栈是向下增长的,但是对于一个变量,如str,他的数据存储顺序
2015-06-08 15:53:35 5101 1
原创 gdb 命令使用
1.gdb -x command.txt每次重复输入命令很麻烦,可以使用上面的命令,把命令输入进command.txt里面,然后直接就可以执行gdb。2.list2.1 list function 打印function源程序2.2 list line1,line2 打印从line1到line2的程度3.断点查看当前断点信息: info b4找
2015-06-08 10:38:27 591
原创 csapp lab2 bomb 二进制炸弹《深入理解计算机系统》
bomb炸弹实验首先对bomb这个文件进行反汇编,得到一个1000+的汇编程序,看的头大。phase_1:0000000000400ef0 : 400ef0: 48 83 ec 08 sub $0x8,%rsp 400ef4: be 18 1b 40 00 mov $0x401b18,%esi 400ef9: e
2015-06-05 17:13:25 7653 1
原创 Search in Rotated Sorted Array
感觉这个题目在哪里看到过,面试有可能会被问起,所以还是记录一下。题目地址:Search in Rotated Sorted Array题目大意:有一组有序数据,从中间任意一个点进行一次旋转,如:0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2 现在要在这组数里面寻找一个值,如果存在,返回他的下标值,如果不存在,返回-1;解题思路:O(N)方法:最简单
2015-05-30 19:51:12 463
原创 155Min Stack
题目地址:155Min Stack最近为了提高数据结构和算法能力,保证每天一到leetcode的题目。从easy开始,感觉这道题目还蛮好,记录一下。题目大意:就是维护一个栈,获得栈中元素的的最小值。首先想到,在栈里面设置一个min变量,当栈push一个数时,和min比较,如果比他大,min不变,比他小,min更新。但是这样,pop了min之后就没有了min的数据了……也就是说,mi
2015-05-27 15:34:58 461
原创 可变长参数函数
可变长参数函数的参数数量可变。如printf,scanf等函数都是可变长参数函数。 对C语言来说,实现可变长参数函数要用到三个宏:va_start(),va_end(),va_arg()和一个特殊类型va_list,他们被包含在stdarg.h中。 void va_start(va_list ap, T last):初始化函数 void va_end(va_list a
2015-05-13 18:37:24 1119
原创 C++函数传值调用
C++的函数的参数调用是传值方式。想要改变传值调用,有引用和指针两种方式。其中,引用的实现机理也是通过一个指针,但是具体和指针传值的方式又不一样。具体见:C++中的指针与引用对于指针传值,其实实际上也是一个值传递,只是这个值是地址。所以在函数中改变*p的值,相应的调用函数的值也会改变。但是最近在做一点数据结构方面的东西,发现总是会出现以下错误。struct list{ int
2015-04-07 20:33:56 1226
转载 微软100题——1
#include#define Max 100struct search_tree{int n;search_tree *left;search_tree *right;};struct stack{search_tree *a[Max];int top;};void push(st
2014-10-26 22:12:51 521
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人