您好、欢迎来到现金彩票网!
当前位置:21点 > 子队列 >

天之道利而不害

发布时间:2019-07-10 10:16 来源:未知 编辑:admin

  简洁、在unix中,所有的东西都被当做文件对待、unix的内核和相关的系统工具软件用C语言编写(移植能力的基础)、unix的进程创建非常迅速。

  通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。

  优点:函数会在它所调用的位置上展开,可以消除函数调用和返回所带来的开销(寄存器存储和恢复)

  gcc编译器支持在C函数中嵌入汇编指令,通常使用asm()指令嵌入汇编代码

  内核把进程的列表放在叫做任务队列的双向循环链表中。链表中的每一项都是类型为task_struct、称为进程描述符(process descriptor)的结构,该结构定义在linux/sched.h文件中。进程描述符中包含的数据:打开的文件、进程的地址空间、挂起的信号、进程的状态、以及其它信息

  写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。资源的复制只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。

  Linux通过clone()系统调用实现fork()。这个调用通过一系列的参数标志来指明父、子进程需要共享的资源。fork()、vfork()和__clone()库函数都根据各自需要的参数标志去调用clone(),然后用clone()去调用do_fork()。

  do_fork完成了创建中的大部分工作,它的定义在kernel/fork.c文件中。该函数调用copy_process()函数,然后让进程开始运行。

  不拷贝父进程的页表项,子进程和父进程共享相同的(虚拟 or 物理)地址空间,也就是说,子进程可以改变父进程的数据段。另外,子进程要显示的调用exit(1),否则父进程可能会一直被阻塞。

  当线程调用了do_exit()之后,尽管线程已经僵死不能再运行了,但是系统还保留了它的进程描述符。这样做可以让系统有办法在子线程终结后仍能获得它的信息。当最终需要释放进程描述符时,release_task()会被调用,完成一下工作:

  如果父进程在子线程之前退出,就给子线程在当前线程组内找一个线程作为父亲,或者让init做它的父进程

  Linux的CFS调度器没有直接分配时间片到进程,它是将处理器的使用比例划分给了进程。这样一来,进程所获得的处理器时间其实是和系统负载密切相关的。这个比例进一步还会受进程nice值的影响。CFS称为公平调度器是因为它确保给每个进程公平的处理器使用比。CFS的做法是允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程。

  系统调用在用户空间进程和硬件设备之间添加了一个中间层。该层主要作用有三个:为用户空间提供了一种硬件的抽象接口、保证了系统的稳定和安全、为进程运行在虚拟系统中,提供方便。

  函数声明中的asmlinkage限定词,这是一个编译指令,通知编译器仅从栈中提取该函数的参数。所有的系统调用都需要这个限定词。

  通知内核的机制是靠软中断实现的:通过引发一个异常来促使系统切换到内核态去执行异常处理程序。此时的异常处理程序实际上就是系统调用处理程序

  首先,在系统调用表的最后加入一个表项。从0开始算起,系统调用在该表中的位置就是它的系统调用号

  对于所支持的各种体系结构,系统调用号都必须定义在asm/unistd.h中

  系统调用必须被编译进内核映象。这只要把它放进kernel下的一个相关文件就可以了,比如sys.c,它包含了各种各样的系统调用

  驱动程序可以通过request_irq()函数注册一个中断处理程序(它被声明在文件linux/interrupt.h中),并且激活给定的中断线,以处理中断:

  软中断是一组静态定义的下半部接口,有32个,可以在所有处理器上同时执行(即使两个类型相同也可以)。tasklet是一种基于软中断实现的灵活性强、动态创建的下半部实现机制。两个不同类型的tasklet可以在不同的处理器上同时执行,但类型相同的tasklet不能同时执行。

  重新触发的软中断不会立即被处理,作为改进,当大量软中断出现的时候,内核会唤醒一组内核线程来处理这些负载。这些线程在最低的优先级上运行,这能避免它们跟其它重要的任务抢夺资源。

  每个处理器都有一个这样的线程。所有线程的名字都叫做ksoftirqd/n,区别在于n,它对应的是处理器的编号。为了保证只要有空闲的处理器,它们就会处理软中断,所以给每个处理器都分配一个这样的线程。一旦线程被初始化,它就会执行类似下面这样的死循环:

  只要有待处理的软中断(由softirq_pending()函数负责发现),ksoftirq就会调用do_softirq()去处理它们。如果有必要的话,每次迭代后都会调用schedule()以便让更重要的进程得到处理的机会。当所有需要执行的操作都完成以后,该内核线程就将自己设置为TASK_INTERRUPTIBLE状态。

  工作队列子系统是一个用于创建内核线程的接口,通过它所创建的进程负责执行由内核其它部分排到队列里的任务。它创建的这些内核线程称作worker thread。工作队列可以让你的驱动程序创建一个专门的工作者线程来处理需要推后的工作。不过,工作队列提供了一个缺省的worker thread来处理这些工作。

  自旋锁可以使用在中断处理程序中(此处不能再使用信号量,因为它们会导致睡眠)。在中断处理程序中使用自旋锁时,一定要在获取锁之前,首先禁止本地中断(在当前处理器上的中断请求),否则,中断处理程序就会打断正持有锁的内核代码,有可能会试图去争用这个已经被持有的自旋锁。这样一来,中断处理程序就会自旋,等待该锁重新可用,但是锁的持有者在这个中断处理程序完毕前不可能运行,这就是双重请求死锁。

http://magazinski.com/ziduilie/242.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有