上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 19 下一页
摘要: 内核多线程是在项目中使用到,自己也不熟悉,遇到一个很囧的问题,导致cpu运行100%。这是写的第一个内核线程程序,通过全局变量来实现两个内核线程之间的通信。但是这里遇到致命错误,就是:每当 wait_event_interruptible()被wake_up_interruptible 唤醒之后线程就进入死循环。后面发现是线程不会主动的自己调度,需要显式的通过schedule 或者 schedule_timeout()来调度。如果不加tc = 0 这一行,wait_event_intrruptible()就一直不会睡眠(参见前面的文章“等待队列”),不会被调度放弃CPU,因此进入死循环。这个过 阅读全文
posted @ 2012-06-11 23:34 KingsLanding 阅读(7805) 评论(1) 推荐(0) 编辑
摘要: Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的。内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的调度由内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的基本单位。这与用户线程是不一样的。因为内核线程只运行在内核态,因此,它只能使用大于PAGE_OFFSET(3G)的地址空间。内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置为NULL;它只在 内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占 阅读全文
posted @ 2012-06-11 22:17 KingsLanding 阅读(35991) 评论(0) 推荐(1) 编辑
摘要: import urllibimport urllib2import cookielibimport jsonimport reimport getpassclass Login_kp: def __init__(self): cj = cookielib.CookieJar() self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(self.opener) self.opener.addheaders = ... 阅读全文
posted @ 2012-06-09 21:35 KingsLanding 阅读(997) 评论(0) 推荐(0) 编辑
摘要: 通过 前一篇文章的介绍我们队等待队列有了一个比较具体的认识,本文将来分析一下等待队列是如何睡眠一个进程和如何唤醒一个进程的。使用等待队列前通常先定义一个等待队列头:static wait_queue_head_t wq ,然后调用wait_event_*函数将等待某条件condition的当前进程插入到等待队列wq中并睡眠,一直等到condition条件满足后,内核再将睡眠在等待队列wq上的某一进程或所有进程唤醒。这里我们来分析一下唤醒的过程,举比较常用的wait_event_interruptible来分析:/** * wait_event_interruptible - sleep unt 阅读全文
posted @ 2012-06-09 10:23 KingsLanding 阅读(6857) 评论(2) 推荐(4) 编辑
摘要: 在Linux内核中等待队列有很多用途,可用于中断处理、进程同步及定时。我们在这里只说,进程经常必须等待某些事件的发生。等待队列实现了在事件上的条件等待: 希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制全。因此,等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒它们。等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头(wait queue head),等待队列头是一个类型为wait_queue_head_t的数据结构(1)定义等待队列头(相关内容可以在linux/include/wait.h中找到)等待队列头结构体的定义:struct __w 阅读全文
posted @ 2012-06-09 10:16 KingsLanding 阅读(15690) 评论(2) 推荐(7) 编辑
摘要: 指针的运算和普通的算术运算是不同的,支持的运算符也很少,有时候你把两个指针相减得到的结果可能会不如你所想。今天来稍微总结一下:1.指针的有限算术运算:自增(++), 自减(--), 加上一个整数(+, +=), 减去一个整数(-, -=), 以及减去另一个指针2.指针加上或减去一个整数时,并非简单地加上或减去该整数值,而是加上该整数与指针引用的对象的大小的乘积。对象的大小(字节数)取决于对象的数据类型。3.对于x=p1-p2,是把从p2到p1的数组元素的个数赋给x。因为除了数组元素外,我们不能认为两个相同类型的变量是在内存中连续存储的,所以指针算术运算除了用于数组外没有什么意义。两个指针相减的 阅读全文
posted @ 2012-06-06 23:07 KingsLanding 阅读(1165) 评论(0) 推荐(0) 编辑
摘要: 下面列举了一些常见的宏写法:#include <stdio.h>#include <stdlib.h>#define byte char#define word short//得到指定地址上的一个字节或字#define MEM_B( x ) ( *( (byte *) (x) ) )#define MEM_WORD( x ) ( *( (int *) (x) ))//得到一个field在结构体(struct)中的偏移量#define FPOS(type,member) ((size_t) &((type *)0 )->member)//得到一个结构体中fi 阅读全文
posted @ 2012-06-05 22:32 KingsLanding 阅读(6732) 评论(0) 推荐(1) 编辑
摘要: 前一篇文章讨论了list_head 结构的基本结构和实现原理,本文主要介绍一下实例代码。自己如果想在应用程序中使用list_head 的相应操作(当然应该没人使用了,C++ STL提供了list 用起来貌似更方便), 在应用程序中需要包含自己的 "list.h" 头文件:/*注:这个list.h 是为了配合示例程序而建的,内容来自:linux/include/linux/list.h 和相关文件*/#ifndef _LINUX_LIST_H#define _LINUX_LIST_H struct list_head { struct list_head *next, *pr 阅读全文
posted @ 2012-06-02 21:52 KingsLanding 阅读(11056) 评论(0) 推荐(1) 编辑
摘要: 在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用,有点类似于C++的继承机制(希望有机会写篇文章研究一下C语言的面向对象机制)。下面就是kernel中的list_head结构定义:struct list_head { struct list_head *next, *prev;};#define LIST_HEAD_INIT(name) { &(name), &(name) }需要注 阅读全文
posted @ 2012-06-02 21:25 KingsLanding 阅读(32063) 评论(1) 推荐(6) 编辑
摘要: 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,有人认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network 阅读全文
posted @ 2012-05-31 22:52 KingsLanding 阅读(3873) 评论(3) 推荐(1) 编辑
上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 19 下一页