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

网站诊断方法专做运动品牌的网站

网站诊断方法,专做运动品牌的网站,电子政务网站建设的挑战,网页设计教育培训等待队列在Linux内核中用来阻塞或唤醒一个进程#xff0c;也可以用来同步对系统资源的访问#xff0c;还可以实现延迟功能 在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠状态#xff0c;然后等待条件得到满足的时候再继续运行#xff0c;进入运行状态。这…等待队列在Linux内核中用来阻塞或唤醒一个进程也可以用来同步对系统资源的访问还可以实现延迟功能 在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠状态然后等待条件得到满足的时候再继续运行进入运行状态。这种需求需要等待队列机制的支持。Linux中提供了等待队列的机制该机制在内核中应用很广泛。 在Linux内核中使用等待队列的过程很简单首先定义一个wait_queue_head然后如果一个task想等待某种事件那么调用wait_event等待队列事件就可以了。 等待队列应用广泛但是内核实现却十分简单。其涉及到两个比较重要的数据结构__wait_queue_head该结构描述了等待队列的链头其包含一个链表和一个原子锁结构定义如下 struct wait_queue_head { spinlock_t lock;                    /* 保护等待队列的原子锁 */ struct list_head task_list;          /* 等待队列 */ }; typedef struct wait_queue_head wait_queue_head_t; wait_queue_entry该结构是对一个等待任务的抽象。每个等待任务都会抽象成一个wait_queue_entry并且挂载到wait_queue_head上。 该结构定义如下struct wait_queue_entry { unsigned int flags;         //1:互斥进程0非互斥进程 void *private;                       /* 通常指向当前任务控制块 */ /* 任务唤醒操作方法该方法在内核中提供通常为autoremove_wake_function */ wait_queue_func_t func;             struct list_head task_list;              /* 挂入wait_queue_head的挂载点 */ }; typedef struct wait_queue_entry wait_queue_entry_t; 定义等待队列: 定义并初始化一个名为name的等待队列 ,注意此处是定义一个wait_queue_t类型的变量name并将其private与设置为tsk DECLARE_WAITQUEUE(name,tsk); //任务唤醒操作方法为default_wake_function Linux中等待队列的实现思想如下图所示当一个任务需要在某个wait_queue_head上睡眠时将自己的进程控制块信息封装到wait_queue_entry中然后挂载到wait_queue_head的链表中执行调度睡眠。当某些事件发生后另一个任务进程会唤醒wait_queue_head上的某个或者所有任务唤醒工作也就是将等待队列中的任务设置为可调度的状态并且从队列中删除。 使用等待队列时首先需要定义一个wait_queue_head这可以通过DECLARE_WAIT_QUEUE_HEAD宏来完成这是静态定义的方法。该宏会定义一个wait_queue_head并且初始化结构中的锁以及等待队列。当然动态初始化的方法也很简单初始化一下锁及队列就可以了。 一个任务需要等待某一事件的发生时通常调用wait_event该函数会定义一个wait_queue_entry描述等待任务并且用当前的进程描述块初始化wait_queue_entry然后将wait_queue_entry加入到wait_queue_head中。函数实现流程说明如下 1、  用当前的进程描述块PCB初始化一个wait_queue_entry描述的等待任务。 2、  在等待队列锁资源的保护下将等待任务加入等待队列。 3、  判断等待条件是否满足如果满足那么将等待任务从队列中移出退出函数。 4、 如果条件不满足那么任务调度将CPU资源交与其它任务。 5、 当睡眠任务被唤醒之后需要重复2、3步骤如果确认条件满足退出等待事件数。 等待队列编程接口 等待队列接口函数介绍 #include linux/wait.h //头文件包含 1.定义一个等待队列头 wait_queue_head_t my_queue; 2.初始一个等待队列头 init_waitqueue_head(my_queue); 定义并初始化一个等待队列头 DECLARE_WAIT_QUEUE_HEAD(my_queue); 3.进程的睡眠操作——条件睡眠 //判断condition条件决定是否将当前进程推入等待队列(条件为假时)此函数为宏函数 wait_event(wait_queue_head_t wq, int condition); /*可以被系统消息打断*/ wait_event_interruptible(wait_queue_head_t wq,int condition); wait_event_timeout(wait_queue_head_t wq, int condition, long timeout) wait_event_interruptiblble_timeout(wait_queue_head_t wq,int condition, long timeout); 参数wq:表示等待队列头 参数condition:阻塞条件为假(0)则进入休眠直到wake_up且condition为真条件成立才退出 参数timeout表示睡眠指定时长时钟滴答度量eg.延时2秒2*HZ后自动转入唤醒状态 3.进程的睡眠操作——无条件睡眠(不建议使用,新内核将去掉这些接口请使用上面的接口) /* * These are the old interfaces to sleep waiting for an event. * They are racy.  DO NOT use them, use the wait_event* interfaces above. * We plan to remove these interfaces. */ //将当前进程推入等待队列将其睡眠wake_up唤醒 sleep_on(wait_queue_head_t *q); /*可以被系统消息打断*/ interruptible_sleep_on(wait_queue_head_t *q); long sleep_on_timeout(wait_queue_head_t *q, long timeout) long interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout) 参数wq:表示等待队列头 参数timeout表示睡眠指定时长后自动转入唤醒状态 4.将非互斥进程插入等待队列链表的第一个位置需要自己定义wait_queue_t add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait) 函数将互斥进程插入等待队列链表的最后一个位置 add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait) 5.进程唤醒函数 wake_up(wait_queue_head_t *wq); wake_up_all(wait_queue_head_t *wq); wake_up_interruptible(wait_queue_head_t *wq); 注意事项: 1.唤醒函数和导致睡眠函数要配对使用如果导致睡眠函数使用带interruptible的则唤醒函数也要使用interruptible的。 2.在使用wake_up唤醒进程之前要将wait_event中的condition变量的值赋为真否则该进程被唤醒后会立即再次进入睡眠 3. wake_up()每次只能唤醒一个进程而且是从队列头开始唤醒的而wait_event()函数每次会将新建的等待队列插到队列头因此最后调用wait_event()函数的进程先被唤醒如果要唤醒某个特定的进程没有现成的函数按照本人理解只能使用wake_up_all()函数唤醒所有进程然后在通过条件condition来控制(每个进程使用不同的变量来控制在wake_up_all()函数后只将要唤醒的进程的变量置成真)。
http://www.zqtcl.cn/news/671174/

