1.简单说明linux是如何创建进程的?
1)将创建进程的两个步骤分解到两个单独的函数中去实现,fork()和exec()。
2)首先fork()通过拷贝当前进程创建一个子进程,子进程与父进程的区别在于pid,ppid和某些资源的统计量。
3)通过clone()系统调用实现fork()。这个调用通过一系列参数标志来指明父,子进程需要共享的资源。fork(),vfork()和clone()库函数都根据各自的需要的参数标志去调用clone(),然后由clone()去调用do_fork()。
4)do_fork()调用copy_process()函数去实现内核栈,分配资源,设置子进程的状态等等。
5)回到do_fork()函数,如果copy_process函数成功返回,新创建的子进程被唤醒并让其投入运行。
2. 如何理解cow (copy on write)
1)是一种可以推迟甚至免除数据拷贝的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。
2)只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝,也就是说,资源的复制只有在需要写入的时候才会进行,在此之前,只是以只读方式共享。这种技术使地址空间上的拷贝被推迟到实际发生写入的时候才进行。
3.linux进程调度追求的目标是什么?其完全公平调度算法cfs的思想是什么?
1)进程响应迅速(响应时间短),最大系统吞吐量。
2)对时间片的分配方式进行重新设计,完全摒弃时间片而是分配给进程一个处理器使用权重;允许每个进程运行一段时间,循环轮转,选择运行时间最少的进程作为下一个运行进程,而不再采用分配给每个进程时间片的做法了,cfs在所有的可运行的进程中总数基础上计算出一个进程应该运行多久,而不是依靠nice值来计算时间片。nice值在cfs作为进程获得处理器时间的运行比权重。
4.内核提供了哪几种数据结构?说明每种数据结构适用的场景?
链表:对数据集合的操作主要是遍历数据,即使用链表;
队列:**符合消费者和生产者模式,则使用队列,特别是要一个定长缓冲,队列会使得添加和删除项的工作变得简单;
映射:需要映射一个uid到一个对象,使用映射;
二叉树:需要存储大量数据,并且迅速检索,红黑树最好。
5.linux将中断处理切分成哪两部分?为什么?
1)切分成上半部和下半部;
2)顶半部使得中断阻塞尽可能的短,而底半部能够使得完成耗时的任务容易些。即既满足使得中断处理程序运行的快,又让中断处理程序完成的工作量多。
西电Linux内核分析大作业
linux内核作业。进程是通过list head双向链表连接起来的,所以根据一个进程就可以得到其他的进程描述符。要获得第一个进程,我们选择了init进程。要把进程以树的形式输出,所以要用到深度优先遍历。在进程描述符中,通过children可以获得这个进程的子进程。根据优先遍历的方法,进行递归的打印输...
linux原理与应用作业
作业。第一次作业 1 关机指令有哪些 2 linux系统启动过程是什么?第二次作业。1 按照如下的格式添加用户 loginname passwd userid group id user full name home directory login shell 按照上面的序列添加张三,李四,王二,几...
linux基础 进程与作业管理
学生课程实验报告书。课程 linux操作系统 10 级计算机与信息科学系。网络工程专业班。学号 10 姓名。指导教师 2012 2013 学年第 2 学期。一 实验项目 进程与作业管理。二 实验日期 2013 年 4月 16日。三 实验原理 掌握桌面环境下进程与作业的查看 前后台作业的切换 字符界面...