精华内容
下载资源
问答
  • Linux上下文切换监控

    千次阅读 2016-05-03 14:14:31
    我们在监测Linux的应用的时候,当CPU的利用率非常高,但是系统的性能却不去的时候,不妨监控一下线程/进程的切换,看看是不是context switching导致的overhead过高。 一般我使用dstat工具用来监控,比如dstat ...


    http://www.kuqin.com/shuoit/20160414/351556.html 

    我们在监测Linux的应用的时候,当CPU的利用率非常高,但是系统的性能却上不去的时候,不妨监控一下线程/进程的切换,看看是不是context switching导致的overhead过高。

    一般我使用dstat工具用来监控,比如dstat -y:

     

    1

    2

    3

    4

    5

    ---system--

    int csw

    367 561

    274 439

    279 363

     

    或者vmstat 3:

     

    1

    2

    3

    4

    [root@abc smallnest]# vmstat 3

    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

    r b swpd free buff cache si so bi bo in cs us sy id wa st

    0 0 0 3126192 31692 1521612 0 0 176 325 166 258 1 1 96 3 0

     

    但是如何知道那些进程/线程做切换能,淘宝褚霸有篇文章:latencytop深度了解你的Linux系统的延迟介绍了一种方法。事实上,有一个工具pidstat,可以用来监控上下文切换。 它是sysstat包其中的一个工具,sysstat包含好几个很棒的工具,比如sar、iostat等。

    执行pidstat -w

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    root@abc smallnest]# pidstat -w

    Linux 2.6.32-358.el6.x86_64 (abc) 04/11/2016 _x86_64_ (2 CPU)

    11:25:00 PM PID cswch/s nvcswch/s Command

    11:25:00 PM 1 0.60 0.03 init

    11:25:00 PM 2 0.04 0.00 kthreadd

    11:25:00 PM 3 0.36 0.00 migration/0

    11:25:00 PM 4 0.58 0.00 ksoftirqd/0

    11:25:00 PM 5 0.01 0.00 migration/0

    11:25:00 PM 6 0.08 0.00 watchdog/0

    11:25:00 PM 7 0.39 0.00 migration/1

    11:25:00 PM 8 0.01 0.00 migration/1

    11:25:00 PM 9 0.52 0.00 ksoftirqd/1

    ……

     

    cswch/s是主动地上下文切换,nvcswch/s是被动执行上下文切换的次数。

    如要要显示线程的上下文切换统计,可以执行``:

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    [root@abc smallnest]# pidstat -wt

    Linux 2.6.32-358.el6.x86_64 (abc) 04/11/2016 _x86_64_ (2 CPU)

    11:27:57 PM TGID TID cswch/s nvcswch/s Command

    11:27:57 PM 1 - 0.56 0.03 init

    11:27:57 PM - 1 0.56 0.03 |__init

    11:27:57 PM 2 - 0.03 0.00 kthreadd

    11:27:57 PM - 2 0.03 0.00 |__kthreadd

    11:27:57 PM 3 - 0.34 0.00 migration/0

    11:27:57 PM - 3 0.34 0.00 |__migration/0

    11:27:57 PM 4 - 0.57 0.00 ksoftirqd/0

    11:27:57 PM - 4 0.57 0.00 |__ksoftirqd/0

    11:27:57 PM 5 - 0.01 0.00 migration/0

    ……

     

    更多的参数可以man pidstat获得。


    展开全文
  • linux 上下文和自旋锁

    千次阅读 2014-02-20 14:40:01
    而自旋锁则防止在不同CPU上的执行单元对共享资源的同时访问,以及不同进程上下文互相抢占导致的对共享资源的非同步访问。 在对称多处理器,仅仅禁止某个CPU的中断是不够的,当然我们也可以将所有CPU的中断都禁止,...

    因此,中断(或软中断)禁止用于防止同一CPU上中断(或软中断)对共享资源的非同步访问。而自旋锁则防止在不同CPU上的执行单元对共享资源的同时访问,以及不同进程上下文互相抢占导致的对共享资源的非同步访问。

    在对称多处理器,仅仅禁止某个CPU的中断是不够的,当然我们也可以将所有CPU的中断都禁止,但这样做开销很大,整个系统的性能会明显下降。此外,即使在单处理器上,如果内核是抢占式的,也可能出现不同进程上下文同时进入临界区的情况。为此,Linux内核中提供了"自旋锁(spinlock)"的同步机制。
    自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"因此而得名。


    进程上下文主要是异常处理程序和内核线程。内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做。例如,系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态等。所以在进程上下文中引用current是有意义的。

    内核进入中断上下文是因为中断信号而导致的中断处理或软中断。而中断信号的发生是随机的,中断处理程序及软中断并不能事先预测发生中断时当前运行的是哪个进程,所以在中断上下文中引用current是可以的,但没有意义。事实上,对于A进程希望等待的中断信号,可能在B进程执行期间发生。例如,A进程启动写磁盘操作,A进程睡眠后B进程在运行,当磁盘写完后磁盘中断信号打断的是B进程,在中断处理时会唤醒A进程。

    内核可以处于两种上下文:进程上下文和中断上下文。在系统调用之后,用户应用程序进入内核空间,此后内核空间针对用户空间相应进程的代表就运行于进程上下文。异步发生的中断会引发中断处理程序被调用,中断处理程序就运行于中断上下文。中断上下文和进程上下文不可能同时发生。

      运行于进程上下文的内核代码是可抢占的,但中断上下文则会一直运行至结束,不会被抢占。因此,内核会限制中断上下文的工作,不允许其执行如下操作:

      (1) 进入睡眠状态或主动放弃CPU;

    由于中断上下文不属于任何进程,它与current没有任何关系(尽管此时current指向被中断的进程),所以中断上下文一旦睡眠或者放弃CPU,将无法被唤醒。所以也叫原子上下文(atomic context)。

      (2) 占用互斥体;

    为了保护中断句柄临界区资源,不能使用mutexes。如果获得不到信号量,代码就会睡眠,会产生和上面相同的情况,如果必须使用锁,则使用spinlock。

      (3) 执行耗时的任务;

    中断处理应该尽可能快,因为内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。在中断处理例程中执行耗时任务时,应该交由中断处理例程底半部来处理。

      (4) 访问用户空间虚拟内存。

    因为中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在中断上下文无法访问用户空间的虚拟地址

       (5) 中断处理例程不应该设置成reentrant(可被并行或递归调用的例程)。

    因为中断发生时,preempt和irq都被disable,直到中断返回。所以中断上下文和进程上下文不一样,中断处理例程的不同实例,是不允许在SMP上并发运行的。

      (6)中断处理例程可以被更高级别的IRQ中断。

    如果想禁止这种中断,可以将中断处理例程定义成快速处理例程,相当于告诉CPU,该例程运行时,禁止本地CPU上所有中断请求。这直接导致的结果是,由于其他中断被延迟响应,系统性能下降。


    禁止中断包括禁止当前处理器的所有中断和禁止一条中断线两种,禁止所有中断可以使用local_irq_save和local_irq_restore函数(local_irq_disable这些都是当前CPU的终端)
    禁止一个中断线可以使用disable_irq函数,只是disable当前irq.

    查看使用的中断号可以用cat /proc/interrupts得到。中断系统的状态可以通过几个函数获得,irqs_disabled函数查看本地中断传递是否被禁止.

    禁止本地CPU中断是确保一组内核语句被当作一个临界区处理的主要机制。这个机制的意义是:即使当硬件设备产生了一个IRQ信号时,中断禁止也让内核控制路径继续执行,因此,这就提供了一种有效的方式,确保内核控制路径中的一些中断处理程序能访问的数据结构也受到保护。

    1 禁止本地中断


    然而,禁止本地中断并不保护运行在另一个CPU上的中断处理程序对该数据结构的并发访问,因此,在多处理器系统上,禁止本地中断经常与自旋锁结合使用。

    宏local_irq_disable()使用cli汇编语言指令关闭本地CPU上的中断(x86体系的禁止本地中断位于include/linux/Irqflags.h):

    2 禁止下半部(可延迟函数)


    在中断处理专题的“下半部分”一节,我们说明了可延迟函数可能在不可预知的时间执行(实际上是在硬件中断处理程序结束时)。因此,必须保护可延迟函数访问的数据结构使其避免竞争条件。

    禁止可延迟函数在单个CPU上执行的一种简单方式就是禁止在那个CPU上的中断。因为没有中断处理程序被激活,因此,软中断操作就不能异步地开始。

    然而,内核有时需要只禁止可延迟函数而不禁止中断。这种情况是需要通过操纵当前thread_info描述符preempt_count字段中存放的软中断计数器,可以在本地CPU上激活或禁止可延迟函数。

    回忆一下,如果软中断计数器是正数,do_softirq()函数就不会执行软中断,而且,因为tasklet在软中断之前被执行,把这个计数器设置为大于0的值,由此禁止了在给定CPU上的所有可延迟函数和软中断的执行。

    宏local_bh_disable给本地CPU的软中断计数器加1,而函数local_bh_enable()从本地CPU的软中断计数器中减掉1。

    递减软中断计数器之后,local_bh_enable()执行两个重要的操作以有助于保证适时地执行长时间等待的线程:

    1. 检查本地CPU的preempt_count字段中硬中断计数器和软中断计数器,如果这两个计数器的值都等于0而且有挂起的软中断要执行,就调用do_softirq()来激活这些软中断(见中断专题“下半部”博文)。

    2. 调用preempt_check_resched函数检查本地CPU的TIF_NEED_RESCHED标志是否被设置,如果是,说明进程切换请求是挂起的,因此调用preempt_schedule()函数(参见专题前面的“内核抢占”博文)。
    #define preempt_check_resched() /
    do { /
        if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) /
            preempt_schedule(); /
    } while (0)


    Linux操作系统中中断上下文中的互斥

    在Linux系统中,有两种不同的上下文:进程上下文、中断上下文。
    在中断中没有进程上下文,而具有中断上下文,因此在中断上下文中不能发生睡眠,也就是不能发生进程切换。
    这就决定了在在中断上下文中不能采用同步原语(信号量,管程、同步变量等)和长期互斥原语(这会导致进程睡眠), 而只能采用短期互斥原语(例如自旋锁)。

    曾经,中断处理程序并不具有自己的栈。相反,它们共享所中断进程的内核栈。内核栈的大小是两页,具体地说,在32位体系结构上是8KB,在64位体系结构上是16KB.
    现在。中断处理程序有了自己的栈,每个处理器一个,大小为一页。这个栈就称为中断栈,尽管中断栈的大小是原先共享栈的一半,但平均可用栈空间大得多,因为中断处理
    程序把这一整页占为己有。

    UP(单CPU系统)上的中断处理
    互斥
    如果一个中断处理程序的代码访问或者更新了由非中断的代码(通常称为基准代码)使用的同一数据结构,那么就会出现竞争条件。
    幸运的是,得到允许的以内核态执行的进程会临时禁止中断。因此,只要基准代码要更新一个与中断处理程序共享的数据结构,那么就
    首先禁止中断,执行临界段,然后再重新允许中断。禁止和允许中断的动作就实现了互斥。
    在采取中断互斥时,必须使用函数显示地把编码写入算法中。

    MP(多CPU系统)上
    在MP系统上,中断可以在任何处理器上出现。从最低限度上来说,每个进程会接收时钟中断,但也可能接收I/O中断。在MP系统上,例程
    SPL(禁止中断)所提供的保护并不充分,因为它们执行影响执行它们的处理器上的中断优先级。中断可能会在另一个处理器上出现,如果设备驱动程序
    正在别处运行,那么会造成一个竞争条件。因为中断处理程序代表另一个进入内核的入口点。

    当基准驱动程序代码和中断处理程序之间共享数据结构时,UP可以通过屏蔽中断来防止出现竞争条件的技术,在多线程MP内核中还不充分。
    临界段要在一个处理器上执行,执行屏蔽中断例程只会屏蔽在那个处理器上出现的中断。如果在别的处理器上出现中断,那么立即就会有
    两个处理器同时访问、而且可能更新临界资源。既然这些临界段需要短期互斥,那么可以使用自旋锁来对数据进行保护。

    如果不考虑中断处理程序和基准代码之间的互斥,则Linux中的中断处理程序是无须重入的。当一个给定的中断处理程序正在执行时,相应的中断线
    在所有处理器上都会被屏蔽掉,以防止同一中断线上接收另一个新的中断。通常情况下,所有的其他中断都是打开的,所以这些不同中断线上的其他中断
    都能处理,但当前中断线总是被禁止的。由此可以看出,同一个中断处理程序绝不会被同时调用以处理嵌套的中断。这极大地简化了中断程序的编写。



    自旋锁(spinlock) 解释得经典,透彻

    自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

      由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。
      信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_trylock的变种能够在中断上下文使用),而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。
      如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共巷资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。
      自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。
      跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。
      无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。
      自旋锁的API有:
    spin_lock_init(x)
      该宏用于初始化自旋锁x。自旋锁在真正使用前必须先初始化。该宏用于动态初始化。
    DEFINE_SPINLOCK(x)
      该宏声明一个自旋锁x并初始化它。该宏在2.6.11中第一次被定义,在先前的内核中并没有该宏。
    SPIN_LOCK_UNLOCKED
      该宏用于静态初始化一个自旋锁。
    DEFINE_SPINLOCK(x)等同于spinlock_t x = SPIN_LOCK_UNLOCKED spin_is_locked(x)
      该宏用于判断自旋锁x是否已经被某执行单元保持(即被锁),如果是,返回真,否则返回假。
    spin_unlock_wait(x)
      该宏用于等待自旋锁x变得没有被任何执行单元保持,如果没有任何执行单元保持该自旋锁,该宏立即返回,否则将循环在那里,直到该自旋锁被保持者释放。
    spin_trylock(lock)
      该宏尽力获得自旋锁lock,如果能立即获得锁,它获得锁并返回真,否则不能立即获得锁,立即返回假。它不会自旋等待lock被释放。
    spin_lock(lock)
      该宏用于获得自旋锁lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放,这时,它获得锁并返回。总之,只有它获得锁才返回。
    spin_lock_irqsave(lock, flags)
      该宏获得自旋锁的同时把标志寄存器的值保存到变量flags中并失效本地中断。
    spin_lock_irq(lock)
      该宏类似于spin_lock_irqsave,只是该宏不保存标志寄存器的值。
    spin_lock_bh(lock)
      该宏在得到自旋锁的同时失效本地软中断。
    spin_unlock(lock)
      该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用。如果spin_trylock返回假,表明没有获得自旋锁,因此不必使用spin_unlock释放。
    spin_unlock_irqrestore(lock, flags)
      该宏释放自旋锁lock的同时,也恢复标志寄存器的值为变量flags保存的值。它与spin_lock_irqsave配对使用。
    spin_unlock_irq(lock)
      该宏释放自旋锁lock的同时,也使能本地中断。它与spin_lock_irq配对应用。
    spin_unlock_bh(lock)
      该宏释放自旋锁lock的同时,也使能本地的软中断。它与spin_lock_bh配对使用。
    spin_trylock_irqsave(lock, flags)
      该宏如果获得自旋锁lock,它也将保存标志寄存器的值到变量flags中,并且失效本地中断,如果没有获得锁,它什么也不做。
      因此如果能够立即获得锁,它等同于spin_lock_irqsave,如果不能获得锁,它等同于spin_trylock。如果该宏获得自旋锁lock,那需要使用spin_unlock_irqrestore来释放。
    spin_trylock_irq(lock)
      该宏类似于spin_trylock_irqsave,只是该宏不保存标志寄存器。如果该宏获得自旋锁lock,需要使用spin_unlock_irq来释放。
    spin_trylock_bh(lock)
      该宏如果获得了自旋锁,它也将失效本地软中断。如果得不到锁,它什么也不做。因此,如果得到了锁,它等同于spin_lock_bh,如果得不到锁,它等同于spin_trylock。如果该宏得到了自旋锁,需要使用spin_unlock_bh来释放。
    spin_can_lock(lock)
      该宏用于判断自旋锁lock是否能够被锁,它实际是spin_is_locked取反。如果lock没有被锁,它返回真,否则,返回假。该宏在2.6.11中第一次被定义,在先前的内核中并没有该宏。
      获得自旋锁和释放自旋锁有好几个版本,因此让读者知道在什么样的情况下使用什么版本的获得和释放锁的宏是非常必要的。
      如果被保护的共享资源只在进程上下文访问和软中断上下文访问,那么当在进程上下文访问共享资源时,可能被软中断打断,从而可能进入软中断上下文来对被保护的共享资源访问,因此对于这种情况,对共享资源的访问必须使用spin_lock_bh和spin_unlock_bh来保护。
      当然使用spin_lock_irq和spin_unlock_irq以及spin_lock_irqsave和spin_unlock_irqrestore也可以,它们失效了本地硬中断,失效硬中断隐式地也失效了软中断。但是使用spin_lock_bh和spin_unlock_bh是最恰当的,它比其他两个快。
      如果被保护的共享资源只在进程上下文和tasklet或timer上下文访问,那么应该使用与上面情况相同的获得和释放锁的宏,因为tasklet和timer是用软中断实现的。
      如果被保护的共享资源只在一个tasklet或timer上下文访问,那么不需要任何自旋锁保护,因为同一个tasklet或timer只能在一个CPU上运行,即使是在SMP环境下也是如此。实际上tasklet在调用tasklet_schedule标记其需要被调度时已经把该tasklet绑定到当前CPU,因此同一个tasklet决不可能同时在其他CPU上运行。
      timer也是在其被使用add_timer添加到timer队列中时已经被帮定到当前CPU,所以同一个timer绝不可能运行在其他CPU上。当然同一个tasklet有两个实例同时运行在同一个CPU就更不可能了。
      如果被保护的共享资源只在两个或多个tasklet或timer上下文访问,那么对共享资源的访问仅需要用spin_lock和spin_unlock来保护,不必使用_bh版本,因为当tasklet或timer运行时,不可能有其他tasklet或timer在当前CPU上运行。
     如果被保护的共享资源只在一个软中断(tasklet和timer除外)上下文访问,那么这个共享资源需要用spin_lock和spin_unlock来保护,因为同样的软中断可以同时在不同的CPU上运行。
      如果被保护的共享资源在两个或多个软中断上下文访问,那么这个共享资源当然更需要用spin_lock和spin_unlock来保护,不同的软中断能够同时在不同的CPU上运行。
      如果被保护的共享资源在软中断(包括tasklet和timer)或进程上下文和硬中断上下文访问,那么在软中断或进程上下文访问期间,可能被硬中断打断,从而进入硬中断上下文对共享资源进行访问,因此,在进程或软中断上下文需要使用spin_lock_irq和spin_unlock_irq来保护对共享资源的访问。
      而在中断处理句柄中使用什么版本,需依情况而定,如果只有一个中断处理句柄访问该共享资源,那么在中断处理句柄中仅需要spin_lock和spin_unlock来保护对共享资源的访问就可以了。
      因为在执行中断处理句柄期间,不可能被同一CPU上的软中断或进程打断。但是如果有不同的中断处理句柄访问该共享资源,那么需要在中断处理句柄中使用spin_lock_irq和spin_unlock_irq来保护对共享资源的访问。
      在使用spin_lock_irq和spin_unlock_irq的情况下,完全可以用spin_lock_irqsave和spin_unlock_irqrestore取代,那具体应该使用哪一个也需要依情况而定,如果可以确信在对共享资源访问前中断是使能的,那么使用spin_lock_irq更好一些。
      因为它比spin_lock_irqsave要快一些,但是如果你不能确定是否中断使能,那么使用spin_lock_irqsave和spin_unlock_irqrestore更好,因为它将恢复访问共享资源前的中断标志而不是直接使能中断。
      当然,有些情况下需要在访问共享资源时必须中断失效,而访问完后必须中断使能,这样的情形使用spin_lock_irq和spin_unlock_irq最好。

      spin_lock用于阻止在不同CPU上的执行单元对共享资源的同时访问以及不同进程上下文互相抢占导致的对共享资源的非同步访问,而中断失效和软中断失效却是为了阻止在同一CPU上软中断或中断对共享资源的非同步访问。


    我个人觉得:内核控制路径(进程的内核态访问、硬中断、下半部)互斥问题的关键是弄清临界区的使用性质,就是要看那些路径要访问共享资源:
    1 看多CPU是否访问共享资源:若是,要应用spin_lock 或 semaphore, semaphore可以发生进程上下文切换,在多CPU的情况下,也依靠spin_lock实现多CPU的互斥。
    当然,如果能够确定临界区在中断上下文中肯定要用spin_lock。
         a)   看硬中断是否访问临界区域:若是,要用spin_lock_irq()/spin_unlock_irq,要保存标志寄存器就用spin_lock_irqsave()/spin_unlock_irqrestrore()。
         b)   若临界区可能有下半部访问(timer_list 、tasklet也属于这里,因为他们依靠下半部实现的),若是,则要spin_lock_bh()/spin_unlock_bh
    2 若不受多CPU的影响,则再看硬中断、下半部的影响,相应的使用关闭本地硬中断或BH
    local_irq_disable/local_irq_enable
    local_bh_disable/local_bh_enable

    总之:就是多CPU、内核抢占、硬中断、小半部的问题,spin_lock处理多CPU的互斥,本地硬中断和本地下半部的问题由 local_irq_disable  local_bh_disable完成。








    自旋锁的选择

    参考:《Linux Kernel Development》3ed_CN p-149 扩展


    如下内容中没有涉及读写自旋锁,尝试锁的获取等,只包含一般情形;如下是我的总结,如有误,请指出:

    自旋锁在不同情况下的选择:                                                                                         
    1、进程上下文与进程上下文之间:
        spin_lock()

    2、进程上下文与中断上半部之间:
        spin_lock_irqsave()  or  spin_lock_irq()

    3、进程上下文与中断下半部之间:
        spin_lock_bh()

    4、中断上半部与中断上半部之间:
        spin_lock_irqsave()  or spin_lock_irq()

    5、中断上半部与中断下半部之间:
        spin_lock_irqsave() or spin_lock_irq()

    6、中段下半部与中断下半部之间:
        (1)软中断与软中断之间 (同类型或不同类型的软中断可以同时运行在一个系统的多个处理器上,在同一个核上当然不能同时运行)
            spin_lock()
        (2) 不同类型的tasklet之间(此处只写明是不同类型的tasklet之间,因为同类型的tasklet不可能同时运行)
            spin_lock()

    在不同的核之间使用spin_lock就可以了,至于其它的全是对同一个核施加的限制;


    补充

    2013-9-7 21:00

    关于读写锁rwlock_t和顺序锁seqlock_t的理论.

    参考:《Operating System Concepts》9ed p_220
              《CSAPP》2_ed p_1004

    复制代码
    分别阐述了 Readers-Writers Problem
    first readers-writers problem.
    The first readers-writers problem, which favors readers,requires that no reader be kept waiting unless a writer has already been granted permission to 
    use the object. In other words, no reader should wait simply because writer is waiting.
    
    second readers-writers problem.
    The second readers-writers problem, which favors writers, requires that once a writer is ready to write, it performs its write as soon as possible. 
    Unlike the first problem, a reader that arrives after a writer must wait, even if the writer is also waiting.
    
    根据rwlock_t和seqlock_t的各自实现与用法,可以看出rwlock_t数据结构用于解决first readers-writers problem,seqlock_t数
    据结构用于解决second readers-writers problem。
    复制代码

     


    Linux设备驱动程序:中断处理之顶半部和底半

              设备的中断会打断内核中进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽可能地短小精悍。但是,这个良好的愿望往往与现实并不吻合。在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。 

            为了在中断执行时间尽可能短和中断处理需完成大量工作之间找到一个平衡点,Linux 将中断处理程序分解为两个半部:顶半部(top  half)和底半部(bottom half)。 顶半部完成尽可能少的比较紧急的功能,它往往只是简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。“登记中断”意味着将底半部处理程序挂到该设备的底半部执行队列中去。这样,顶半部执行的速度就会很快,可以服务更多的中断请求。现在,中断处理工作的重心就落在了底半部的头上,它来完成中断事件的绝大多数任务。底半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断,这也是底半部和顶半部的最大不同,因为顶半部往往被设计成不可中断。底半部则相对来说并不是非常紧急的,而且相对比较耗时,不在硬件中断服务程序中执行。

    顶半部是实际响应中断的过程,也就是用request_irq注册的中断例程。而底半部会在稍后比较安全的时间内执行的过程。即底半部的中断都是打开的。比较典型的情况是顶半部保存设备的数据到一个设备特定的缓存区并调度它的底半部,然后退出;这个过程是非常迅速的。然后底半部执行其他必要的工作,例如唤醒进程、启动另外的I/O操作等等。这种方法允许在底半部工作期间,顶半部还可以继续为新的中断服务。

          尽管顶半部、底半部的结合能够改善系统的响应能力,但是,僵化地认为 Linux设备驱动中的中断处理一定要分两个半部则是不对的。如果中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。其他操作系统中对中断的处理也采用了类似于Linux系统的方法,真正的硬件中断服务程序都应该尽可能短。因此,许多操作系统都提供了中断上下文和非中断上下文相结合的机制,将中断的耗时工作保留到非中断上下文去执行。 

            Linux 系统实现底半部的机制主要有tasklet,工作队列和软中断。Linux 的中断处理分为两个半部,顶半部处理紧急的硬件操作,底半部处理不紧急的耗时操作。tasklet 和工作队列都是调度中断底半部的良好机制,tasklet 基于软中断实现。内核定时器也依靠软中断实现。内核中的延时是忙等待或者睡眠等待,为了充分利用CPU资源,使系统有更好的吞吐性能,在对延迟时间的要求并不是很精确的情况下,睡眠等待通常是值得推荐的。

    1tasklet (首选机制),它非常快,但是所有的tasklet 代码必须是原子的;始终工作在中断期间运行。

    2)工作队列,它可能有更高的延时,但允许休眠。工作在一个特殊内核进程的上下文中运行。



    NAPI用于在禁止中断时以轮询模式操作接口。主要用于网络带宽很高的情况下。对于传统的driver,当接口收到一个包的情况下,就会产生一个中断。但是,当宽带接口每秒钟收到上千个包时,使用中断方式会使系统性能全面下降。所以,为了提高Linux在宽带系统上的性能,使用了一种基于轮询方式的接口。该接口在kernel中的定义:int (*poll)(struct net_device *dev, int *quota)。

    netpoll的目的是让内核在网络和I/O子系统尚不能完整可用时,依然能发送和接收数据包。主要用于网络控制台(net console)和远程内核调试(KGDBoE)中。实现netpoll功能,主要是要实现kernel中的poll_controller函数,该函数定义:void (*poll_controller)(struct net_device *dev)。该函数的作用是在缺少设备中断的情况下,还能对控制器做出响应。几乎所有的poll_controller函数都定义成如下形式:
    void my_poll_controller(struct net_device *dev) {
    disable_device_interrupt(dev);
    call_interrupt_handler(dev->irq, dev);
    enable_device_interrupt(dev);
    }
    所以,poll_controller只是模拟了来自指定设备的中断。





    volatile描述符,要求编译器不要对其作优化处理,对它的读写都需要从内存中访问。



    展开全文
  • 手动修改文件的SELinux安全上下文 2.命令格式 chcon [-R] [-t type] [-u user] [-r role] 文件 chcom [-R] --reference=范例文件 文件 相关参数与选项 -R:连同该目录下的子目录也同时修改 -t:后面接安全上下文...

    一、chcon命令

    1.功能

    • 手动修改文件的SELinux安全上下文

    2.命令格式

    • chcon  [-R]  [-t  type]  [-u  user]  [-r  role]  文件
    • chcom  [-R]  --reference=范例文件   文件

    相关参数与选项

    • -R:连同该目录下的子目录也同时修改
    • -t:后面接安全上下文的类型栏位。例如:httpd_sys_content_t
    • -u:后面接身份识别(不重要)。例如:system_u
    • -r:后面接角色(不重要)。例如:system_r
    • -v:若有变动成功,将变动的结果列出来
    • --reference:拿某个文件当范例来修改后续接的文件的类型

    3.演示案例

    • 案例一:我们将一个文件的SELinux类型修改为/etc/hosts文件的SELinux类型

    第一步:在家目录下建立一个文件,然后移动到/etc/cron.d目录下。可以看到test文件的SELinux类型为admin_home_t

    第二步:将test的SELinux变为/etc/hosts文件的SELinux类型

    第三步:修改之后查看

    • 案例二:我们利用--reference选项再将test文件改为/etc/shadow文件的SELinux类型

    第一步:查看/etc/shadow的SELinux类型

    第二步:利用--reference选项修改

    二、restorecon命令

    1.功能

    • 让文件的SELinux类型恢复为默认的SELinux类型
    • 默认的SELinux类型与semanage命令有关,就是参考semanage这个命令所查询处的默认SELinux类型

    2.命令格式

    • restorecon  [-Rv]  文件/目录

    相关参数

    • -R:连同子目录一起修改
    • -v:将过程显示到屏幕

    3.演示范例

    • 案例:我们将上面的test文件的SELinux类型改为默认的SELinux类型

    第一步:我们查看/etc/cron.d目录的SELinux类型为:system_cron_spool_t

    第二步:使用-R选项使/etc/cron.d目录的SELinux类型恢复为默认SELinux类型

    可以看到该目录下test文件的SELinux类型被修改为system_cron_spool_t

    三、semanage命令

    1.功能

    • 查询/修改/增加/删除文件的默认SELinux类型

    2.命令格式

    • semanage  [login/user/port/interface/fcontext/translation]   -l
    • semanage   fcontext  -{a/d/m}  [-frst]  file_spec

    相关参数与选项

    • -l:查询
    • fcontext:主要用在安全上下文方面的用途(常用的)
    • -a:增加的意思,你可以增加一些目录的默认安全上下文类型设置
    • -m:修改的意思
    • -d:删除的意思

    3.演示案例

    • 案例一:查看/etc/crom目录的默认SELinux类型。可以看到为system_cron_spool_t。并且目录下的all files都是这个类型

    • 案例二:查看/etc目录的默认SELinux类型。可以看到为etc_t

    • 案例三:验证一个目录的SELinux类型是否会影响到目录下的文件/子目录

    第一步:建立一个/srv/mycron目录,然后将/etc/cron.d/test文件复制到/srv/mycron目录下,查看一下SELinux的类型。可以看到都为var_t

    第二步:查看/srv/目录的SELinux类型,可以看到是var_t,所以上面那个目录和文件也是

    • 案例四:承上,将/srv/mycron目录的SELinux默认值修改为system_cron_spool_t。可以看到已经修改了

    • 案例五:承上,将/srv/mycron/目录下的所有文件都修改为自己的默认SELinux类型。然后再查看

     

     

     

    展开全文
  • Linux:selinux安全上下文

    千次阅读 2018-05-16 20:12:19
    安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符...SELinux对系统中的许多命令做了修改,通过添加一个-Z选项显示客体和主体的安全上下文。 1) 系统根据PAM子系统中的pam_selinux.so模块设定...

    安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),”域”和”域类型”意思都一样,即都是安全上下文中的“TYPE”。

    SELinux对系统中的许多命令做了修改,通过添加一个-Z选项显示客体和主体的安全上下文。
    1) 系统根据PAM子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文;
    2) 文件的Security Contex规则如下:
    • rpm包安装的:会根据rpm包内记录来生成安全上下文;
    • 手动创建的文件:会根据policy中规定的来设置安全上下文;
    • cp:会重新生成安全上下文;
    • mv:安全上下文则不变。

    setenforce 1 强制(看不到)
    setenforce 0 警告(可以看)

    selinux的模式转换需要重启,因为selinux是内核级的插件。

    [root@localhost ~]# vim /etc/sysconfig/selinux   ##要把disabled改为enforcing
    SELINUX=enforcing
    [root@localhost ~]# getenforce     #查看(未重启不生效)
    Disabled
    [root@localhost ~]# reboot        ##重启
    [root@localhost ~]# getenforce     ##重启后生效
    Enforcing

    做以下实验需要重置虚拟机server,设置ip,配置yum源,安装服务

    [root@localhost ~]# cd /etc/yum.repos.d/
    [root@localhost yum.repos.d]# vim rhel_dvd.repo    ##配置yum源文件
    [root@localhost yum.repos.d]# yum clean all      
    Loaded plugins: langpacks
    Cleaning repos: rhel_dvd source7.0
    Cleaning up everything
    [root@localhost yum.repos.d]# yum install vsftpd -y   ##安装服务
    [root@localhost yum.repos.d]# yum install lftp -y
    [root@localhost ~]# systemctl start vsftpd
    [root@localhost ~]# systemctl stop  firewalld
    [root@localhost ~]# systemctl disable  firewalld
    [root@localhost ~]# systemctl enable vsftpd

    这里写图片描述
    配置yum源:
    这里写图片描述

    一·临时更改上下文

    [root@localhost ~]# touch  /mnt/westos2
    [root@localhost ~]# mv /mnt/westos2 /var/ftp/     ##移动是重命名的过程,权限不会改变,复制是新建的过程
    [root@localhost ~]# lftp 172.25.254.219
    lftp 172.25.254.219:~> ls     ##看不到移动的文件
    drwxr-xr-x    2 0        0               6 Mar 07  2014 pub
    lftp 172.25.254.219:/> exit
    [root@localhost ~]# cd /var/ftp/
    [root@localhost ftp]# ls
    pub  westos2
    [root@localhost ftp]# ls -Z     ##查看安全上下文类型
    drwxr-xr-x. root root system_u:object_r:public_content_t:s0 pub
    -rw-r--r--. root root unconfined_u:object_r:mnt_t:s0   westos2
    [root@localhost ftp]# chcon -t public_content_t westos2     ##更改上全上下文
    [root@localhost ftp]# ls -Z      ##查看更改成功
    drwxr-xr-x. root root system_u:object_r:public_content_t:s0 pub
    -rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westos2
    [root@localhost ftp]# lftp 172.25.254.219
    lftp 172.25.254.219:~> ls     ##可以看到文件
    drwxr-xr-x    2 0        0               6 Mar 07  2014 pub
    -rw-r--r--    1 0        0               0 May 16 07:54 westos2
    lftp 172.25.254.219:/> exit
    [root@localhost ~]# vim /etc/sysconfig/selinux    ##将/etc/sysconfig/selinux改为disabled后重启
    [root@localhost ~]# reboot     ##重启
    Connection to 172.25.254.219 closed by remote host.
    Connection to 172.25.254.219 closed.
    [kiosk@foundation71 Desktop]$ ssh root@172.25.254.219 
    root@172.25.254.219's password: 
    Last login: Wed May 16 03:57:00 2018 from 172.25.254.71
    [root@localhost ~]# getenforce     ##查看
    Disabled
    [root@localhost ~]# vim /etc/sysconfig/selinux  ##再次将/etc/sysconfig/selinux改为enforcing后重启    
    [root@localhost ~]# reboot
    Connection to 172.25.254.219 closed by remote host.
    Connection to 172.25.254.219 closed.
    [root@localhost ftp]# ls -Z
    drwxr-xr-x. root root system_u:object_r:public_content_t:s0 pub
    -rw-r--r--. root root unconfined_u:object_r:mnt_t:s0   westos2
    

    这里写图片描述
    将/etc/sysconfig/selinux改为disable后重启,重启后再改为enforcing再次重启,表示将selinux重启。
    这里写图片描述
    重启后查看时,临时改的安全上下文不存在了
    这里写图片描述

    二·永久更改安全上下文

    [root@localhost ftp]# mkdir /westos/
    [root@localhost ftp]# touch /westos/westosfile
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf 
    anon_root=/westos     ##编写内容
    [root@localhost ftp]# systemctl restart vsftpd 
    [root@localhost ftp]# lftp 172.25.254.219
    lftp 172.25.254.219:~> ls     ##看不到建立的新文件
    lftp 172.25.254.219:/> exit          
    [root@localhost ftp]# ls -Z  /westos/   ##查看/westos/的安全上下文类型
    -rw-r--r--. root root unconfined_u:object_r:default_t:s0 westosfile
    [root@localhost ftp]# ls -Zd /westos/   
    drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /westos/
    [root@localhost ftp]# ls -Zd /var/ftp/
    drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /var/ftp/
    [root@localhost ftp]# semanage fcontext -l | grep /var/ftp       ##查看所有/vat/ftp安全上下文(/表示本身以及内容 .*所有隐藏文件)
    /var/ftp(/.*)?                                     all files          system_u:object_r:public_content_t:s0 
    /var/ftp/bin(/.*)?                                 all files          system_u:object_r:bin_t:s0 
    /var/ftp/etc(/.*)?                                 all files          system_u:object_r:etc_t:s0 
    /var/ftp/lib(/.*)?                                 all files          system_u:object_r:lib_t:s0 
    /var/ftp/lib/ld[^/]*\.so(\.[^/]*)*                 regular file       system_u:object_r:ld_so_t:s0 
    [root@localhost ftp]# semanage fcontext -l | grep /westos   
    [root@localhost ftp]# semanage fcontext -a -t public_content_t '/westos(/.*)?'     ##永久添加安全上下文(/.*)?=/westos/*=/westos/*/*表示westos文件里所有文件和内容更改为public_content_t
    -a: 添加
    -t: 添加类型 
    [root@localhost ftp]# semanage fcontext -l | grep /westos      ##查看默认/westos安全上下文列表
    /westos(/.*)?                                      all files          system_u:object_r:public_content_t:s0 
    [root@localhost ftp]# restorecon -FvvR /westos/       ##刷新
    -R递归
    -v将过程显示在屏幕上
    restorecon reset /westos context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
    restorecon reset /westos/westosfile context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
    [root@localhost ftp]# lftp 172.25.254.219
    lftp 172.25.254.219:~> ls     ##更改后可以看到文件
    -rw-r--r--    1 0        0               0 May 16 08:14 westosfile
    lftp 172.25.254.219:/> exit
    [root@localhost ftp]# touch /.autorlabel     ##建立这个文件是将selinux初始化(相当于刚才的两次重启) 
    [root@localhost ftp]# reboot
    [kiosk@foundation71 Desktop]$ ssh root@172.25.254.219 
    root@172.25.254.219's password: 
    Last login: Wed May 16 04:08:00 2018 from 172.25.254.71
    [root@localhost ~]# lftp 172.25.254.219
    lftp 172.25.254.219:~> ls                
    -rw-r--r--    1 0        0               0 May 16 08:14 westosfile
    lftp 172.25.254.219:/> exit
    [root@localhost ~]# ls -Zd  /westos         ##重启后查看  
    drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /westos
    [root@localhost ~]# semanage fcontext -l | grep /westos     ##更改永久成功
    /westos(/.*)?                                      all files          system_u:object_r:public_content_t:s0 
    

    编写 /etc/vsftpd/vsftpd.conf 内容:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    重启后查看永久安全上下文:
    这里写图片描述

    三·管理selinux的布尔值

    [root@localhost ~]# lftp  172.25.254.219  -u student
    Password: 
    lftp student@172.25.254.219:~> ls      
    lftp student@172.25.254.219:~> put /etc/passwd
    put: Access failed: 553 Could not create file. (passwd)    ##报错553,权限过小,上传不成功
    lftp student@172.25.254.219:~> exit
    [root@localhost ~]# getsebool -a |grep ftp    ##查看ftp系统的布尔值设置状况
    ftp_home_dir --> off
    [root@localhost ~]# setsebool -P ftp_home_dir  on     ##永久开启ftp进程功能
    [root@localhost ~]# getsebool -a |grep ftp    ##已开启
    ftp_home_dir --> on
    [root@localhost ~]# lftp 172.25.254.219 -u student
    Password: 
    lftp student@172.25.254.219:~> put /etc/passwd     
    2005 bytes transferred in 10 seconds (199b/s)      ##上传成功
    lftp student@172.25.254.219:~> ls         
    -rw-r--r--    1 1000     1000         2005 May 16 08:46 passwd
    lftp student@172.25.254.219:~> exit

    这里写图片描述
    永久开启ftp进程功能以及查看:
    这里写图片描述
    开启后可以上传文件:
    这里写图片描述

    四·监控SELinux冲突

    [root@localhost ftp]# cd /var/ftp/
    [root@localhost ftp]# rm -fr *
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf 
    注释#anon_root=/westos
    [root@localhost ftp]# systemctl restart vsftpd
    [root@localhost ftp]# touch /mnt/westos
    [root@localhost ftp]# mv /mnt/westos /var/ftp
    [root@localhost ftp]# > /var/log/audit/audit.log    ##清空警告日志
    [root@localhost ftp]# > /var/log/messages      ##清空日至
    [root@localhost ftp]# cat /var/log/audit/audit.log     ##查看
    [root@localhost ftp]# cat /var/log/messages 
    restorecon -v '$FIX_TARGET_PATH'    ##解决方案
    网页浏览   ftp://172.25.254.219    ##虚拟机ip    (看不到建立的文件)
    [root@localhost ftp]# restorecon -v /var/ftp/*   
    restorecon reset /var/ftp/westos context unconfined_u:object_r:mnt_t:s0->unconfined_u:object_r:public_content_t:s0
    网页浏览   ftp://172.25.254.219    ##虚拟机ip    (可以看到建立文件)

    这里写图片描述
    清空日志后查看解决方案:
    这里写图片描述
    解决方案:
    这里写图片描述
    未解决时网页浏览不到建立文件:
    这里写图片描述
    解决后:
    这里写图片描述
    这里写图片描述

    五·更改selinux端口

    [root@localhost ftp]# yum  install httpd     ##安装阿帕奇
    [root@localhost ftp]# vim /etc/httpd/conf/httpd.conf    ##编写配置文件端口 
    42 Listen 6666       ##默认端口是80,可以改为6666
    [root@localhost ftp]# systemctl  restart httpd    
    Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.     ##报错(更改端口后重启不成功)
    [root@localhost ftp]# setenforce 0      ##把selinux改为警告命令
    [root@localhost ftp]# systemctl  restart httpd     ##重启成功
    [root@localhost ftp]# semanage port -l |grep  http    ##查看selinux允许的http端口
    http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
    http_cache_port_t              udp      3130
    http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
    pegasus_http_port_t            tcp      5988
    pegasus_https_port_t           tcp      5989
    [root@localhost ftp]# semanage port -a -t http_port_t -p tcp 6666     ##添加端口
    [root@localhost ftp]# semanage port -l |grep  http     ##再次查看后,端口添加成功
    http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
    http_cache_port_t              udp      3130
    http_port_t                    tcp      6666, 80, 81, 443, 488, 8008, 8009, 8443, 9000
    pegasus_http_port_t            tcp      5988
    pegasus_https_port_t           tcp      5989
    [root@localhost ftp]# setenforce 1      ##改为强制命令
    [root@localhost ftp]# systemctl restart  httpd      ##重启成功
    端口添加成功后,无论是强制令名还是警告命令都可以重启阿帕奇

    在 /etc/httpd/conf/httpd.conf 文件中更改端口为6666
    这里写图片描述
    这里写图片描述

    展开全文
  • 1、什么是安全上下文 (1)安全上下文是一个简单一致的访问控制属性 (2)特定的文件被特定的程序访问,是访问时的凭证 (3)会关闭系统认为不安全的所有功能 2、程序访问文件时匹配安全上下文 设置: 命令 功能...
  • 上下文切换
  • 文章目录一、简介(1)问题1)CPU为什么要进行上下文切换?2)上下文切换主要消耗什么资源,为什么说上下文切换次数过多不可取?3)上下文切换分几种?4)什么情况下会触发上下文切换?5)线程上下文切换和进程...
  • 深入理解Linux的CPU上下文切换

    千次阅读 2018-12-14 11:10:11
    如何理解Linux上下文切换 Linux 是一个多任务操作系统,它支持同时运行的任务数量远大于 CPU 个数。其实这些任务没有真正的同时运行,是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉...
  • 1、在标准unix/linux下的grep命令中,通过以下参数控制上下文显示: grep -C 10 keyword catalina.out 显示file文件中匹配keyword字串那行以及上下10行 grep -B 10 keyword catalina.out 显示keyword及前10行 grep...
  • 情景:文件太大,无法用vi查询 1)可以用grep命令查询,如 grep -C 50 70437fe2-82c1-45b5-93a0-906c777559c5 appliacation....-C : 匹配的上下文显示行数 -A : 匹配的行下显示的行数 -B : 匹配的行上显示的行数 ...
  • 标准unix/linux下的grep通过以下参数控制上下文   grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行 grep -B 5 foo file 显示foo及前5行 grep -A 5 foo file 显示foo及后5行   查看grep版本的...
  • 前言 判断一个程序属于IO密集型还是计算密集型...在Linux中,上下文切换可分为自愿上下文切换(voluntary_ctxt_switches)和非自愿上下文切换(nonvoluntary_ctxt_switches),自愿上下文切换如字面意思,是一种主动的
  • 如何查看系统的CPU上下文切换情况 vmstat可以查看系统的CPU上下文切换情况。它是一个常用的系统性能分析工具,主要用来分析系统的内存情况,也常用来分析系统的CPU上下文切换和中断的次数。 执行如下的命令:...
  • 安全上下文

    千次阅读 2015-04-21 21:05:23
    (一)、类型强制策略的安全上下文 所有的操作系统访问控制都是基于与主体和客体相关的访问控制属性的。在SELinux中,访问控制属性杯...指定和显示一个安全上下文常用的格式如下:用户(user):角色(role):类型标识符
  • gdb动态显示代码上下文

    千次阅读 2018-06-11 02:19:06
    gdb调试时,要用list显示运行代码行的上下文,这个功能很好,但是跟使用GUI的VS等工具比起来,还不是特别方便,但是gdb也可以做到动态地显示调试代码的上下文。调试命令添加-tui或进入后使用focus命令即可gdb -tui ...
  • 简单的插件可以显示/更改KUBECONFIG中的当前kube上下文。 安装 预编译的静态链接二进制文件可在。 二进制文件必须放在具有执行许可权的$PATH名为kubectl-ctx任何位置。 有关更多信息,请参阅插件官方文档。 兼容性 ...
  • 这是在面试过程中遇到的一个问题,以前总是直接用vi打开文件,然后搜索关键字,这样就能看到上下文信息了,但是这里有明确的规定,大文件,不用VI的情况下如何查看。 一般来说,我们是通过grep命令查找文件中关键字...
  • Linux2.6--进程抢占和上下文切换

    千次阅读 2013-08-19 10:07:59
    上下文切换,也就是从一个可执行进程切换到另一个可执行进程,由定义在kernel/sched.c中的context_switch()函数负责处理。每当一个新的进程被选出来准备投入运行的时候,schedule()就会调用该函数。它完成了两相基本...
  • linux中查看包含字符串的上下文命令

    千次阅读 2019-06-29 14:41:54
    比如:grep “123” test.log //查看test.log中包含123字符的日志 如果想查看指定内容上下几行,可以用参考下面的用法: $grep -10 ‘123’ test.log//打印匹配行的前后10行 或 $grep -C 10 ‘123’ test.log//...
  • 一、中断上下文 当执行一个中断处理程序时,内核处于中断上下文(interrput context) 中 让我们先回忆一下进程上下文。进程上下文是一种内核所处的操作模式,此时内核代表进程执行——例如, 执行系统调用或运行...
  • 标准unix/linux下的grep通过以下参数控制上下文 grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行 grep -B 5 foo file 显示foo及前5行 grep -A 5 foo file 显示foo及后5行 查看grep版本的方法...
  • SELinux 安全上下文

    2018-05-14 17:30:13
    SELinux 安全上下文 1、SELinux的安全上下文 安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),...
  • 1、信号来自进程或内核 2、线程共享进程的代码空间和数据空间(全局变量或静态变量),文件描述符,信号,...3、在linux中,使用轻量级进程来模拟线程,线程操作的相关函数通过第三方线程库 (Linuxthreads 或 Native POS
  • 以下所有操作都是在Red-hat 7.0上1.selinux 安全上下文访问规则• WEB 服务器的 HTTPD 进程设置了 SELINUX 上下文 system_u:system_r:httpd_t 标签。该上下文的重要部分 是第三个用冒号分隔的字段 SELINUX 类型 : ...
  • Linux下grep显示多行信息

    千次阅读 2017-03-16 22:23:07
    标准unix/linux下的grep通过以下参数控制上下文 grep -C 5 foo file 显示file文件中匹配foo字串那行以及上下5行grep -B 5 foo file 显示foo及前5行grep -A 5 foo file 显示foo及后5行 查看grep版本的方法是grep -V...
  • Linux下grep显示前后几行信息

    千次阅读 2016-09-29 09:15:43
    标准unix/linux下的grep通过下面參数控制上下文 grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行 grep -B 5 foo file 显示foo及前5行 grep -A 5 foo file 显示foo及后5行 查看grep版本号的...
  • SELinux的全称是Security Enhanced Linux, 就是安全加强的Linux。在SELinux之前,root账号 能够任意的访问所有文档和服务;如果某个文件设为777,那么任何用户都可以访问甚至删除;这种 方式称为DAC(主动访问机制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,695
精华内容 30,278
关键字:

linux上下文显示

linux 订阅