sleep queue



crash> ps | grep udp-server
  23260   2174   2  ffff8ae0f3751e80  IN   0.0    4352   1368  udp-server
crash> task_struct.files ffff8ae0f3751e80
  files = 0xffff8ae121916940
crash> files_struct.fdt 0xffff8ae121916940
  fdt = 0xffff8ae12ddcd300
crash> fdtable 0xffff8ae12ddcd300
struct fdtable {
  max_fds = 0x100,
  fd = 0xffff8ae121ba1000,
  close_on_exec = 0xffff8ae0f55b8b00,
  open_fds = 0xffff8ae0f55b8ae0,
  full_fds_bits = 0xffff8ae0f55b8b20,
  rcu = {
    next = 0xffff8ae121f36800,
    func = 0x28
  }
}
crash> rd 0xffff8ae121ba1000 5
ffff8ae121ba1000:  ffff8ae133967d00 ffff8ae133967d00   .}.3.....}.3....
ffff8ae121ba1010:  ffff8ae133967d00 ffff8ae10fcec400   .}.3............
ffff8ae121ba1020:  0000000000000000                    ........
crash> file ffff8ae10fcec400 | grep private_data
  private_data = 0xffff8ae10f85b980,
crash> socket 0xffff8ae10f85b980
struct socket {
  state = SS_UNCONNECTED,
  type = 0x2,
  flags = 0x0,
  wq = 0xffff8ae0f4c23d80,
  file = 0xffff8ae10fcec400,
  sk = 0xffff8ae0f1531980,
  ops = 0xffffffffbeef4660
}
crash> socket_wq 0xffff8ae0f4c23d80 -o
struct socket_wq {
  [ffff8ae0f4c23d80] wait_queue_head_t wait;
  [ffff8ae0f4c23d98] struct fasync_struct *fasync_list;
  [ffff8ae0f4c23da0] unsigned long flags;
  [ffff8ae0f4c23da8] struct callback_head rcu;
}
SIZE: 0x40
crash> wait_queue_head_t ffff8ae0f4c23d80 -o
typedef struct wait_queue_head {
  [ffff8ae0f4c23d80] spinlock_t lock;
  [ffff8ae0f4c23d88] struct list_head head;
} wait_queue_head_t;
SIZE: 0x18
crash> list -H ffff8ae0f4c23d88 -s wait_queue_entry -o wait_queue_entry.entry
ffff9b9283f53c98
struct wait_queue_entry {
  flags = 0x1,
  private = 0xffff8ae0f3751e80,
  func = 0xffffffffbe79c570,
  entry = {
    next = 0xffff8ae0f4c23d88,
    prev = 0xffff8ae0f4c23d88
  }
}
crash> dis 0xffffffffbe79c570
0xffffffffbe79c570 <receiver_wake_function>:    nopl   0x0(%rax,%rax,1) [FTRACE NOP]
0xffffffffbe79c575 <receiver_wake_function+0x5>:        test   %rcx,%rcx
0xffffffffbe79c578 <receiver_wake_function+0x8>:        je     0xffffffffbe79c57f <receiver_wake_function+0xf>
0xffffffffbe79c57a <receiver_wake_function+0xa>:        test   $0x9,%cl
0xffffffffbe79c57d <receiver_wake_function+0xd>:        je     0xffffffffbe79c584 <receiver_wake_function+0x14>
0xffffffffbe79c57f <receiver_wake_function+0xf>:        jmpq   0xffffffffbe0c96c0 <autoremove_wake_function>
0xffffffffbe79c584 <receiver_wake_function+0x14>:       xor    %eax,%eax
0xffffffffbe79c586 <receiver_wake_function+0x16>:       retq
0xffffffffbe79c587 <receiver_wake_function+0x17>:       nopw   0x0(%rax,%rax,1)
crash>



 0xffffffffbe79c570 : receiver_wake_function+0x0/0x20 [kernel]
 0xffffffffbe0c8fc6 : __wake_up_common+0x86/0x120 [kernel]
 0xffffffffbe0c922a : __wake_up_common_lock+0x6a/0x90 [kernel]
 0xffffffffbe78f66c : sock_def_readable+0x3c/0x60 [kernel]
 0xffffffffbe831668 : __udp_enqueue_schedule_skb+0x198/0x1b0 [kernel]
 0xffffffffbe831ba6 : udp_queue_rcv_skb+0x1a6/0x430 [kernel]
 0xffffffffbe831ea6 : udp_unicast_rcv_skb+0x76/0x90 [kernel]
 0xffffffffbe833116 : __udp4_lib_rcv+0x446/0xa90 [kernel]
 0xffffffffbe7fee82 : ip_local_deliver_finish+0x92/0x1d0 [kernel]
 0xffffffffbe7ff41b : ip_local_deliver+0x5b/0xc0 [kernel]
 0xffffffffbe7ff4c2 : ip_rcv+0x42/0xb0 [kernel]
 0xffffffffbe7ae880 : __netif_receive_skb_one_core+0x40/0x50 [kernel]
 0xffffffffbe7adc94 : netif_receive_skb_internal+0x24/0xb0 [kernel]
 0xffffffffc0b84d69 : tun_get_user+0xd29/0xe70 [tun]
 0xffffffffc0b84eff : tun_chr_write_iter+0x4f/0x70 [tun]
 0xffffffffbe25eea5 : __vfs_write+0xe5/0x170 [kernel]
 0xffffffffbe25f0cd : vfs_write+0xad/0x1a0 [kernel]
 0xffffffffbe25f312 : ksys_write+0x42/0x90 [kernel]
 0xffffffffbe003ddf : do_syscall_64+0x4f/0x100 [kernel]
 0xffffffffbea0008c : entry_SYSCALL_64_after_hwframe+0x44/0xa9 [kernel]
