1. 程式人生 > >執行緒記憶體分配測試

執行緒記憶體分配測試

關於程序棧和執行緒棧總結:
    (1)程序棧大小時執行時確定的,與編譯連結無關
    (2)程序棧大小是隨機確認的,至少比執行緒棧要大,但不會超過2倍
    (3)執行緒棧是固定大小的,可以使用ulimit -a 檢視,使用ulimit -s 修改

    (4)一般預設情況下,執行緒棧是在程序的堆中分配棧空間,每個執行緒擁有獨立的棧空間,為了避免執行緒之間的棧空間踩踏,執行緒棧之間還會有以小塊guardsize用來隔離保護各自的棧空間,一旦另一個執行緒踏入到這個隔離區,就會引發段錯誤。

看我的測試程式碼:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

void *thread_task(void *arg){
    
//    int a[1024] = {0};
 //   a[1] = 10;
    return (void *)0;
}

int main(void)
{
    pthread_t tid;
    int ret = pthread_create(&tid, NULL, thread_task, (void *)NULL);
    if(ret < 0){
        perror("pthread_create");
        exit(0);
    }
    while(1){}
    pthread_join(tid, NULL);
}

程式碼很簡單,建立了一個執行緒。下面我們檢視它的記憶體分配:

cd /proc/11858

vim maps

通過計算可以看出一個執行緒實際分配了8m+4k的空間。當然8m可以通過ulimit -s來調整。為什麼有4k保護頁呢?

一般預設情況下,執行緒棧是在程序的堆中分配棧空間,每個執行緒擁有獨立的棧空間,為了避免執行緒之間的棧空間踩踏,執行緒棧之間還會有以小塊guardsize用來隔離保護各自的棧空間,一旦另一個執行緒踏入到這個隔離區,就會引發段錯誤。

看下面追蹤程式碼的執行:

這4k是通過mprotect來分配的4096位元組。

補充:最近寫程式碼用到一個命令可以檢視執行緒記憶體分配的命令----pmap

使用這個命令輸出的結果同樣證明上面的結論,截圖+說明如下:

圖上圈出來的就是執行緒的記憶體,8192k+4k。

相關推薦

執行記憶體分配測試

