`
hongbochen1223
  • 浏览: 43767 次
文章分类
社区版块
存档分类
最新评论
文章列表
本实例有求设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字,性别和指向父亲,母亲,配偶,子女的指针(设只限两个子女)。要求编写以下函数: 增加一个新人的函数 建立人与人之间关系的函数, ...
在我们进行android开发的时候,经常遇到一些回调函数,其中,我们最常用的回调就是,当我们对一个组件设置监听的时候,其实就相对于设置的回调函数。例如: Button btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new Button.On ...
(1):问题提出 设由n个人站成一个圈,分别编号1,2,3,4….n。从第一个人开始报数每次报数为m的人被从圈中推出,其后的人再次从1开始报数,重复上述过程, 直至所有人都从圈中退出。要求程序由用户输入整数m和n,求这n个人从圈中推出的先后顺序。 (2):解决思路 可利用链表求解这个问题,先由n形成一个有n个表元组成的环,其中n个表元依次置值1~n。然后,从环的第一个表元出发,连续掠过m-1个表元,第m-1个表元的后继表元是第m个表元,将该表元从环中退出。接着再次从下一个表元出发,重复以上过程,直至环中表元都退出为止。 (三):代码实现 #include <stdio.h& ...
1:问题提出 相传现在流行的国际象棋是古代舍罕王的在想达依儿发明的。舍罕王十分喜爱象棋,决定让宰相自己要求得到什么赏赐。这位聪明的宰相指着8x8共64格的象棋盘说:陛下,请赏赐给我一些麦子吧,就在棋盘的第1个格子中放1粒,第2格放2粒,第3格放4粒,以后每一格子都比前一格增一倍,依次放完棋盘上的64格,我就感恩不尽了。 舍罕王让人扛来一袋麦子,他要兑现他的许诺。 请问,国王能兑现他的诺言吗?共有多少麦子赏赐他的宰相?合多少立方米(1立方米麦子1.42e8粒)?如果把这些麦子堆成一个正圆锥形的麦堆,这堆麦堆约多高? 2:分析 第1格1粒,第2格2粒,第3格4粒,第4格8粒,第5格16粒 ...
(五):系统调用的实现 1:实现系统调用 实现一个系统调用就是考虑他的用途,每一个系统调用都有一个确定的用途,在Linux中不提倡采用多用途的系统调用(一个系统调用通过传递不同的参数值来选择完成不同的工作)。 2:参数验证 系统调用必须仔细检查他们所有的参数是否合法有效。最重要的一项检查就是检查用户提供的指针是否有效。 在接收一个用户空间的指针之前,内核必须保证: ​1:指针指向的内存区域属于用户空间,进程决不能洪骗内核去读内核空间的数据 ​2:指针指向的内存区域在进程的地址空间里。进程决不能哄骗内核去读其他进程的数据 ​3:如果是读,该内存应被标记为可读,如果是写,该内存应被标记 ...
(一):与内核通信 系统调用在用户空间和硬件设备之间添加了一个中间层。该层主要有三个作用: ​1:他为用户空间提供了一种硬件的抽象接口 ​2:系统调用保证了系统的稳定和安全。 ​3:每个进程都运行在虚拟系统中,而在用户空间和系统的其余部分提供这样一层公共接口,也是出于这种考虑。 在Linux中,系统调用是用户空间访问内核的唯一手段。 (二):API,POSIX,C库 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程。一个API定义了一组应用程序使用的编程接口。 下面我们看一下POSIX,API,和C库以及系统调用之间的联系。 (三) ...
紧接上一篇!! (二)抢占和进程上下文 上下文切换,就是从一个可执行进程切换到另一个可执行进程,由定义在kernel/sched.c中的context_switch()函数处理,该函数主要完成两项基本工作: ​1:调用声明在asm/mmu_context.h中的switch_mm(),该函数负责把虚拟内存从上一个进程映射切换到新进程中。 ​2:调用声明在asm/system.h文件中的switch_to()函数,该函数负责从上一个进程的处理器状态切换到新进程的处理器状态。这包括保存,恢复栈信息和寄存器信息,还有其他任何与体系结构相关的信息,都必须以每一个进程为对象进行管理和保存。 下 ...
(一)睡眠和唤醒 休眠(被阻塞)的进程处于一个特殊的不可执行状态。无论什么原因,导致进程进入休眠状态,内核的操作都是相同的:进程把自己标志成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用schedule() ...
设学生信息包括学号,姓名和五门功课的成绩,要求编写输入输出 学生信息的函数。在输入一组学生信息后,以学生成绩的总分从高 到低顺序输出学生信息。 这个相对来说比较简单,可以创建一个学生的结构体,结构体里面有三个成员:学号,姓名和五门功课的成绩。下面请看一下我的整体代码。这个思路也比较简单,主要是为了练习使用结构体。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 200 #define SCORES 5 #define NUMLEN 10 /** * 设 ...
紧接上一文!!!! ​3:进程选择 在CFS调度里面,当需要选择下一个进程的时候,将会选择最小的vruntime的进程。这个其实就是CFS调度的算法的核心。 CFS使用红黑树来组织可运行进程队列,并利用其迅速找到最小的vruntime值的进程。在Linux中,红黑树是一个子平衡的二叉搜索树。 下面我们就来看一下如何挑选下一个vruntime最小的进程。 1):挑选下一个任务 根据红黑树的原理,假设vruntime就是节点的键值,那么如果要寻找最小的vruntime的进程,就是从树的根节点开始,一直向左寻找,一直找到树的最左边的节点即为vruntime最小的节点。 下面我们来看一下 ...
调度程序负责决定将哪个进程投入运行,何时运行,以及运行多长时间。进程调度程序可看作在可运行态进程之间分配有限的处理器时间资源的内核子系统。 (一):多任务 多任务操作系统就是能并发的交互执行多个进程的 ...
接着上一文,我们看一下do_fork()函数: long do_fork(unsigned long clone_flags, unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size, int __user *parent_tidptr, int __user *child_tidptr) { //新建一个新的,空的task_strtuct struct task_struct *p; ...
(一):进程创建 linux不同于其他操作系统,linux在进程的创建的时候,将进程的创建和执行程序分成了两个函数,fork()和exec()。进程在创建的过程中,首先通过fork()函数拷贝一份当前进程来创建一个子进程。子进程和父进程的区别仅仅在于PID,PPID(父进程的进程号,子进程将其设置为被拷贝进程的进程号)和某些资源以及统计量(被挂起的信号等)。exec()函数负责执行负责执行可执行文件并将其载入地址空间开始运行。 1:写时拷贝 在传统的fotk()函数中,直接将进程的所有的资源复制给新创建的进程,这样有一些不好的地方,首先,这样会使得进程创建缓慢,其次就是有很多没有必 ...
使用结构定义一副扑克牌,并对变量赋值 扑克牌有四种花色:草花,方块,红心和黑桃,可将花色说明为枚举类型。扑克牌类型为结构类型,包含两个成分:分别存储牌的花色和牌的面值,其中面值为字符数组。 下面是代码的实现部分: #include <stdio.h> #include <stdlib.h> #include <string.h> /** * 使用结构定义一副扑克牌, * 并对变量赋值 * * 扑克牌有四种花色:草花,方块,红心 * 和黑桃,可将花色说明为枚举类型。扑克牌类型 * 为结构类型,包含两个成分:分别存储 * 牌的花色和牌的面值 ...
进程描述符中包含的数据能完整地描述一个正在执行的程序:他打开的文件,进程的地址空间,挂起的信号,进程的状态等。 ​1:分配进程描述符 linux通过使用slab分配器分配task_struct结构,这样能够达到对象复用和缓存着色的目的。现在只需在栈底或栈顶创建一个新的结构struct thread_info结构即可。 首先我们先看一下thread_info的结构: struct thread_info { //所在的进程结构体 struct task_struct *task; /* main task structure */ //执行域 ...
Global site tag (gtag.js) - Google Analytics