首页 > 学院 > 开发设计 > 正文

linux

2019-11-11 07:10:06
字体:
来源:转载
供稿:网友

2.6之前不支持内核抢占,支持用户抢占。用户态抢占必须等内核代码运行完毕,返回用户态前夕。内核抢占是在内核代码运行期间,内核态里其他代码间互相抢占。

内核态抢占发生时机:1.中断调用返回,need_resched == 1,2.内核从不可抢占变为可抢占PReempt_count(这个是持有锁个数) ==0,也是隐式调用schedule()3.内核任务显示调用schedule,主动放弃cpu4.内核任务被阻塞,显示调用schedule

判断是否可以抢占:1.当前任务不持有锁。也就是thread_info结构体中的preempt_count==0

内核抢占,在很多地方还是为了保护临界区资源而需要临时性的禁用内核抢占不可抢占情况很多,先说几个内核不可以抢占情况:1.中断2.当期进程持有锁3.内核正在调用schedule函数4.内核正在处理每cpu私有数据

任务调度时机:1.当前进程变为非可执行2.抢占:当前任务时间片用完 or 高优先级任务就绪

 

linux 将所有的线程都当作进程来实现。在linux2.6之前,内核并不支持线程的概念,仅通过轻量级进程(lightweight process)模拟线程在linux2.6之后,为了完全兼容posix标准,引入了线程组的概念(仍然用轻量级进程表示线程),有了这个概念就可以将一组线程组织称为一个进程,如此通过这个改变,linux内核正式支持多线程特性。

系统调用clone创建子进程时, 可以有选择性地让子进程共享父进程所引用的资源. 这样的子进程通常称为轻量级进程,又叫内核线程。

linux2.6前,用轻量级进程模拟线程,只实现了posix线程5点要求的1点;linux2.6,引入了线程组的概念,真正实现了posix线程所有的5点要求;但还是用轻量级进程模拟线程。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表