關於程序棧和執行緒棧總結:     (1)程序棧大小時執行時確定的,與編譯連結無關     (2)程序棧大小是隨機確認的,至少比執行緒棧要大,但不會超過2倍     (3)執行緒棧是固定大小的,可以使用ulimit -a 檢視,使用ulimit -s 修改     (4

提高C++效能的程式設計技術筆記:多執行記憶體池+測試程式碼

為了使多個執行緒併發地分配和釋放記憶體,必須在分配器方法中新增互斥鎖。 全域性記憶體管理器(通過new()和delete()實現)是通用的,因此它的開銷也非常大。 因為單執行緒記憶體管理器要比多執行緒記憶體管理器快的多,所以如果要分配的大多數記憶體塊限於單執行緒中使用,那麼可以顯著提升效

提高C++效能的程式設計技術筆記:單執行記憶體池+測試程式碼

頻繁地分配和回收記憶體會嚴重地降低程式的效能。效能降低的原因在於預設的記憶體管理是通用的。應用程式可能會以某種特定的方式使用記憶體,並且為不需要的功能付出效能上的代價。通過開發專用的記憶體管理器可以解決這個問題。對專用記憶體管理器的設計可以從多個角度考慮。我們至少可以想到兩個方面:大小和併發。

Kafka的單執行生產消費測試

程式碼: package com.weichai.kafka; import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.KeyedMessage; import

執行記憶體問題分析之mprotect方法【轉】

轉自:https://blog.csdn.net/agwtpcbox/article/details/53230664 http://www.yebangyu.org/blog/2016/02/01/detectmemoryghostinmultithread/ 多執行緒中的記憶體問題,一直被認為是噩夢般

JDK6u25裡新增的按執行統計分配記憶體量: JMX

轉載自 http://rednaxelafx.iteye.com/blog/1021619 Oracle幾天前釋出的JDK 6 update 25裡新增的一個新功能非常有趣,可以按照執行緒來跟蹤(GC堆)記憶體的分配量。這個功能在VM核心、直譯器、C1編譯器、C2編譯器以及GC中都有程

執行記憶體的可見性

先看下面的程式碼和執行的結果: package hello_java; public class MemoryVisiable { public static void main(String[] args) { ShareData02 shareData = ne

1.JVM之對Vector執行安全的測試(相對執行安全)

import java.util.Vector; public class vector { private static Vector<Integer> vector=new Vector<>(); public static void main(Stri

python編寫的多執行介面併發測試

import requests import json import threading import time import uuid class postrequests(): def __init__(self): #產生UUID

【Nim】執行記憶體模型

在Nim的設計中,每一個執行緒都有自己一個獨立的heap,這意味著在多個執行緒之間不能引用同一個變數,帶來的好處是不會出現競態條件(race condition),壞處也很明顯,多執行緒之間無法共享變數。 讓我們來看個簡單的例子感受一下。為了引入多執行緒,我安裝了第三方庫w

java程式執行記憶體分配小記

五個資料儲存區: 一、暫存器:最快的儲存區,位於處理器內部,但是數量有限,需要根據需求進行分配,所以無法由程式直接控制。 二、堆疊:位於通用RAM(隨機訪問儲存器)中,通過堆疊指標可以獲得直接支援,指標向下移動,即分配新的記憶體,指標向上移動,則釋放記憶體,速度僅次於暫存

使用GroboUtils多執行併發請求測試springmvc controller

1. 需求 有一個下載pdf的springmvc controller,希望模擬一下併發訪問的情況,怎麼辦呢? 2. 解決方案 由於是pdf,其http響應為 那麼我們訪問時返回的是二進位制,而不是網頁那種text/html 於是寫一個儲存二進位制檔案的方

由多執行記憶體溢位產生的實戰分析

一日凌晨,手機瘋狂報警,簡訊以摧枯拉朽之勢瞬間以百條的速度到達,我在睡夢中被驚醒,看到簡訊的部分內容如下: Caused by: java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thr

java多執行-記憶體模型

併發處理的廣泛應用是使得amdahl定律代替摩爾定律成為計算機效能發展源動力的根本原因,是人類壓榨計算機運算能力的最有力武器。 上一篇《java 多執行緒—執行緒怎麼來的 》中我們瞭解了執行緒在作業系統中的是如何派生出來的,這一篇我們聊聊jvm的記憶體模型,瞭解一些jvm在

第四回 關於多執行渲染(續--測試資料)

*.主執行緒渲染時間: 是指主執行緒中渲染各個遊戲物件所花的時間,其中包括與渲染相關的一些CPU計算,以及大量對D3D API的呼叫,在不使用多執行緒渲染的時候,這些呼叫被直接傳遞給D3D,在使用多執行緒渲染的時候,這些呼叫被轉化為多條指令加入到一個佇列中.注意這個時間沒有包括等待GPU工作完畢的時間.

java執行記憶體模型,執行、工作記憶體、主記憶體

java執行緒記憶體模型 執行緒、工作記憶體、主記憶體三者之間的互動關係圖: key edeas 所有執行緒共享主記憶體 每個執行緒有自己的工作記憶體 refreshing local memory to/from main memory must  co

linux執行排程方式測試總結

總結:對三種執行緒排程方式進行測試。 1.SCHED_OTHER:分時排程策略,為預設方式,凡是採用本模式的執行緒,執行緒優先順序會強制為0,通俗點將,工作在本模式下的執行緒,都在同一優先順序下。所謂的“分時排程策略”,可以理解為執行緒執行一次後主動放棄CPU,執行緒排程一次,執行下一個執行緒。

python多執行http壓力測試指令碼

#coding=utf-8 import sys import time import thread import httplib, urllib import random import uuid import logging logging.basicCo

Netty學習之旅------原始碼分析Netty執行本地分配機制與PooledByteBuf執行級物件池原理分析

final PoolArena<byte[]> heapArena; //使用輪叫輪詢機制,每個執行緒從heapArena[]中獲取一個,用於記憶體分配。 final PoolArena<ByteBuffer> directArena;

執行--做單元測試時,使用執行池發現並沒有執行指定程式碼,直接跳過

案例 今天做單元測試除錯介面,發現介面呼叫成功但是並沒有執行執行緒池執行的方法,而是直接跳過執行程式碼 ExecutorService pool = Executors.newFixedThre