parms: wait=0xffff9b9283f53c98 mode=0x1 sync=0x1 key=0xc3
execname: tun
ts: 2, 3
 0x7fe4f79d62c0 : __write_nocancel+0x7/0x57 [/lib/x86_64-linux-gnu/libc-2.23.so]
 0x400fea : cwrite+0x29/0x4b [/home/mishuang/prg/c/tun/tun]
 0x401b81 : main+0x88f/0x8de [/home/mishuang/prg/c/tun/tun]
 0x7fe4f78ff830 : __libc_start_main+0xf0/0x1d0 [/lib/x86_64-linux-gnu/libc-2.23.so]
 0x400db9 : _start+0x29/0x30 [/home/mishuang/prg/c/tun/tun]

 

### Python 中 Queue 模块的介绍 `Queue` 模块实现了多生产者、多消费者队列,特别适用于线程间的通信。这个模块提供了几种不同类型的队列实现,包括 FIFO 队列 `Queue.Queue()`,LIFO 队列 `queue.LifoQueue()`, 和优先级队列 `queue.PriorityQueue()`。 ### 创建和使用基本队列 创建一个简单的 FIFO 队列并执行入队 (`put`) 和出队 (`get`) 操作如下所示: ```python import queue q = queue.Queue() for i in range(5): q.put(i) while not q.empty(): print(q.get()) ``` 这段代码会依次打印0到4, 这是因为FIFO (先进先出) 的性质决定了最先放入的数据项会被最先生效取出[^1]。 ### 使用 LIFO 队列 对于需要后进先出的行为,则可以采用 LIFO 队列: ```python lifo_q = queue.LifoQueue() for num in ['task1', 'task2', 'task3']: lifo_q.put(num) while not lifo_q.empty(): print(lifo_q.get()) ``` 这将按照 task3 到 task1 的顺序输出数据项. ### 处理带有时限的任务 当处理可能阻塞的操作时,比如从空队列获取项目或向已满队列添加新条目时,可以通过设置超时参数来避免无限期等待的情况发生。 ```python try: item = my_queue.get(timeout=1.0) # 尝试在一秒内获得一项;如果失败则抛出异常 except queue.Empty: print('No items available') ``` 同样地,在放置元素的时候也可以应用相同的逻辑防止程序卡死于尝试写入已经满了的队列中. ### 实现线程安全的计数器 下面的例子展示了如何利用 `Queue` 来构建一个多线程环境中工作的简单计数器应用程序: ```python from threading import Thread import time def worker(queue): while True: try: value = queue.get_nowait() except queue.Empty: break else: print(f'Working on {value}') time.sleep(1) print(f'Finished {value}') queue.task_done() if __name__ == '__main__': work_queue = queue.Queue() threads_num = 5 tasks = list(range(threads_num)) for t in tasks: work_queue.put(t) workers = [] for _ in range(threads_num): thread = Thread(target=worker, args=(work_queue,)) workers.append(thread) thread.start() for w in workers: w.join() print('All done!') ``` 在这个例子中,多个工作线程被用来并发地完成一系列任务,并通过共享同一个 `Queue` 对象来进行协调.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值