08-26-2001
limits on array sizes
The answer is No and Yes. Theoretically,
there is no limit. However, the kernel may be
configured to allow only a limited amount
of memory per process and/or user. You can find
out what the system resource limits are on your
particular UNIX system using the system
call "getrlimit()" (man section 2). The following
C program can be compiled and run as any ordinary
user...
================== SNIP ========================
/*
* Filename - getlimits.c
*
* Description - display system resource limits and
* test allocating large blocks of memory.
*
*/
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main(int argc, char **argv)
{
struct rlimit rlim;
void *p;
getrlimit(RLIMIT_CPU, &rlim);
printf("CPU: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
getrlimit(RLIMIT_FSIZE, &rlim);
printf("FSIZE: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
getrlimit(RLIMIT_DATA, &rlim);
printf("DATA: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
getrlimit(RLIMIT_STACK, &rlim);
printf("STACK: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
getrlimit(RLIMIT_CORE, &rlim);
printf("CORE: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
#ifdef LINUX
getrlimit(RLIMIT_RSS, &rlim);
printf("RSS: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
getrlimit(RLIMIT_NPROC, &rlim);
printf("NPROC: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
#else
getrlimit(RLIMIT_VMEM, &rlim);
printf("VMEM: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
getrlimit(RLIMIT_AS, &rlim);
printf("AS: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
#endif
getrlimit(RLIMIT_NOFILE, &rlim);
printf("NOFILE: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
#ifdef LINUX
getrlimit(RLIMIT_MEMLOCK, &rlim);
printf("MEMLOCK: cur - %ld max - %ld\n", rlim.rlim_cur, rlim.rlim_max);
#endif
if((p = malloc(100000000)) == NULL)
{
printf("malloc 100M failed\n");
}
else
{
printf("malloc 100M succeeded\n");
}
if(p) free(p);
if((p = malloc(500000000)) == NULL)
{
printf("malloc 500M failed\n");
}
else
{
printf("malloc 500M succeeded\n");
}
if(p) free(p);
return 0;
}
================== SNIP ========================
The output (on Linux) should look somthing like...
$ getlimits
CPU: cur - 2147483647 max - 2147483647
FSIZE: cur - 2147483647 max - 2147483647
DATA: cur - 2147483647 max - 2147483647
STACK: cur - 8388608 max - 2147483647
CORE: cur - 1024000000 max - 2147483647
RSS: cur - 2147483647 max - 2147483647
NPROC: cur - 2048 max - 2048
NOFILE: cur - 1024 max - 1024
MEMLOCK: cur - 2147483647 max - 2147483647
malloc 100M succeeded
malloc 500M succeeded
10 More Discussions You Might Find Interesting
1. UNIX for Advanced & Expert Users
Hi,
Do anyone know what's the max size of array (in awk)
can be store before hit any memory issue.
Regards (3 Replies)
Discussion started by: epall
3 Replies
2. Shell Programming and Scripting
Is there a way to find out the size of an array in sh shell script? Thanks. (1 Reply)
Discussion started by: trivektor
1 Replies
3. Solaris
hi all,
in my server there are some specific application files which are spread through out the server... these are spread in folders..sub-folders..chid folders...
please help me, how can i find the total size of these specific files in the server... (3 Replies)
Discussion started by: abhinov
3 Replies
4. Programming
i have to store a data more than 100000.
i don't know the size of the data whether it may be 100000 or 1000000.
so how can i define variable size;
example
char abc;
but i don't know the size so how can i give array size??
in one sentence
how can i give the array size dynamically so that i... (6 Replies)
Discussion started by: phani_sree
6 Replies
5. Programming
Hi All
I am simulating a problem in the production where i faced a situation.
Please find the following example program which i simulated.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char str1; (3 Replies)
Discussion started by: dhanamurthy
3 Replies
6. Shell Programming and Scripting
#!/bin/sh
##########################################################################################################
#This script is being used for AOK application for cleaning up the .out files and zip it under logs directory.
# IBM
# Created
#For pdocap201/pdoca202 .out files for AOK
#1.... (0 Replies)
Discussion started by: mridul10_crj
0 Replies
7. Shell Programming and Scripting
Hello all,
I need to do scripts total up the size in selected extension file for example motion.mov and segmentation.avi is in Label Media. For file info.doc and calc.xls in Label Document.
I need output will be like this:
count 1
Media,,2 GB
count 2
Document,,4 GB
My problem is,... (16 Replies)
Discussion started by: sheikh76
16 Replies
8. UNIX for Advanced & Expert Users
Hello,
in one default UFS filesystem we have 8K block size (bsize) and 1K fragmentsize (fsize). At this scenary I thought all "FileSytem IO" will be 8K (or greater) but never smaller than the fragment size (1K). If a UFS fragment/blocksize is allwasy several ADJACENTS sectors on disk (in a ... (4 Replies)
Discussion started by: rarino2
4 Replies
9. Programming
I want to create a form with data values in a dropdown list. The values in the dropdown list need to be generated on the fly from max, min and increment values contained in a mysql database.
Hopefully this makes sense, I really have no idea where to start :confused:
Thanks (6 Replies)
Discussion started by: barrydocks
6 Replies
10. Shell Programming and Scripting
Hi,
I would like to know how to define the size of the array in c shell scripting. (15 Replies)
Discussion started by: gopishrine
15 Replies
BRK(2) BSD System Calls Manual BRK(2)
NAME
brk, sbrk -- change data segment size
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
int
brk(const void *addr);
void *
sbrk(intptr_t incr);
DESCRIPTION
The brk() and sbrk() functions are legacy interfaces from before the advent of modern virtual memory management.
The brk() and sbrk() functions are used to change the amount of memory allocated in a process's data segment. They do this by moving the
location of the ``break''. The break is the first address after the end of the process's uninitialized data segment (also known as the
``BSS'').
The brk() function sets the break to addr.
The sbrk() function raises the break by incr bytes, thus allocating at least incr bytes of new memory in the data segment. If incr is nega-
tive, the break is lowered by incr bytes.
NOTES
While the actual process data segment size maintained by the kernel will only grow or shrink in page sizes, these functions allow setting the
break to unaligned values (i.e., it may point to any address inside the last page of the data segment).
The current value of the program break may be determined by calling sbrk(0). See also end(3).
The getrlimit(2) system call may be used to determine the maximum permissible size of the data segment. It will not be possible to set the
break beyond ``etext + rlim.rlim_max'' where the rlim.rlim_max value is returned from a call to getrlimit(RLIMIT_DATA, &rlim). (See end(3)
for the definition of etext).
RETURN VALUES
The brk() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the
error.
The sbrk() function returns the prior break value if successful; otherwise the value (void *)-1 is returned and the global variable errno is
set to indicate the error.
ERRORS
The brk() and sbrk() functions will fail if:
[EINVAL] The requested break value was beyond the beginning of the data segment.
[ENOMEM] The data segment size limit, as set by setrlimit(2), was exceeded.
[ENOMEM] Insufficient space existed in the swap area to support the expansion of the data segment.
SEE ALSO
execve(2), getrlimit(2), mmap(2), end(3), free(3), malloc(3)
HISTORY
The brk() function appeared in Version 7 AT&T UNIX.
BUGS
Mixing brk() or sbrk() with malloc(3), free(3), or similar functions will result in non-portable program behavior.
Setting the break may fail due to a temporary lack of swap space. It is not possible to distinguish this from a failure caused by exceeding
the maximum size of the data segment without consulting getrlimit(2).
BSD
July 12, 1999 BSD