linux进程管理

来源:互联网 发布:最新的群智能算法 编辑:程序博客网 时间:2024/06/06 17:38

一、linux程序存储结构与进程结构

1.1 linux可执行文件结构

linux系统下,可以用命令列出二进制可执行文件结构情况:size filename。下图1表示可执行文件的结构

1 可执行文件的结构

1.2 linux进程结构

将可执行文件加载到内存运行,进程会拥有自己独立的处理空间和系统资源。下图2为进程的内存结构

图2 进程在内存空间的结构

1.3 栈和堆的区别

(1)管理方式不同
栈区由操作系统统一管理,无需程序员控制,使用简单;堆由用户申请、释放,容易出现内存泄露。
      (2)空间大小不同
栈是向低地址拓展的数据结构,是一块连续的存储区域,其大小位置由操作系统指定,一般大小比较有限,可能会出现栈溢出的现象;堆是向高地址拓展的数据结构,是不连续的存储区域,实际上使用链表来存储空闲内存块的地址,比较灵活。
(3)产生碎片不同
频繁的申请和释放空间会造成内存空间的不连续,造成内存碎片,影响系统效率;但栈不会有这个问题。
(4)增长方式不同
堆是由低地址向高地址方向增长;栈是由高地址向低地址增长。
(5)分配方式
堆需要程序员手工分配,栈由编译器申请和释放。
(6)分配效率不同
栈由系统提供,操作系统在底层对栈提供支持;堆是C库函数提供,机制复杂,有一套算法负责维护空间的释放与分配。栈的效率要比堆高很多。

1.4 查看进程中各数据的存储位置

使用一些外部全局变量,如etext、edata、end,或者是一些标号,如main来确定地址位置。

二、ANSI C内存管理api函数

2.1 申请、释放函数

extern void *malloc(size_t __size);//分配__size大小的连续空间
extern void *free(void *__ptr);
extern void *realloc(void *__ptr, szie_t __szie);//更改已经配置的内存空间,__size为新内存的大小
extern void*calloc(size_t nmemb, size_t size);//分配nmemb*size大小的空间,并将其初始化为0
extern void*alloca(size_t __size) __THROW; //从栈中申请__size大小的空间

2.2 内存管理函数

extern void *memcpy(void *__dest, void *__src, size_t n);//拷贝n个字节
extern void *memmove(void *__dest, __const void * __src, size_t n);//会检查源地址和目的地址是否重叠,如果重叠,会改变目的地址。然后进行拷贝
extern void *memset(void *s, int c, size_t n);//将s开始后的n个字节设置成c
extern void *memchr(const void *s, int  c, size_t n);//在以s起始,长度为n个字节的空间内查找某个字符c第一次出现的位置
extern int memcmp(const void *s1, const void *s2, size_t n);//比较内存单元s1、s2前n个字节是否相同,相同返回0

三、linux进程环境及系统限制

3.1 进程与命令参数

平时使用命令行参数时,如果有多个参数,参数的顺序是随意的。在linux中,提供了getopt(识别短参数)、getlongopt(识别长参数)识别命令行参数。

(1) extern int getopt(int argc, char *const*argv, const char *shortopts);//返回选项,并设置一些全局变量

//argc 命令参数的个数;

//argv 指向这些参数的字符串数组

//shortopts 所有可能的参数字符串

(2) extern int get_long(int argc, char *const *argv, const char *shortopts,const struct option * longopts, int *longind);//返回选项

//argc 命令参数的个数;

//argv 指向这些参数的字符串数组

//shortopts 所有可能的短参数字符串

//struct option 表示所有长参数的对应关系

//longind 一般设置成NULL

3.2 进程与环境变量

在shell终端可通过命令env、set查看当前系统环境信息。还可以通过如下函数获取、修改、删除某环境变量的值。

       (1) extern char *getenv(const char *name);//获取name对应的环境变量的值

       (2)extern int putenv(char *string);//添加环境变量值,格式为“NAME=VALUE”

(3)extern int setenv(const char *name, const char *value, int replace);

//name为欲设置的环境变量名;value为设置的值;replace=0,保留原值;replace!=0覆盖原值

(4)extern int unsetenv(const char *name);//删除指定环境变量的值

3.3 进程与命令参数

Char 8bit

       Short int 16bit

       Int 32bit

       Long int 大小等于宏__WORDSIZE

Linux中进程的资源都是有限制的,可以使用函数来获取、修改这些限制。

       extern int getrlimit(_rlimit_resource_t resource, struct rlimit *rlimits);// resource为限制项,rlimits用来存储获取的限制值

       extern int setrlimit(_rlimit_resource_t resource, struct rlimit *rlimits);// resource为限制项,rlimits用来设置的限制值

3.4 linux时间管理

编程应用中,常需要读取系统时间、进程运行的时间等等。

       extern clock_t clock(void);//返回当前时钟的计数值(user time + system time),转换为秒result/CLOCK_PER_SECOND

       extern time_t time(time_t *timer);//返回自1970年来经历的秒数

       extern char *ctime(cosnt time_t *timer);//返回当前时间字符串

extern struct tm* gmtime(cosnt time_t *timer); //返回UTC时间

extern struct tm* localtime(cosnt time_t *timer); //返回本地时间

extern char* asctime(cosnt struct tm *tp);//将tm结构体转换成时间字符串

extern size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *tp);//提取struct tm中的某一项







原创粉丝点击