摘要: http://coolshell.cn/articles/7965.html前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的: 题目:请问下面的程序一共输出多少个“-”? 1#include2#include3#include45intmain(void)6{7inti;8for(i=0;i0,则是父进程(返回值是子进程的pid),这是众为周知的。 还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量, 阅读全文
posted @ 2013-07-24 15:42 herry_tu 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 首先它们最终都调用了内核里的do_fork()函数,然后完成了下述操作 1、调用alloc_task_struct()函数申请8KB的内核栈内存空间,供新建进程使用; 2、让指针指向父进程的PCB,然后将父进程的PCB内容拷贝到给新进程分配的PCB中去,此时父子进程完全相同,当然拷贝内容包括了:指令,变量值,程序调用栈,缓存区,环境变量等等,而此时若搭配一些有缓存的语句,就会出现意想不到的结果了,这是后话。 3、检查创建该进程后,是否越界,即该用户所拥有的进程数目是否超过了给它分配的资源的限制; 4、然后就是建立新创建的子进程的新的,独有资源,并且通知内核此进程已经诞生。 5、设置子进程的状态 阅读全文
posted @ 2013-07-24 15:29 herry_tu 阅读(1435) 评论(0) 推荐(0) 编辑
摘要: http://www.cppblog.com/superKiki/archive/2010/10/18/130328.html http://www.doc88.com/p-977311895786.html本文将总结一种数据结构:跳跃表。前半部分跳跃表性质和操作的介绍直接摘自《让算法的效率跳起来--浅谈“跳跃表”的相关操作及其应用》上海市华东师范大学第二附属中学 魏冉。之后将附上跳跃表的源代码,以及本人对其的了解。难免有错误之处,希望指正,共同进步。谢谢。 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找、插入、删除等操作时的期望时间复杂度均为O(logn.. 阅读全文
posted @ 2013-07-24 15:16 herry_tu 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 当一个进程从用户态进入内核态,CPU自动设置该进程的内核栈,这个栈位于内核数据段上。同时,为节省空间,Linux把内核栈和一个紧挨近PCB的小数据结构thread-info放在一起,占用8KB的内存区。 在Intel系统中,栈起始于末端,并朝这个内存区开始的方向“增长”。刚切换过来,内核栈是空的,堆栈寄存器ESP直接指向此内存区的顶端。通过找到thread-info来找到当前运行的task-struct(PCB)(,那么是怎样找到的呢?下边介绍)。 但是要注意,实际上进程的PCB所占内存是由内核动态分配的,更确切的说,内核根本不给PCB分配内存,而仅仅给内核栈分配8KB的内存,并把其中的一.. 阅读全文
posted @ 2013-07-24 14:47 herry_tu 阅读(1253) 评论(0) 推荐(0) 编辑
摘要: 操作系统的功能: 1 操作系统接口 2 CPU管理 3 内存管理 4 设备管理 5 文件管理 操作系统的设计采用分层结构,越是上层,越接近用户 操作系统=内核+系统程序 系统程序=编译环境+API+AUI 编译环境=编译程序+连接程序+装载程序 Linux内核是单内核结构,即把内核作为一个大整体来实现,而各模块之间可以直接调用相关函数 延迟执行机制----下半部分,软中断,Tasklet,工作队列等qsort包含在头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。 函数原型: void q... 阅读全文
posted @ 2013-07-24 14:43 herry_tu 阅读(233) 评论(0) 推荐(0) 编辑