没有合适的资源?快使用搜索试试~ 我知道了~
首页linux kernel常见面试题及部分答案.pdf
资源详情
资源评论
资源推荐

一、进程管理
0、网站收藏
http://www.360doc.com/content/13/0715/09/7775902_300057923.shtml
https://www.cnblogs.com/yanghaizhou/p/7705520.html
https://blog.csdn.net/gatieme/article/details/51577479
http://www.cnblogs.com/20135235my/p/5398066.html
https://blog.csdn.net/gatieme/article/details/52067748
https://blog.csdn.net/u010217401/article/details/66968182
https://www.cnblogs.com/jikexianfeng/articles/5648057.html
https://blog.csdn.net/absinjun/article/details/79462124
1.Linux 进程和线程如何创建、退出?
进程退出的时候,自己没有释放的资源(如内存没有 free)会怎样?
答:
进程创建:无论用户态是什么接口,再内核态都是 do_fork。linux 提供的
系统调用为 sys_fork/sys_vfork/sys_clone
进程退出:用户态接口为 exit, _exit, Exit, return 等正常退出,也有 abort
或 ctrl+c 等异常退出;在内核侧接口为 do_exit
进程退出时,会释放内存空间,进程线性空间与物理内存的映射关系也会取
消,即使进程自身没 free,在进程退出时也会被系统回收。
线程退出时,如果未释放内存资源,则在进程组退出之前,这段内存是不会
被系统回收的,因为线程用的是系统的 heap,没有自己独立的 heap。
线程创建:pthread_create
线程退出:pthread_exit/主函数 return/pthread_cancel/异常退出
子进程创建,退出:同进程的创建和退出

2.什么是写时拷贝?
答:linux 子进程创建时(fork),复制父进程的地址空间,这种复制是虚
拟地址空间的复制,没有发生实际的物理内存复制,所以速度快,代价低。当子
进程或父进程有写入地址空间的动作发生时,才发生物理内存复制。
在 linux 程序中,fork()会产生一个和父进程完全相同的子进程,但子进程
在此后多会 exec 系统调用,出于效率考虑,linux 中引入了“写时复制”技术,
也就是只有进程空间的各段的内容要发生变化时,才将父进程的内容复制一份给
子进程。
那么子进程的物理空间没有代码,怎么去取指令执行 exec 系统调用呢??
在 fork 之后 exec 之前两个进程用的是相同的物理空间(内存区),子进程的
代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间
不同,其对应的物理空间是一个。当父子进程中有更改相应段的行为发生时,再
为子进程相应的段分配物理空间。如果不是因为 exec,内核会给子进程的数据
段、堆栈段分配相应的物理空间(至此两者都有各自的进程空间,互不影响),而
代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为 exec,
由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。
fork 之后内核会将子进程排在队列的前面,以让子进程先执行,以免父进
程执行导致写时复制,而后子进程执行 exec 系统调用,因无意义的复制而造成
效率的下降。

3.Linux 的线程如何实现,与进程的本质区别是什么?
答:linux 线程为轻量级进程,使用 posix 库的 pthread_create 创建。
本质区别,进程并不执行什么, 只是维护应用程序所需的各种静态资源,包
括内存、文件表、文件、信号等;而线程是执行实体,维护运行相关资源,包括
栈、调度控制信息、待处理的信号集等,线程以 task_struct 参与内核调度。一
个进程里面可以有多个线程,这些线程由内核自动调度,并且每个线程有它自己
的线程上下文(thread context),包括线程 ID、栈、栈指针、程序计数器、
通用目的寄存器和条件码。即,每个线程对应内核中一个 task_struct 结构。

4.Linux 能否满足硬实时的需求?
不能。linux 无法预期实时进程从被唤醒到被执行的时间,延时无法预期的
系统无法满足硬实时。因为,在 Linux 有三类区间是不可以抢占调度的,这三
类区间是:中断、软中断、持有类似 spin_lock 这样的锁而锁住该 CPU 核调度
的情况。无论进程优先级多高,都不如中断和软中断的“优先级”高,或者允许
抢占之前,进程都不会得到调度。决定进程是否能抢占的关键在于调度器,而调
度器函数被执行时,是否执行“抢占”这个动作,又是由如下两个条件决定:a.
preempt_count()是否为 0;b.中断是否禁止。
即,如果 preempt_count()不为 0 或中断被禁止时,调度器函数直接返
回,不执行调度,也即不抢占。这说明,linux 认为,当有人关闭抢占
(preempt_count 不为 0)或发生中断处于中断上下文时(发生中断后,会先
关闭中断),不再对进程进行调度。当有实时性要求高的任务恰好在这期间请求
CPU 资源时,从它被唤醒到被执行,延迟时间不可期,所以不满足硬实时要求。
要想达到硬实时,就要求实时性要求高的任务能第一时间被调度,而中断和软中
断的优先级要低于实时进程的优先级(在 RT_PREEMPT 补丁中之所以要将中

断线程化就是因为硬中断的实时性太高,会影响实时进程的实时性,所以需要将
中断处理程序线程化并设置优先级,使中断处理线程的优先级比实时进程优先级
低,从而提高系统实时性
https://blog.csdn.net/qq405180763/article/details/24120895)。
linux 不具备硬实时的举例分析如下图,一个绿色的普通进程在 T1 时刻持
有 spin_lock 进入一个 critical section(该核调度被关),绿色进程 T2 时刻
被中断打断,而后 T3 时刻 IRQ1 里面唤醒了红色的 RT 进程(如果是硬实时
RTOS,这个时候 RT 进程应该能抢入),之后 IRQ1 后又执行了 IRQ2,到 T4
时刻 IRQ1 和 IRQ2 都结束了,红色 RT 进程仍然不能执行(因为绿色进程还在
spin_lock 里面),直到 T5 时刻,普通进程释放 spin_lock 后,红色 RT 进程
才抢入。从 T3 到 T5 要多久,鬼都不知道,这样就无法满足硬实时系统的“可
预期”的确定性的延迟性,因此 Linux 不是硬实时操作系统。
剩余31页未读,继续阅读













安全验证
文档复制为VIP权益,开通VIP直接复制

评论0