相关文章:

  • 做网站免费的app是什么免费公司注册
  • 做平面素材比较好的网站网络系统设计的步骤
  • 西安网站建设 乐云seo全国旅游景点网站开源
  • 中山快速做网站价格网站投稿源码
  • 免费网站建设教程青岛网站建设收费哪个平台好
  • 关于网站建设外文文献金蝶软件多少钱一套
  • 有高并发量门户网站开发经验国家商标局官网查询
  • 正规的招聘网站可信网站标志
  • 网站举报能不能查到举报人佛山企业网站建设电话
  • 家居网站建设如何现在去长沙会被隔离吗
  • 电子烟网站建设win2008iis7配置网站
  • 做网站的是什么职业微信公众号模板素材网站
  • 重庆川九建设有限责任公司官方网站成都网站海口网站建设
  • 珠宝 网站模板如何做公司官网
  • 贵阳网站制作免费iis7.5网站权限配置
  • 温州网站建设专业的公司移动互联网开发学什么专业
  • 集团企业网站建设方案运动服饰网站建设项目规划书
  • 简述网站建设的一般步骤简约的网站建设
  • wordpress删除用户头像昆明做网站优化的公司
  • 西安响应式网站网页设计的模板
  • 古装衣服店网站建设页面网站执行速度
  • 哪里的网站建设哈尔滨网络优化推广公司
  • 给网站做友情链接凡科网干嘛的
  • 网站经常出现502牧星网站建立
  • 个人网站建设的收获dw网站导航怎么做
  • 徐州网站设计快速排名网站
  • dede手机网站跳转口碑营销平台
  • 开一个素材设计网站怎么做的网页传奇手机版
  • 网站开发后端框架什么意思树莓派3 部署wordpress
  • 站长之家最新域名查询合肥网站建设5k5