自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 4336

转载 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 671

原创 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 614

原创 软链接和硬链接

软链接和硬链接标签(空格分隔): APUE linux的文件系统里面,链接分为软链接和硬链接。现在ubuntu里面实际看一下,两者有什么区别。  先说在命令行里面怎么实现软链接和硬链接:  touch file : 改变file的时间戳,如果file不存在,则新建file.  ln file1 file2: 新建file2作为file1的硬链接。  ln -s file1 file2: 新建

2015-12-23 21:48:17 527

原创 MIT6.828 LAB4 PartB

JOS LAB4 PartB   PartB主要讲述了fork的写时复制的实现,为了满足实现的要求,需要page_fault的实现,即页面异常处理。          这里主要实现几个系统调用函数,以供后面的fork实现调用。这些系统调用都比较简单。这里就看下 sys_exofork的实现。     sys_exofork这个函数只是fork函数的一个雏形,他的功能就是新建立一个进程,

2015-12-08 20:26:31 2117 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 4006

原创 JOS 轮转调度实现

JOS的轮转调度思想比较简单,当env[i]进程来调用sched_yield()函数的时候,表示进程i要让出CPU了,此时,系统会从i开始,不停的往下寻找状态为runnable的进程,然后执行那个进程。

2015-11-04 21:19:27 1141

原创 JOS大内核锁

JOS lab4里面,采用了SMT的操作系统,所以可能存在两个CPU同时进入内核态,虽然CPU之间的内核栈,但是多核同步可能还是会出现问题,所以JOS采用大内核锁来锁住整个内核,使得每次只有一个CPU会进入内核,另外的CPU如果申请进入内核态,是进不去的。

2015-11-03 22:29:37 1039

原创 JOS 系统调用的过程

系统调用,是用户态进程转向内核态的一种安全机制,在保证了内核空间安全并且不被破坏的的前提下,让用户态程序可以实现一定的功能。通过JOS系统,来看系统调用的具体过程。系统调用,在语言层面来看,其实可以把系统调用看成是一种函数的调用。只是这种函数调用,不同于一般的用户态下的函数调用,用户态下,函数调用,只需要用栈来保存各种信息就可以了,因为调用前后,保存的信息的栈都是用户地址空间下的栈,所以只

2015-09-14 20:15:50 2771

原创 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 1741

原创 leetcode Sort List

sort list: https://leetcode.com/problems/sort-list/数组的排序比较相对于链表的,还是比较容易的。链表的排序,有一个最麻烦的地方就是,无法通过下标来访问节点,所以操作起来就没有数组那么方便。链表排序,拿到这题,第一个想到的是快排。快排的思路和数组的一模一样,只不过要多两个list指针,一个指向比较节点的left, 一个指向比较节点的r

2015-09-05 14:43:49 465

原创 二叉树遍历-----前序后序迭代遍历的新思路

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 450

原创 ELF文件格式学习

最近的lab里面有ELF文件相关的,所以成这个几乎,学点ELF的东西。ELF,是一种文件格式。暂时,只看可执行文件的ELF文件格式。首先,给出文件的格式的布局图:光看这个很难理解,所以写一个小的程序,用readelf来结合的看。程序比较简单:#include #include int data[100] ={0};int bss[100];int main()

2015-08-30 12:22:55 1969

原创 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 7605

原创 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 2997

原创 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 445

原创 控制台下的计算器——C++实现

最近这段时间看操作系统的东西看的头晕脑胀的,所以先停个一晚上,写个命令行式的计算器,来练练栈的使用。首先,分析一下要完成的东西。输入肯定使用string类来输入的,然后第一步,就是把string的字符串转化成数字存储起来。转化的这个数字存储是中序表达式,由于运算符有优先级的问题,中序表达式直接计算结果不好计算,所以需要把他转化成后序表达式,最后进行计算。主要的函数:(1)把string

2015-07-30 20:53:57 2036 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 472

原创 6.828 lab1 bootload

第一个练习,主要是让我们熟悉汇编,嗯,没什么好说的。Part 1: PC Bootstrap首先,整个实验使用qemu这款模拟软件来,来对代码进行调试,相当于我们在qemu这个模拟的计算机平台上,运行自己的程序。可以再qemu这个软件上进行gdb的调试,比较方便。首先看下整个内核在qemu上的模拟的结果:整个内核现在能实现的就两个功能,一个kerninfo,

2015-06-16 14:18:40 1958

原创 函数调用时程序堆栈的变化

这个主要写一点关于在C里面,堆栈是怎么保存数据的,以及调用函数时,堆栈指针的变化。首先说明两个寄存器1.rbp:栈帧指针,具体应该是指向当前函数栈的栈底,是不动的。实际的作用应该就是类似于一个基址,通过这个基址上栈中变量的寻址。2.rsp:栈顶指针。首先,写了一个比较简单的C程序:#includeint add_func(int arg1,int arg2){

2015-06-14 21:25:19 10374 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 3594

原创 csapp lab3 bufbomb 缓存区溢出攻击 《深入理解计算机系统》

这个实验主要是熟悉栈,和了解数据缓存区溢出的问题。数据缓存区溢出:程序每次调用函数时,会把当前的eip指针保存在栈里面,作为被调用函数返回时的程序指针。在被调用程序里面,栈是向下增长的。所有局部变量都存储在栈里面(静态局部变量除外)。假设有一个字符串变量str,在str读取数据时,如果缓存区没有进行一定的保护,会造成缓存区的溢出。由于栈是向下增长的,但是对于一个变量,如str,他的数据存储顺序

2015-06-08 15:53:35 5069 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 572

原创 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 7613 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 451

原创 155Min Stack

题目地址:155Min Stack最近为了提高数据结构和算法能力,保证每天一到leetcode的题目。从easy开始,感觉这道题目还蛮好,记录一下。题目大意:就是维护一个栈,获得栈中元素的的最小值。首先想到,在栈里面设置一个min变量,当栈push一个数时,和min比较,如果比他大,min不变,比他小,min更新。但是这样,pop了min之后就没有了min的数据了……也就是说,mi

2015-05-27 15:34:58 451

原创 可变长参数函数

可变长参数函数的参数数量可变。如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 1098

原创 C++函数传值调用

C++的函数的参数调用是传值方式。想要改变传值调用,有引用和指针两种方式。其中,引用的实现机理也是通过一个指针,但是具体和指针传值的方式又不一样。具体见:C++中的指针与引用对于指针传值,其实实际上也是一个值传递,只是这个值是地址。所以在函数中改变*p的值,相应的调用函数的值也会改变。但是最近在做一点数据结构方面的东西,发现总是会出现以下错误。struct list{ int

2015-04-07 20:33:56 1205

原创 快排

一个快排好多问题

2014-11-05 09:50:14 450

转载 char *p 和char *p[]

char *p 和char *p[]区别

2014-11-02 22:58:02 679

转载 微软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 507

mit6.828lab4

JOS中lab4的一个比较好的讲义。主要是一个lab4中的各个练习的介绍,对程序的编写有一定的帮助。

2015-11-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除