linux

来源:互联网 发布:为什么知乎回答很慢 编辑:程序博客网 时间:2024/06/05 14:14

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

内核态抢占发生时机:
1.中断调用返回,need_resched == 1,
2.内核从不可抢占变为可抢占preempt_count(这个是持有锁个数) ==0,也是隐式调用schedule()
3.内核任务显示调用schedule,主动放弃cpu
4.内核任务被阻塞,显示调用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点要求;但还是用轻量级进程模拟线程。

0 0
原创粉丝点击