转自:http://blog.csdn.net/sunny04/article/details/46805261 版权声明:本文为博主原创文章,未经博主允许不得转载. 进程是操作系统的最小资源管理单元, 线程是操作系统最小的执行单元. 一个进程可以有多个线程, 也就是说多个线程分享进程的资源,包括栈区,堆区,代码区,数据区等. sundh@linhaoIPTV:~$ ulimit -a core file size          (blocks, -c) 0 data seg size   …
我们将讨论类型.对象.线程栈和托管堆在运行时的相互关系,假定有以下两个类定义: internal class Employee    {        public int GetYearsEmployed()        {            return 1;        }        public virtual string GetProgressReport()        {            return "zhengwei";        }    …
JVM线程的栈默认大小,oracle官网有简单描述: In Java SE 6, the default on Sparc is 512k in the 32-bit VM, and 1024k in the 64-bit VM. On x86 Solaris/Linux it is 320k in the 32-bit VM and 1024k in the 64-bit VM. On Windows, the default thread stack size is read from th…
WINDOWS操作系统中可以允许最大的线程数 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小. 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程. 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程. 即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制. 比方说你的机器装了64GB物理内存,…
用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值.volatile很容易被误用,用来进行原子性操作. package com.guangshan.test; public class TestVolatile { public static int count = 0; public static void inc () { try { Thread.sleep(1); } catch (Exception e) { } count++; } public s…
转自:http://www.cnblogs.com/xzzzh/p/6596982.html 原文链接:http://blog.csdn.net/freeelinux/article/details/53782986[侵删] 本文转自多个博客,以及最后有我的总结.我没有单独从头到尾写一个总结的原因是别人已经写得很好了,我不花大量时间是无法达到这水平的. 一:Linux虚拟地址空间布局 (转自:Linux虚拟地址空间布局) 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟…
原文链接:http://blog.csdn.net/freeelinux/article/details/53782986[侵删] 本文转自多个博客,以及最后有我的总结.我没有单独从头到尾写一个总结的原因是别人已经写得很好了,我不花大量时间是无法达到这水平的. 一:Linux虚拟地址空间布局 (转自:Linux虚拟地址空间布局) 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址…
在CSDN上看到的一篇文章,讲的还是满好的. 原文地址:Linux虚拟地址空间布局以及进程栈和线程栈总结 一:Linux虚拟地址空间布局 (转自:Linux虚拟地址空间布局) 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Exe…
线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在. 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量.注意:Java中的多线程是一种抢占机制而不是分时机制.抢占机制指的是有多个线程处于可运行状态,但是只允许一个线程在运行,他们通过竞争的方式抢占CPU. 一.定义一个线程有两种方法:1.继承java.lang.Thread类,重写run()方法,通过线程的s…
16.1 线程栈及工作原理 (1)线程栈简介 ①系统在创建线程时,会为线程预订一块地址空间(即每个线程私有的栈空间),并调拨一些物理存储器.默认情况下,预订1MB的地址空间并调拨两个页面的存储器. ②调整线程栈的默认大小可以使用编译选项或#pragma指令,具体用法视编译器不同,VC下可以使用 /Fnewsize 编译选项设置默认栈大小,其中newsize是以字节为单位,也可以使用/STACK:reserve[,commit]连接选项,使用#pragma指令的样式如下:#pragma comme…
先看的这篇文章:http://blog.csdn.net/qq910894904/article/details/41699541 以nginx为代表的事件驱动的异步server正在横扫天下,那么事件驱动模型会是server端模型的终点吗? 我们可以深入了解下,事件驱动编程的模型. 事件驱动编程的架构是预先设计一个事件循环,这个事件循环程序不断地检查目前要处理的信息,根据要处理的信息运行一个触发函数.其中这个外部信息可能来自一个目录夹中的文件,可能来自键盘或鼠标的动作,或者是一个时间事件.这个触…
监控JVM中最占cpu的线程 top -Hp pid JVM中最占cpu的线程ID -o THREAD,tid,time | awk 'BEGIN {count=0; } { if($2>0.3&&$8!="-") { a[count]=$8; count++ } } END { printf " \n'\''"; for(i=0;i<count;i++) { if (i==0) { printf "%x",a[i]…
JIT(just in time)编译器 接下来的会讲到方法的调用,这里先讲下JIT编译器.以CLR书中的代码为例(手打...).以Main方法为例: static void Main(){ Console.WriteLine("Hello"); Console.WriteLine("XiaoCong"); } 首先CLR会检测到Main方法中引用了一个Console类型,然后CLR会为其分配一个内部结构. 内部结构中每个方法都对应一个记录项,记录项中都容纳一个地址…
.NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and The Managed Heap for .NET by 唐小崇 http://www.cnblogs.com/tangchong .NET中的类型,无论是值类型或引用类型都是继承自Object的类.这点跟Java类似,但与C/C++有很大不同.既然值类型与引用类型都是类,那它们的没有什么不同的地方.…
.NET中 类型,对象,线程栈,托管堆 在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and The Managed Heap for .NET by 唐小崇 http://www.cnblogs.com/tangchong .NET中的类型,无论是值类型或引用类型都是继承自Object的类.这点跟Java类似,但与C/C++有很大不同.既然值类型与引用类型都是类,那它们的没有什么不同的地方…
要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动态变化的,因此研究线程栈必须选择一个运行的时刻(实际上指代码运行到什么地方). 下面,我们来根据这段代码和图片来来说明线程栈的过程 package cn.happy.bdqn; public class TestRunnable { /** * @param args */ public static void main(String[…
在介绍运行时的关系之前,先从一些计算机基础只是入手,如下图: 该图展示了已加载CLR的一个windows进程,该进程可能有多个线程,线程创建时会分配到1MB的栈空间.栈空间用于向方法传递实参,方法定义的局部变量也在实参上,上图的右侧展示了线程的栈内存,栈从高位内存地址向地位内存地址构建.图中线程已经执行了一些代码,栈中已经存在了一些数据(图中阴影部分),现在假定线程执行的代码要调用M1方法. 简单的方法执行前运行时会先执行"序幕"代码,在方法开始前对其进行初始化,然后会执行"…
1.线程栈 window的一个进程加载clr.该进程可能含有多个线程,线程创建的时候会分配1MB的栈空间. 如图: void Method() { string name="zhangsan";  //name 被放入栈里面 Method2(name);  //1参数变量s 被压入栈,s引用name的地址    2.返回地址被压入栈,方法执行完(method2的 return)指针指向此返回地址 return; } void Method2(string s) { int32 leng…
http://www.codeceo.com/article/40-java-thread-problems.html 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然”,只有达到”知其然知其所以然”的程度才可以说是把一个知识点运用自如.OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本.台式机乃至商用的…
Linux 线程栈介绍 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等:和堆相比,栈通常很小. Linux 查询线程栈 1.查看默认的线程栈大小,单位是字节(KBytes) ulimit -s [root@izbp1932yyli7ap6wopu1ez html]# ulimit -s 8192 输出结果 2.查看单个进程暂用堆栈的信息 strace -f -p 进程PID号 Linux 修改线程栈大小 1.临时修改线程栈大小 u…
网上搜索了一下,关于java的线程栈: JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K. JVM的内存,被划分了很多的区域: (来源:http://www.iteye.com/topic/808550) 1.程序计数器 每一个Java线程都有一个程序计数器来用于保存程序执行到当前方法的哪一个指令. 2.线程栈 线程的每个方法被执行的时候,都会同时创建一个帧(Frame)用于存储本地变量表.操作栈.动态链接.方法出入口等信息.每一个方法的调用至完成,就意味着一个帧在VM栈中…
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称线程调用堆栈,是虚拟机中线程(包括锁)状态的一个瞬间状态的快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况.虽然不同的虚拟机打印出来的格式有些不同,但是线程堆栈的信息都包含: 1.线程名字,id,线程的数量等. 2.线程的运行状态,锁的状态(锁被哪个线程持有,哪个线…
目前在看CLR via C#,把总结的记下来,索性就把他写成一个系列吧. 1.[.Net基础一] 类型.对象.线程栈.托管堆运行时的相互关系 2.[.Net基础二]浅谈引用类型.值类型和装箱.拆箱 JIT(just in time)编译器 接下来的会讲到方法的调用,这里先讲下JIT编译器.以CLR书中的代码为例(手打...). 以Main方法为例: static void Main(){ Console.WriteLine("Hello"); Console.WriteLine(&qu…
Thread 的状态 线程共有五种状态.分别是: (1)新建 (2)就绪 (3)运行 (4)阻塞 (5)死亡 ,下面列列举的状态需要结合状态示意图更好理解.  新建状态(New): 新创建了一个线程对象. 就绪状态(Runnable): 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于"可运行线程池"中,变得可运行,只等待获取CPU的使用权.即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得(包括我们所说的锁). 运行状态(Running): 就绪…
当系统创建线程的时候,会为线程栈预订一块地址空间区域,并给该区域调拨一些物理存储器.默认会预订1MB的地址空间并调拨两个页面的存储器.但是在构建 应用程序的时候可以改变这个默认值 在构建应用程序的时候链接器会把栈的大小写入到exe和dll文件的pe文件头中,当创建线程的时候会根据PE文件头中的大小来预订空间区域.在调用CreateThread或_beginthreadex的时候开发人员可以指定需要在一开始就调拨的地址空间大小和存储器大小. 下面显示了一台页面大小为4KB的机器上线程栈的地址空间区…
谈谈windows线程栈. 当系统创建线程时会为线程预订一块地址空间区域,注意仅仅是预订.默认情况下预定的这块区域的大小是1MB,虽然预订这么多,但是系统并不会给全部区域调拨物理存储器.默认情况下,仅仅为两个页面挑拨.x86系统下每个页面是4KB.其他页面会在访问的时候由系统调拨.这仅仅是在创建线程时,程序员指定CreateThread的第二个参数StackSize为0时才会发挥作用.如果程序员传入的是非零值,那么调拨的物理存储器的数量就是这个非零值. 这两个默认的页面是从哪里来的呢?原来是在链…
原文:https://www.cnblogs.com/wangkeqin/p/9351299.html Thread线程框架 线程定义:线程可以理解为一个特立独行的函数.其存在的意义,就是并行,避免了主线程的阻塞. ----------------------------thread与函数---------------------------------- 线程启动 C++线程的启动, 只需要#include <thread>即可. 线程对象的创建, 意味着线程的开始. 1)同步 #inclu…
Java线程:线程栈模型与线程的变量   要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动态变化的,因此研究线程栈必须选择一个运行的时刻(实际上指代码运行到什么地方).   下面通过一个示例性的代码说明线程(调用)栈的变化过程.     这幅图描述在代码执行到两个不同时刻1.2时候,虚拟机线程调用栈示意图.   当程序执行到t.start();时候,程序多出一个分支(增加了一个调用栈…
参考资料: http://blog.csdn.net/xhhjin/article/details/7579145 总结:     1.进程的栈大小是在进程执行的时刻才能指定的,即不是在编译的时候决定的,也不是在链接的时候决定的     2.进程的栈大小是随机确定的至少比线程栈要大,但是不到线程栈大小的2倍     3.线程栈大小是固定的,也就是ulimit -a 显示的值   查看线程栈大小: 可以看到默认情况下线程栈大小为8192(8MB),可以使用ulimit -s xxx修改线程默认栈大…
Linux 进程栈和线程栈的区别 http://www.cnblogs.com/luosongchao/p/3680312.html 总结:线程栈的空间开辟在所属进程的堆区,线程与其所属的进程共享进程的用户空间,所以线程栈之间可以互访.线程栈的起始地址和大小存放在pthread_attr_t 中,栈的大小并不是用来判断栈是否越界,而是用来初始化避免栈溢出的缓冲区的大小(或者说安全间隙的大小) 进程内核栈.用户栈 1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创…