当前位置: 首页 > news >正文

商机互联公司做网站怎么样dede小视频网站源码

商机互联公司做网站怎么样,dede小视频网站源码,如何用织梦仿制网站,南阳建网站公司第十八章 并发与竞争 18.1 并发与竞争 18.1.1 并发 早期计算机 CPU单核心时#xff0c;由于 CPU执行速度快于I/O操作#xff0c;常因等待 I/O而空闲。 为提高 CPU利用率#xff0c;引入了并发执行理论。并发通过算法在CPU执行I/O等待时切换至其他任务#xff0c;使多个任…第十八章 并发与竞争 18.1 并发与竞争 18.1.1 并发 早期计算机 CPU单核心时由于 CPU执行速度快于I/O操作常因等待 I/O而空闲。 为提高 CPU利用率引入了并发执行理论。并发通过算法在CPU执行I/O等待时切换至其他任务使多个任务看似同时执行实际上CPU快速切换任务执行从而提高了整体效率。 18.1.2 并行 并发适用于单核CPU通过任务切换模拟同时执行 并行针对多核CPU每个核心独立执行不同任务实现真正的同时运行提高执行效率。 18.1.3 并发并行 实际场景中CPU核心数少于任务数时会同时出现并发单核内任务切换和并行多核间任务独立执行。 例如双核CPU执行四个任务时每核并行执行一个任务同时每核内部还需并发处理其他任务。 为简化讨论后续章节将并发与并行统称为并发。 18.1.4 竞争 并发访问共享资源时可能导致的不一致性称为“竞争条件”。 这种竞争由以下主要原因造成 多线程并发在Linux等多任务操作系统中多个线程或进程可能同时执行它们尝试访问和修改同一资源时若未进行适当同步便会产生竞争条件。 中断处理系统中断如硬件中断能够打断当前正在执行的程序如果中断服务例程ISR也访问了被打断程序正在使用的共享资源且未做适当同步将导致数据竞争。 抢占式调度在支持抢占式调度的系统中如Linux 2.6及以后版本高优先级任务可以中断低优先级任务的执行。若两者均操作同一共享资源且未采取同步措施则会发生竞争。 多处理器并发在多处理器SMP系统中不同处理器核心可能并发执行不同线程这些线程若同时访问同一共享资源而未同步将引发跨核心的竞争条件。 简而言之并发访问共享资源时若未加同步控制多线程、中断处理、抢占式调度及多处理器并发均可能导致竞争条件的发生。 18.1.5 共享资源的保护 共享资源是多个实体可访问的资源为避免竞争需同步保护。 比如同一个驱动里面写两个方法一个方法延时4秒另一个方法延时2秒两个方法读取同一个变量。装载驱动以后用write方法写驱动两次由于驱动装载后以文件形式存在属于共享资源会导致竞争条件出现数据不一致。 第十九章 原子操作 19.1 原子操作 在 Linux内核中原子操作是确保数据在并发环境下一致性的关键机制。原子操作意味着操作在执行过程中不会被中断从而避免了竞争条件。 19.1.1 原子整型操作 在Linux内核中atomic_t 和 atomic64_t 分别用于32位和64位系统的原子整形操作。 原子整型操作基于 内存屏障来确保原子性         Load Barrier 和 Store Barrier即读屏障和写屏障。 typedef struct { int counter; } atomic_t; #ifdef CONFIG_64BIT typedef struct { long counter; } atomic64_t; #endif ATOMIC_INIT(int i); //初始化原子变量,并返回原子整型变量。 int atomic_read(atomic_t *v); //读取原子变量的值。 void atomic_set(atomic_t *v, int i); //设置原子变量的值。 void atomic_add(int i, atomic_t *v); //原子地将i加到v上。 void atomic_sub(int i, atomic_t *v); //原子地从v中减去i。 void atomic_inc(atomic_t *v); //原子地将v加1。 void atomic_dec(atomic_t *v); //原子地将v减1。 int atomic_dec_return(atomic_t *v); //原子地将v减1并返回新值。 int atomic_inc_return(atomic_t *v); //原子地将v加1并返回新值。 int atomic_sub_and_test(int i, atomic_t *v); //原子地从v中减去i如果结果为0则返回真。 int atomic_dec_and_test(atomic_t *v); //原子地将v减1如果结果为0则返回真。 int atomic_inc_and_test(atomic_t *v); //原子地将v加1如果结果为0则返回真。 int atomic_add_negative(int i, atomic_t *v); //原子地将i加到v上如果结果为负则返回真。 19.1.2 原子位操作 原子位操作是直接对内存中的位进行操作无需 atomic_t结构。 void set_bit(int nr, void *p); //将p地址的第nr位置1。 void clear_bit(int nr, void *p); //将p地址的第nr位清零。 void change_bit(int nr, void *p); //将p地址的第nr位翻转。 int test_bit(int nr, void *p); //获取p地址的第nr位的值。 int test_and_set_bit(int nr, void *p); //将p地址的第nr位置1并返回原值。 int test_and_clear_bit(int nr, void *p); //将p地址的第nr位清零并返回原值。 int test_and_change_bit(int nr, void *p);//将p地址的第nr位翻转并返回原值。 使用了原子操作后同一时间只允许一个应用来打开设备节点以此防止共享资源竞争的产生。第二次打开同一个设备节点会报错。 第二十章 自旋锁 原子操作只能对整形变量或者位进行保护对于结构体或者其他类型的共享资源就轮到自旋锁的出场了。 自旋锁是一种用于保护共享资源的非阻塞锁机制。当某个线程尝试获取已被占用的锁时该线程会持续消耗CPU资源不断尝试获取锁而不是被挂起。这种机制适用于锁持有时间非常短的场景以避免线程切换的开销。 内核中以 spinlock_t 结构体来表示自旋锁定义在“内核源码/include/linux/spinlock_types.h” 文件中。 DEFINE_SPINLOCK();        //定义并初始化自旋锁。spin_lock_init();                   //初始化自旋锁。spin_lock();                          //尝试获取锁若失败则持续自旋。spin_unlock();                      //释放锁。 spin_trylock();                      //尝试获取锁若失败则立即返回0。spin_is_locked();                 //检查锁是否被占用。 //定义并初始化自旋锁。 DEFINE_SPINLOCK(spinlock_t lock); //初始化自旋锁。 spin_lock_init(spinlock_t *lock);//尝试获取锁若失败则持续自旋。 spin_lock(spinlock_t *lock); //释放锁。 spin_unlock(spinlock_t *lock); //尝试获取锁若失败则立即返回0 spin_trylock(spinlock_t *lock); //检查锁是否被占用。 spin_is_locked(spinlock_t *lock); 使用步骤 申请锁在访问共享资源前尝试获取自旋锁。 临界区获取锁后进入临界区执行操作。 释放锁操作完成后释放锁。 #include linux/spinlock.h DEFINE_SPINLOCK(lock); //lock在使用DEFINE_SPINLOCK时是直接定义并初始化的,无需别处定义 //spinlock_t lock SPIN_LOCK_UNLOCKED;// SPIN_LOCK_UNLOCKED用在需要初始化的场合,返回未上锁的spinlock_tvoid increment_counter() { spin_lock(lock); // 获取锁 counter; // 临界区操作 spin_unlock(lock); // 释放锁 } // 在其他线程中调用 increment_counter() 来安全地增加 counter 如果在驱动的open函数中上了自旋锁则另一个进程没有拿到锁就会自旋等待。 第二十一章 自旋锁死锁 死锁是多个进程或线程在执行过程中因互相等待对方持有的资源而无法继续执行从而导致无限期阻塞的现象。在自旋锁spinlock的上下文中死锁可以发生在以下几种情况 1. 进程阻塞导致的死锁 情况描述 进程A持有自旋锁在内核态中被阻塞如等待I/O操作或睡眠。如果此时内核调度了进程B而进程B也尝试获取同一个自旋锁由于自旋锁的特性忙等待进程B会无限期地循环检查锁的状态而进程A因阻塞无法释放锁导致死锁。 解决办法 确保持有自旋锁的代码执行时间尽可能短。 避免在持有自旋锁时调用可能导致进程阻塞的函数如睡眠、等待I/O等。 2. 中断导致的死锁 情况描述 进程A持有自旋锁时CPU响应了一个中断中断处理函数也尝试获取同一个自旋锁。如果中断被允许则中断处理函数将自旋等待锁释放但锁由于被进程A持有而无法释放因为进程A在中断发生时被暂停导致死锁。 解决办法 在获取自旋锁之前禁用中断使用spin_lock_irq或spin_lock_irqsave。 在释放自旋锁后重新启用中断使用spin_unlock_irq或spin_unlock_irqrestore。 //禁止本地中断,并获取自旋锁 void spin_lock_irq(spinlock_t *lock) //激活本地中断,并释放自旋锁 void spin_unlock_irq(spinlock_t *lock) //保存中断状态,关闭中断并获取自旋锁。 void spin_lock_irqsave(spinlock_t *lock, unsigned long flags) //用来存储函数调用前的中断状态 //恢复中断状态,打开中断并释放自旋锁 void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) //用来存储函数调用前的中断状态//关闭下半部,获取自旋锁 void spin_lock_bh(spinlock_t *lock) //打开下半部,获取自旋锁 void spin_unlock_bh(spinlock_t *lock) 第二十二章 信号量 信号量是操作系统中用于同步和互斥的机制它通过一个全局变量信号量值来控制对共享资源的访问。信号量可以是计数型允许多个线程同时访问或二值型只允许一个线程访问。信号量的值不能为负当值为0时访问资源的线程需等待。访问资源时信号量减一访问完成后加一。 相比于自旋锁信号量具有休眠特性适用于长时间占用资源的场合但不能用于中断处理。在短时间访问资源的场景下自旋锁效率更高。 同时使用自旋锁和信号量时应先获取信号量再获取自旋锁以避免在持有自旋锁时进入睡眠状态。 Linux内核中信号量由 semaphore结构体表示包含锁、计数器和等待队列。 /*信号量结构体*/ struct semaphore { atomic_t count; // 信计数值 raw_spinlock_t lock; // 自旋锁 struct list_head wait_list; // 等待该信号量的线程队列 }; // 注意raw_spinlock_t 是Linux内核中用于低级自旋锁的类型 // 它与通用的 spinlock_t 不同后者在中断上下文中可能不安全。 DEFINE_SEMAPHORE();    //定义并初始化信号量为1。sema_init();                           //初始化信号量设置其值为val。down();                                  //阻塞式获取信号量无法被中断。down_interruptible();             //可中断地获取信号量允许被信号中断。   down_trylock();                     //获取信号量拿不到则返回非0值不阻塞。up();                                      //释放信号量。 //定义并初始化信号量为1。 DEFINE_SEMAPHORE(name); //初始化信号量设置其值为val。 sema_init(struct semaphore *sem, int val); //阻塞式获取信号量无法被中断。 down(struct semaphore *sem); //可中断地获取信号量允许被信号中断。 down_interruptible(struct semaphore *sem); //尝试获取信号量获取不到则返回非0值不阻塞。 down_trylock(struct semaphore *sem); //释放信号量。 up(struct semaphore *sem); #include linux/semaphore.h struct semaphore sem; // 初始化信号量 sema_init(sem, 1); // 例如设置为二值信号量 // 访问共享资源 void access_resource(void) { if (down_interruptible(sem)) { // 获取信号量失败可能是被信号中断 return; } // 访问共享资源... // 释放信号量 up(sem); } 第二十三章 互斥锁 互斥锁确保多线程访问共享资源时互斥即一次只有一个线程能访问。锁有两种状态锁定和非锁定。线程访问资源前需先尝试锁定锁若锁已被占用则线程等待锁释放后等待的线程继续执行。 在Linux内核中互斥锁通过 mutex结构体表示定义在include/linux/mutex.h中。它包含了一些关键的成员如锁的所有者、等待锁的线程队列等。 /*互斥锁结构体*/ struct mutex { atomic_long_t owner; //锁持有者spinlock_t wait_lock; //自旋锁struct list_head wait_list;//等待该信号量的线程对列// 其他调试和性能优化相关字段 }; DEFINE_MUTEX();        //定义并初始化一个互斥锁变量mutex_init();                    //初始化一个互斥锁mutex_lock();                   //尝试获取锁如果锁被占用则休眠mutex_unlock();               //释放锁        mutex_is_locked();          //判断锁是否被占用 //定义并初始化一个互斥锁变量 DEFINE_MUTEX(name);//初始化一个互斥锁 void mutex_init(struct mutex *lock);//尝试获取锁如果锁被占用则休眠 void mutex_lock(struct mutex *lock);//释放锁 void mutex_unlock(struct mutex *lock)//判断锁是否被占用 int mutex_is_locked(struct mutex *lock) #include linux/mutex.h DEFINE_MUTEX(my_mutex); void thread_function(void) { mutex_lock(my_mutex); // 访问或修改共享资源 // ... mutex_unlock(my_mutex); } // 假设在多个线程或任务中调用 thread_function
http://www.hkea.cn/news/14494762/

