linux线程内存大小(linux线程 内存)-冯金伟博客园

Linux系统基本的内存管理知识讲解?

看你需要看懂到什么程度了。一般情况下只要有扎实的C语言基础。软件系统基础(进程线程阻塞原子操作这些至少能够看懂)。 配合工具书。再加SI和对应版本的内核代码。基本就问题不大了。

linux内核中,工作队列和线程有什么区别?

work queue是一种bottom half,中断处理的后半程,强调的是动态的概念,即work是重点,而queue是其次。

wait queue是一种「任务队列」,可以把一些进程放在上面睡眠等待某个事件,强调静态多一些,重点在queue上,即它就是一个queue,这个queue如何调度,什么时候调度并不重要 等待队列在内核中有很多用途,尤其适合用于中断处理,进程同步及定时。这里只说,进程经常必须等待某些事件的发生。例如,等待一个磁盘操作的终止,等待释放系统资源,或者等待时间经过固定的间隔。等待队列实现了在事件上的条件等待,希望等待特定事件的进程把放进合适的等待队列,并放弃控制权。因此。等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒进程。等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构。等待队列链表的每个元素代表一个睡眠进程,该进程等待某一事件的发生,描述符地址存放在task字段中。然而,要唤醒等待队列中所有的进程有时并不方便。例如,如果两个或多个进程在等待互斥访问某一个要释放的资源,仅唤醒等待队列中一个才有意义。这个进程占有资源,而其他进程继续睡眠可以用DECLARE_WAIT_QUEUE_HEAD(name)宏定义一个新的等待队列,该宏静态地声明和初始化名为name的等待队列头变量。init_waitqueue_head()函数用于初始化已动态分配的wait queue head变量等待队列可以通过DECLARE_WAITQUEUE()静态创建,也可以用init_waitqueue_head()动态创建。进程放入等待队列并设置成不可执行状态。工作队列,workqueue,它允许内核代码来请求在将来某个时间调用一个函数。用来处理不是很紧急事件的回调方式处理方法.工作队列的作用就是把工作推后,交由一个内核线程去执行,更直接的说就是写了一个函数,而现在不想马上执行它,需要在将来某个时刻去执行,那就得用工作队列准没错。如果需要用一个可以重新调度的实体来执行下半部处理,也应该使用工作队列。是唯一能在进程上下文运行的下半部实现的机制。这意味着在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,都会非常有用。

怎么让一个线程一直运行?

不会出现问题的,具体过程如下。

假设线程开始运行在core1上,对内存x将旧值b更改成新值a,在完成mov , a指令时,a这个值至少已经写到core1上的store buffer里面了。

线程要被迁移到core2,那必须是它被抢占,或主动让出cpu,或者主动睡眠才可以发生迁移到core2. 但不管什么情况,它必须在core1执行完schedule函数之后,才会发生迁移。

而schedule函数有以下一段代码:

注意上述最后两条语句,它会产生一个mb,意味着执行到mb之后,刚才将x修改为a的操作,会从store buffer写到L1 Cache,并且会将invalid message发送到其它核的invalid queue上。

之后线程才被调度出来了。

而线程被core2迁移过来时,它要执行,也必须是另一个线程执行schedule之后才能轮到该线程执行。同样,scheuld函数在core2执行时,因为有mb语句,它必须将本core2的invalid queue上的请求应用到本核的L1 Cache上,才能往前执行,此时Core2上L1 Cache上x的值状态变为invalid。

所以线程在core2执行完schedule后,还没有返回到用户态执行,那此时Cache情况如下:

Core1: x值,有效,为a,Exclusive状态

Core2: x值,无效, 因为收到core1的invalide message并应用到本Cache

然后线程执行到用户态时,访问x变量,本地cache是invalid,会发送读cache请求到core1,core1返回x的值为a给core2,此时core1/core2对x地址的状态均为Share。

所以Linux已 处理好进程调度与Cache的关系了。

linux线程id是十进制吗?

线程id是uint32类型,可以是十进制,也可以是十六进制

linux最大线程数?

默认情况下:

主线程+辅助线程 +<253个自己的线程

含主线程和一个辅助线程,最多255个,即一个用户只能生成253个线程。

1、总结系统限制有:

/proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值

/proc/sys/kernel/thread-max

max_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程

/proc/sys/vm/max_map_count

硬件内存大小