怎么做电商平台网站,WordPress需要多大mysql,做汽车团购的网站建设,wordpress contact 伪静态linux内核就相当于不断对请求进行响应的服务器#xff0c;这些请求可能来自CPU#xff0c;可能来自发出中断的外部设备。我们将内核看作两种请求的侍者。 #xff08;1#xff09;老板提出请求#xff0c;侍者如果空闲#xff0c;为老板服务。#xff08;系统调用或异常… linux内核就相当于不断对请求进行响应的服务器这些请求可能来自CPU可能来自发出中断的外部设备。我们将内核看作两种请求的侍者。 1老板提出请求侍者如果空闲为老板服务。系统调用或异常 2侍者正在无顾客服务时老板提出请求则转去为老板服务。中断异常嵌套 3侍者正为老板服务时另一老板提出请求此时转去为另一个老板服务回头再给这个老板服务。中断嵌套 4老板可命令老板停止为当前客户服务侍者完成老板请求之后可能为新选中的顾客服务。内核抢占 内核抢占特点一个内核态运行的进程可以被执行内核函数期间被另一个进程取代。有关内核抢占参照本文内核抢占 同步概念 临界区是一段代码进入临界区的内核控制路径必须全部执行这段代码其他控制路径才能进入临界区。单核cpu可以通过简单的关闭中断、禁止内核抢占来进行保证临界区的互斥访问多cpu就不行 了。 下列条件不需要同步 1执行中断的内核路径不可能被可延迟或系统调用服务例程内核路径所中断所以不需要同步 2软中断和tasklet不能再同一个CPU上交替执行所以仅这两者存在时不需要同步 3仅被一种tasklet访问的数据结构不需要同步。 同步原语 1.每CPU变量 最重要的同步技术就是把内核变量声明为每CPU变量每CPU变量主要是数据结构的数组系统每个CPU对应数组的一个元素。一个CPU不应该访问与其他CPU对应的数组元素。每个CPU可以随意修改自己的元素不用担心出现竞争条件。每CPU变量对来自异步函数中断和可延迟函数的访问不提供保护在这种情况下需要提供另外的同步原语。内核抢占可导致每CPU变量产生竞争条件。 2.原子操作 这样的操作是芯片原子级的执行这样的指令中间不能中断且避免其他的CPU访问同样的内存单元。这种原子操作通过“锁定”内存总线实现直到这条指令执行结束为止其他处理器不能访问该内存单元。原子操作 atom_read(v)atom_setatom_addatom_sub..... 3.优化和内存屏障 当使用编译器的时候编译器可能重新安排汇编语言指令以使寄存器以最优的方式执行。当处理同步时必须避免指令重新排序。可通过设置内存屏障确保原语之后的操作语句执行之前原语操作之前的语句已经完成这样保证汇编语句顺序执行。 4.自旋锁 自旋锁是用来多处理环境中的一种特殊锁。如果内核路径发现锁是开着的则可获取锁进入临界区。相反如果内核路径发现锁由另一个CPU上的控制路径所持有则在周围“旋转”其实占着cpu死等等到为止。 自旋锁的循环指令表示“忙等”这种忙等是nop操作经过linux优化了说是节省能源。注意在忙等期间内核抢占有效就是等待的进程可能被其他进程替代。一般来说由自旋锁所保护的每个临界区都是禁止内核抢占的。 spinlock_t含有的两个字段 slock;自旋锁的状态1表示未加锁 break_lock:表示有无等待该锁的进程 提供的操作 spin_lock_init();//初始化一把锁 spin_lock();//循环试图获得自旋锁 spin_unlock();//释放锁 spin_unlock_wait();//等待锁 spin_is_locked();//判断锁释是否被持有 5.读写自旋锁 读写锁是为了增加内核的并发能力。该锁的特点读者进程可以同时多个进入临界区写者只能一个进入临界区有写者的时候读者无法进入。读者和写者具有相同的优先权。 读/写自旋锁是一个rwlock_t结构。有read_lock和write_lock。 6.顺序锁 读/写自旋锁中读者和写者具有相同的优先权。事实上可以这样即使读者在读的时候也可以让写者继续进行这种策略写者永远不会等待。但是读者需要对所读到的东西检查检查是否有被某个写者修改一旦发现被修改要重新读取。 7.读-拷贝-创新RCU 写者要写的时候拷贝一份出来写然后拷回去。 8.信号量 信号量其实也是为了实现互斥和同步无外乎就是一种P/V操作封装。但是信号量中的进程一旦发现资源不可用时就将自己挂起进入睡眠状态这不是一种忙等。 然后使用该资源的进程使用结束后唤醒正在等待的进程ok同步完毕。 linux提供两种信号量1内核信号量由内核控制路径控制2System V IPC信号量用户态进程使用。 9.信号量 跟信号量是一样的但是允许多个读者同时进入设计的你懂的。