相关文章:

  • 南京那些公司做网站游戏点卡平台网站开发
  • 平罗县住房和城乡建设局网站用源码做自己的网站
  • 梁山网站建设费用天猫网站设计特点
  • 公司做网站需要多少钱ui设计专业
  • 资源网站排名优化seoasp.net网站发布到虚拟主机
  • 800元五合一建站南京蓝牙app开发公司
  • 简洁企业网站源码棋牌网站建设要多少钱
  • iis如何发布asp.net网站做网站备案地点
  • 列出寻找网站关键词的几种途径图片制作的标准是什么
  • 网站中做背景图片位置咋写南宁企业建站系统模板
  • 知名的家居行业网站开发制作一个网站数据库怎么做
  • 找人做网站需要注意什么如何设计公众号
  • 怎样用dw做 网站首页做网站哪些公司好
  • 一个设计网站多少钱wordpress 模板破解版
  • wordpress的网站是php的代码wordpress文章多个分类显示不出来
  • 做网站作品是静态wordpress 多语言插件
  • 做标志的网站网站已备案下一步怎么做
  • 信阳网站设计古玩网站建设意义
  • mvc 网站开发百度竞价排名机制
  • 玩具 网站模板成都农业网站建设
  • 网站被墙了怎么办通州郑州阳网站建设
  • 枣阳网站开发公司哪家好广州模板建站软件
  • 国外设计素材网站如何建设学校门户网站
  • 手机可以开发网站临安建设投标网站
  • 域名是否就是网站在线阅读小说网站怎么建设
  • 用ps做零食网站模板wordpress添加管理员
  • 医疗器械类网站前置审批快速搭建网站前端
  • 免费软件制作网站模板下载软件迅速上排名网站优化
  • 亦庄做网站ppt下载免费完整版
  • 做网站的哪家公司好工业产品设计与创客实践赛题库