- 博客(42)
- 资源 (6)
- 问答 (2)
- 收藏
- 关注
原创 失算问题(一)
1:问题提出相传现在流行的国际象棋是古代舍罕王的在想达依儿发明的。舍罕王十分喜爱象棋,决定让宰相自己要求得到什么赏赐。这位聪明的宰相指着8x8共64格的象棋盘说:陛下,请赏赐给我一些麦子吧,就在棋盘的第1个格子中放1粒,第2格放2粒,第3格放4粒,以后每一格子都比前一格增一倍,依次放完棋盘上的64格,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。请问,国王能兑现他的诺言吗?共有多少麦子赏
2015-06-29 00:48:44 1149
失算问题(一)
1:问题提出相传现在流行的国际象棋是古代舍罕王的在想达依儿发明的。舍罕王十分喜爱象棋,决定让宰相自己要求得到什么赏赐。这位聪明的宰相指着8x8共64格的象棋盘说:陛下,请赏赐给我一些麦子吧,就在棋盘的第1个格子中放1粒,第2格放2粒,第3格放4粒,以后每一格子都比前一格增一倍,依次放完棋盘上的64格,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。请问,国王能兑现他的诺言吗...
2015-06-29 00:48:00 228
原创 系统调用(二)
(五):系统调用的实现1:实现系统调用实现一个系统调用就是考虑他的用途,每一个系统调用都有一个确定的用途,在Linux中不提倡采用多用途的系统调用(一个系统调用通过传递不同的参数值来选择完成不同的工作)。2:参数验证系统调用必须仔细检查他们所有的参数是否合法有效。最重要的一项检查就是检查用户提供的指针是否有效。 在接收一个用户空间的指针之前,内核必须保证:1:指针指向的内存区域属于用户空间,进程
2015-06-23 20:35:29 956
系统调用(二)
(五):系统调用的实现1:实现系统调用实现一个系统调用就是考虑他的用途,每一个系统调用都有一个确定的用途,在Linux中不提倡采用多用途的系统调用(一个系统调用通过传递不同的参数值来选择完成不同的工作)。2:参数验证系统调用必须仔细检查他们所有的参数是否合法有效。最重要的一项检查就是检查用户提供的指针是否有效。 在接收一个用户空间的指针之前,内核必须保证:1:指针指向的内...
2015-06-23 20:35:00 184
原创 系统调用(一)
(一):与内核通信系统调用在用户空间和硬件设备之间添加了一个中间层。该层主要有三个作用:1:他为用户空间提供了一种硬件的抽象接口2:系统调用保证了系统的稳定和安全。3:每个进程都运行在虚拟系统中,而在用户空间和系统的其余部分提供这样一层公共接口,也是出于这种考虑。在Linux中,系统调用是用户空间访问内核的唯一手段。(二):API,POSIX,C库一般情况下,应用程序通过在用户空间实现的
2015-06-23 20:31:14 1169
系统调用(一)
(一):与内核通信系统调用在用户空间和硬件设备之间添加了一个中间层。该层主要有三个作用:1:他为用户空间提供了一种硬件的抽象接口2:系统调用保证了系统的稳定和安全。3:每个进程都运行在虚拟系统中,而在用户空间和系统的其余部分提供这样一层公共接口,也是出于这种考虑。在Linux中,系统调用是用户空间访问内核的唯一手段。(二):API,POSIX,C库一般情况下,应用...
2015-06-23 20:31:00 187
原创 进程调度(四)
紧接上一篇!!(二)抢占和进程上下文上下文切换,就是从一个可执行进程切换到另一个可执行进程,由定义在kernel/sched.c中的context_switch()函数处理,该函数主要完成两项基本工作:1:调用声明在asm/mmu_context.h中的switch_mm(),该函数负责把虚拟内存从上一个进程映射切换到新进程中。2:调用声明在asm/system.h文件中的switch_to(
2015-06-23 11:13:22 927
进程调度(四)
紧接上一篇!!(二)抢占和进程上下文上下文切换,就是从一个可执行进程切换到另一个可执行进程,由定义在kernel/sched.c中的context_switch()函数处理,该函数主要完成两项基本工作:1:调用声明在asm/mmu_context.h中的switch_mm(),该函数负责把虚拟内存从上一个进程映射切换到新进程中。2:调用声明在asm/system.h文件中的sw...
2015-06-23 11:13:00 141
原创 进程调度(三)
(一)睡眠和唤醒休眠(被阻塞)的进程处于一个特殊的不可执行状态。无论什么原因,导致进程进入休眠状态,内核的操作都是相同的:进程把自己标志成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用schedule()选择和执行一个其他进程。唤醒的过程正好相反,进程把自己标志成可运行状态,然后再从等待队列中移到可执行红黑树中。1:等待队列 休眠通过等待队列进程处理,等待队列是由等待某些事件的发生的进程组
2015-06-23 11:08:10 808
进程调度(三)
(一)睡眠和唤醒休眠(被阻塞)的进程处于一个特殊的不可执行状态。无论什么原因,导致进程进入休眠状态,内核的操作都是相同的:进程把自己标志成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用schedule()选择和执行一个其他进程。唤醒的过程正好相反,进程把自己标志成可运行状态,然后再从等待队列中移到可执行红黑树中。1:等待队列 休眠通过等待队列进程处理,等待队列是由等待某些事件的...
2015-06-23 11:08:00 143
原创 使用“结构”统计学生成绩
设学生信息包括学号,姓名和五门功课的成绩,要求编写输入输出 学生信息的函数。在输入一组学生信息后,以学生成绩的总分从高 到低顺序输出学生信息。这个相对来说比较简单,可以创建一个学生的结构体,结构体里面有三个成员:学号,姓名和五门功课的成绩。下面请看一下我的整体代码。这个思路也比较简单,主要是为了练习使用结构体。#include <stdio.h>#include <stdlib.h>#i
2015-06-19 01:34:28 2109
使用“结构”统计学生成绩
设学生信息包括学号,姓名和五门功课的成绩,要求编写输入输出 学生信息的函数。在输入一组学生信息后,以学生成绩的总分从高 到低顺序输出学生信息。这个相对来说比较简单,可以创建一个学生的结构体,结构体里面有三个成员:学号,姓名和五门功课的成绩。下面请看一下我的整体代码。这个思路也比较简单,主要是为了练习使用结构体。#include <stdio.h>#include &...
2015-06-19 01:34:00 454
原创 进程调度(二)
紧接上一文!!!!3:进程选择在CFS调度里面,当需要选择下一个进程的时候,将会选择最小的vruntime的进程。这个其实就是CFS调度的算法的核心。CFS使用红黑树来组织可运行进程队列,并利用其迅速找到最小的vruntime值的进程。在Linux中,红黑树是一个子平衡的二叉搜索树。下面我们就来看一下如何挑选下一个vruntime最小的进程。1):挑选下一个任务根据红黑树的原理,假设vruntim
2015-06-18 21:28:09 875
进程调度(二)
紧接上一文!!!!3:进程选择在CFS调度里面,当需要选择下一个进程的时候,将会选择最小的vruntime的进程。这个其实就是CFS调度的算法的核心。CFS使用红黑树来组织可运行进程队列,并利用其迅速找到最小的vruntime值的进程。在Linux中,红黑树是一个子平衡的二叉搜索树。下面我们就来看一下如何挑选下一个vruntime最小的进程。1):挑选下一个任务根据红黑...
2015-06-18 21:28:00 205
原创 进程调度(一)
调度程序负责决定将哪个进程投入运行,何时运行,以及运行多长时间。进程调度程序可看作在可运行态进程之间分配有限的处理器时间资源的内核子系统。(一):多任务多任务操作系统就是能并发的交互执行多个进程的操作系统,多任务系统可以分为两类:非抢占式多任务和抢占式多任务。Linux提供了抢占式多任务,在这个模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会,这个强制挂起的动作就叫做
2015-06-18 21:24:27 1072
进程调度(一)
调度程序负责决定将哪个进程投入运行,何时运行,以及运行多长时间。进程调度程序可看作在可运行态进程之间分配有限的处理器时间资源的内核子系统。(一):多任务多任务操作系统就是能并发的交互执行多个进程的操作系统,多任务系统可以分为两类:非抢占式多任务和抢占式多任务。Linux提供了抢占式多任务,在这个模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会,这个强制挂起...
2015-06-18 21:24:00 192
原创 进程管理(四)
接着上一文,我们看一下do_fork()函数:long do_fork(unsigned long clone_flags, unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size, int __user *parent_tidp
2015-06-16 20:55:44 1076
进程管理(四)
接着上一文,我们看一下do_fork()函数:long do_fork(unsigned long clone_flags, unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size, int __user *parent_...
2015-06-16 20:55:00 133
原创 进程管理(三)
(一):进程创建linux不同于其他操作系统,linux在进程的创建的时候,将进程的创建和执行程序分成了两个函数,fork()和exec()。进程在创建的过程中,首先通过fork()函数拷贝一份当前进程来创建一个子进程。子进程和父进程的区别仅仅在于PID,PPID(父进程的进程号,子进程将其设置为被拷贝进程的进程号)和某些资源以及统计量(被挂起的信号等)。exec()函数负责执行负责执行可执行文件并
2015-06-16 20:49:21 852
进程管理(三)
(一):进程创建linux不同于其他操作系统,linux在进程的创建的时候,将进程的创建和执行程序分成了两个函数,fork()和exec()。进程在创建的过程中,首先通过fork()函数拷贝一份当前进程来创建一个子进程。子进程和父进程的区别仅仅在于PID,PPID(父进程的进程号,子进程将其设置为被拷贝进程的进程号)和某些资源以及统计量(被挂起的信号等)。exec()函数负责执行负责执行可执...
2015-06-16 20:49:00 153
原创 扑克牌的结构定义
使用结构定义一副扑克牌,并对变量赋值 扑克牌有四种花色:草花,方块,红心和黑桃,可将花色说明为枚举类型。扑克牌类型为结构类型,包含两个成分:分别存储牌的花色和牌的面值,其中面值为字符数组。下面是代码的实现部分:#include <stdio.h>#include <stdlib.h>#include <string.h>/** * 使用结构定义一副扑克牌, * 并对变量赋值 * * 扑
2015-06-16 10:49:44 4952
扑克牌的结构定义
使用结构定义一副扑克牌,并对变量赋值 扑克牌有四种花色:草花,方块,红心和黑桃,可将花色说明为枚举类型。扑克牌类型为结构类型,包含两个成分:分别存储牌的花色和牌的面值,其中面值为字符数组。下面是代码的实现部分:#include <stdio.h>#include <stdlib.h>#include <string.h>/** * 使用结构...
2015-06-16 10:49:00 611
原创 进程管理(二)
进程描述符中包含的数据能完整地描述一个正在执行的程序:他打开的文件,进程的地址空间,挂起的信号,进程的状态等。1:分配进程描述符linux通过使用slab分配器分配task_struct结构,这样能够达到对象复用和缓存着色的目的。现在只需在栈底或栈顶创建一个新的结构struct thread_info结构即可。首先我们先看一下thread_info的结构:struct thread_info {
2015-06-16 01:10:59 787
进程管理(二)
进程描述符中包含的数据能完整地描述一个正在执行的程序:他打开的文件,进程的地址空间,挂起的信号,进程的状态等。1:分配进程描述符linux通过使用slab分配器分配task_struct结构,这样能够达到对象复用和缓存着色的目的。现在只需在栈底或栈顶创建一个新的结构struct thread_info结构即可。首先我们先看一下thread_info的结构:struct thre...
2015-06-16 01:10:00 131
原创 进程管理(一)
(一):进程的概念线程,是在进程中活动的对象。每个线程都拥有一个独立的程序计数器,进程栈和一组进程寄存器。内核调度的是线程而不是进程。在Linux中,进程和线程的区别比较微妙,一会我们通过源码来查看其两个的区别。进程提供两种虚拟机制,虚拟处理器和虚拟内存。其中在线程之间可以共享虚拟内存,但是每个线程都拥有各自的虚拟处理器。在linux中,创建一个进程的函数是fork(),该系统调用通过复制一个现有
2015-06-16 01:00:12 884
进程管理(一)
(一):进程的概念线程,是在进程中活动的对象。每个线程都拥有一个独立的程序计数器,进程栈和一组进程寄存器。内核调度的是线程而不是进程。在Linux中,进程和线程的区别比较微妙,一会我们通过源码来查看其两个的区别。进程提供两种虚拟机制,虚拟处理器和虚拟内存。其中在线程之间可以共享虚拟内存,但是每个线程都拥有各自的虚拟处理器。在linux中,创建一个进程的函数是fork(),该系统调用...
2015-06-16 01:00:00 142
原创 从内核出发
(一):内核源码的获取 1:通过网站 https://www.kernel.org/ 可以获得最新版本的内核源码,现在最新版的内核源码版本为如果想要获取之前版本的内核源码,点击进入 https://www.kernel.org/pub/ 进入分支。在《linux内核的设计与实现》的这本书中,我们使用的是 内核版本 2.6.18.2:从git中获取linux内核源码 在t
2015-06-15 15:55:02 922
从内核出发
(一):内核源码的获取 1:通过网站 https://www.kernel.org/ 可以获得最新版本的内核源码,现在最新版的内核源码版本为如果想要获取之前版本的内核源码,点击进入 https://www.kernel.org/pub/ 进入分支。在《linux内核的设计与实现》的这本书中,我们使用的是 内核版本 2.6.18.2:从git中获取linux内核源码...
2015-06-15 15:55:00 166
原创 通讯录的输入输出
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实数型别,显然,不能使用一个数组来存放这一组数据。因为数组中各个元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型–结构。他相当于其他高级语言中的记录。“结构”是一种构造类型,他是由若干“成员”组成的。每一个成员可
2015-06-15 10:06:02 1973
通讯录的输入输出
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实数型别,显然,不能使用一个数组来存放这一组数据。因为数组中各个元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型–结构。他相当于其他高级语言中的记录。“结构”是一种构造类型,他是由若干“成员”组成的。每一...
2015-06-15 10:06:00 247
原创 C实例--判断一个字符串是否是回文数
回文是指顺读和反读内容均相同的字符串,例如”121”,”ABBA”,”X”等。本实例将编写函数判断字符串是否是回文。引入两个指针变量,开始时,两个指针分别指向字符串的首末字符,当两个指针所指字符相等时,两个指针分别向后和向前移动一个字符位置,并继续比较,直到两个指针相遇,说明该字符串是回文,如果比较过程中发现两个指针指向的字符不相等,则判断该字符串不是回文。下面是代码的实现部分:#include <
2015-06-10 09:34:17 4978
C实例--判断一个字符串是否是回文数
回文是指顺读和反读内容均相同的字符串,例如”121”,”ABBA”,”X”等。本实例将编写函数判断字符串是否是回文。引入两个指针变量,开始时,两个指针分别指向字符串的首末字符,当两个指针所指字符相等时,两个指针分别向后和向前移动一个字符位置,并继续比较,直到两个指针相遇,说明该字符串是回文,如果比较过程中发现两个指针指向的字符不相等,则判断该字符串不是回文。下面是代码的实现部分:#i...
2015-06-10 09:34:00 541
原创 C实现字符排列
用已知字符串s中的字符,生成由其中n个字符组成的所有字符的排列。设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次。 例如,对于s[]=”abc”,n=2,则所有字符的排列有:ba,ca,ab,cb,ac,bc。算法思想: 使用递归完成该实例。举个例子:s = “abc”,n=2则第一个perm(n,s),即perm(2,”abc”);首先需要判断w中的字符个数是否满足,n
2015-06-10 08:58:12 1533 3
C实现字符排列
用已知字符串s中的字符,生成由其中n个字符组成的所有字符的排列。设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次。 例如,对于s[]=”abc”,n=2,则所有字符的排列有:ba,ca,ab,cb,ac,bc。算法思想: 使用递归完成该实例。举个例子:s = “abc”,n=2则第一个perm(n,s),即perm(2,”abc”);首先需要判断w中的字符个数...
2015-06-10 08:58:00 138
原创 GTK--布局管理
这一小结,将要学习将构建布局在窗口和对话框中.为了方便的管理我们的构件,在GTK+中,通常使用不可见的构件称作layout containers. 这一小节将要讨论GtkAlignment,GtkFixed,GtkVBox,GtkTable.(一):GtkFixed 容器构建GtkFixed用于布置子构件在一个固定的位置和设定固定的大小.这种构件并不属于自动的布局关系器.实质上,在大多数应用程序
2015-06-09 22:53:47 1372
GTK--布局管理
这一小结,将要学习将构建布局在窗口和对话框中.为了方便的管理我们的构件,在GTK+中,通常使用不可见的构件称作layout containers. 这一小节将要讨论GtkAlignment,GtkFixed,GtkVBox,GtkTable.(一):GtkFixed 容器构建GtkFixed用于布置子构件在一个固定的位置和设定固定的大小.这种构件并不属于自动的布局关系器.实质上,在大多数...
2015-06-09 22:53:00 219
原创 GTK学习3--菜单栏和工具栏
通过上一小节,基本上掌握了如何向窗口中添加菜单栏以及为menu_item添加快捷键,下面我们通过一个实例来创建选择菜单选项.GtkCHeckMenuItem就是一个可以生成带有选择的菜单选项.下面看一下代码:#include <gtk/gtk.h>void toggle_statusbar(GtkWidget *widget,gpointer statusbar){ if(gtk_check
2015-06-09 15:40:55 2996
GTK学习3--菜单栏和工具栏
通过上一小节,基本上掌握了如何向窗口中添加菜单栏以及为menu_item添加快捷键,下面我们通过一个实例来创建选择菜单选项.GtkCHeckMenuItem就是一个可以生成带有选择的菜单选项.下面看一下代码:#include <gtk/gtk.h>void toggle_statusbar(GtkWidget *widget,gpointer statusbar){ ...
2015-06-09 15:40:00 888
转载 near指针,far指针,huge指针
near指针和far指针 在DOS下(实模式)地址是分段的,每一段的长度为64K字节,刚好是16位(二进制的十六位)。near指针的长度是16位的,所以可指向的地址范围是64K字节,通常说near指针的寻址范围是64K。far指针的长度是32位,含有一个16位的基地址和16位的偏移量,将基地址乘以16后再与偏移量相加,(所以实际上far指针是20位的长度。)即可得到far指针的1M字节的偏移量。所
2015-06-04 23:02:50 606
near指针,far指针,huge指针
near指针和far指针 在DOS下(实模式)地址是分段的,每一段的长度为64K字节,刚好是16位(二进制的十六位)。near指针的长度是16位的,所以可指向的地址范围是64K字节,通常说near指针的寻址范围是64K。far指针的长度是32位,含有一个16位的基地址和16位的偏移量,将基地址乘以16后再与偏移量相加,(所以实际上far指针是20位的长度。)即可得到far指针的1M字节...
2015-06-04 23:02:00 180
如何实现android系统反root
2015-09-17
不同分区格式的访问问题
2015-09-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人