Linux
文章平均质量分 77
Javadino
这个作者很懒,什么都没留下…
展开
-
[Pthread] Gcc 编译过程
现代编译器常见的编译过程: 源文件-->预处理-->编译/优化-->汇编-->链接-->可执行文件 对于gcc而言: 第一步 预处理 命令: gcc -o test.i -E test.c 或者 cpp -o test.i test.c (这里cpp不是值c plus plus,而是the C Preproc原创 2008-09-06 13:44:00 · 2211 阅读 · 0 评论 -
[Pthread] Linux上程序调试的基石(一)--ptrace
引子:1.在Linux系统中,进程状态除了我们所熟知的TASK_RUNNING,TASK_INTERRUPTIBLE,TASK_STOPPED等,还有一个TASK_TRACED。这表明这个进程处于什么状态?2.strace可以方便的帮助我们记录进程所执行的系统调用,它是如何跟踪到进程执行的?3.gdb是我们调试程序的利器,可以设置断点,单步跟踪程序。它的实现原理又是什么?所有这一切的背后都隐藏着L原创 2008-09-06 14:42:00 · 3395 阅读 · 1 评论 -
[Pthread] Linux上程序执行的入口--Main
main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口。那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么?这次我们来探讨一下这个问题。1. main()函数的形式先来说说main函数的定义,较早开始写C程序的肯定都用过这样的定义void main(){},其实翻翻C/C++标准,从来没有定义过v原创 2008-09-06 14:26:00 · 2238 阅读 · 0 评论 -
[Pthread] Linux进程终止过程
进程终止过程:进程终止的系统调用sys_exit()通过函数do_exit()实现。do_exit()调用static inline void __exit_mm(struct task_struct * tsk){struct mm_struct * mm = tsk->mm;mm_release();}释放一部分资源。然后调用static void exit_notify(void){/* L原创 2008-09-06 14:21:00 · 1875 阅读 · 0 评论 -
[Pthread] Linux中的内存管理(二)--Layout
上次我们讲到了硬件平台和操作系统对物理内存的管理机制,经过这两层处理,应用程序中只要好好利用自己独占的4G虚拟内存就行了。这次我们来讨论一下这应用程序是如何分配这4G内存的,当然这都离不开编译器,操作系统的帮助。PS: 在这之前,再强调一下,这里所说的虚拟内存是逻辑概念。和Windows平台上设置的那个虚拟内存不一样,那个相当于交换分区。3. 用户进程的虚存布局首先Linux把每个用户进程可访问的原创 2008-09-06 14:50:00 · 2696 阅读 · 0 评论 -
[Pthread] Linux中的内存管理(四)--Heap
前几次我们分析了Linux系统中用户进程的4G虚存大致分为了几个部分,介绍了3G用户空间中数据段,代码段等静态区域的虚存管理,重点分析了栈的使用。这次我们来分析一下虚存使用中另一个重要部分--堆。前面的介绍中,我们知道编译器,操作系统担负着大量栈分配管理的工作。不论是静态分配的栈空间还是用户动态分配的栈空间,在函数返回的时候就自动释放了。堆的使用比之栈而言更为灵活,允许程序员动态的分配并释放,但也原创 2008-09-06 14:52:00 · 3762 阅读 · 0 评论 -
[Pthread] Linux中的内存管理(三)--Stack
上次我们分析了用户进程在虚存中的大致分布,这次我们就来分析一下,用户进程的4G虚存是怎么管理的,其对应的物理内存又是怎么维护的。4. 用户进程的内存管理机制4.1 虚拟内存和物理内存前几次我们分析了什么是物理内存,什么是虚拟内存,也反复强调了虚存不同于物理内存。虽然用户程序看到的是虚拟内存,但真正运行的时候还是必须运行在物理内存上的,这就涉及到一个虚拟内存分配和物理内存分配之间关系的问题。后面我们原创 2008-09-06 14:51:00 · 3192 阅读 · 0 评论 -
[Pthread] Linux中的内存管理(一)--Paging
前几次我们分析了程序是如何在Linux上被加载运行的。这次我们尽量简洁的分析一下在Linux中,程序是如何使用内存,而系统又是怎样管理内存的。内存访问和管理是一个跨越应用程序,操作系统,硬件平台的一个复杂的过程。虽然过程很复杂,我们还是尝试着去理解一下。1. IA-32架构中的内存管理机制我们从硬件开始吧,内存归根结底是硬件,内存(Random Access Memory)在加电的情况下,在地址总原创 2008-09-06 14:48:00 · 4337 阅读 · 0 评论 -
[Pthread] Linux程序调试的基石(二)--Inside GDB
3. GDB的实现GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序。可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况。它的实现也是基于ptrace系统调用来完成的。其原理是利用ptrace系统调用,在被调试程序和gdb之间建立跟踪关系。然后所有发送给被调试程序的信号(除SIGKILL)都会被gdb截获,gdb根据截获的信号,查看被调试程序相应的内存地址,并控制被调试原创 2008-09-06 14:46:00 · 3061 阅读 · 0 评论 -
[Pthread] Linux中的线程同步机制(三)--Practice
上回说到Glibc中(NPTL)的线程同步方式如Mutex,Semaphore等都使用了futex作为其基础。那么实际使用是什么样子,又会碰到什么问题呢?先来看一个使用semaphore同步的例子。sem_t sem_a;void *task1();int main(void){ int ret=0; pthread_t thrd1; sem_init(&sem_a,0,1); ret=pthre原创 2008-09-06 14:39:00 · 4884 阅读 · 0 评论 -
[Pthread] Linux中的线程同步机制(二)--In Glibc
在linux中进行多线程开发,同步是不可回避的一个问题。在POSIX标准中定义了三种线程同步机制: Mutexes(互斥量), Condition Variables(条件变量)和POSIX Semaphores(信号量)。NPTL基本上实现了POSIX,而glibc又使用NPTL作为自己的线程库。因此glibc中包含了这三种同步机制的实现(当然还包括其他的同步机制,如APUE里提到的读写锁)。G原创 2008-09-06 14:35:00 · 5491 阅读 · 0 评论 -
[Pthread] Linux中的线程同步机制(一) -- Futex
引子在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序",那futex是什么?和glibc又有什么关系呢?1. 什么是FutexFutex是Fast Userspace muTexes的缩写,由Hubertus Franke, Matthew Kirkwood, Ingo原创 2008-09-06 14:34:00 · 6244 阅读 · 0 评论 -
[Pthread] Linux上获得线程Id的方法
在linux2.4版本后,linux使用了NPTL作为自己的线程库,为了兼容POSIX标准,所以在内核task中有两个域tgid和tid,前者是进程id,后者是线程id。在linux上获得线程id的方法,目前我所知的有三种,当然这里的三种是指在用户态的程序中,否则除非自己写的kernel module, 都是调用编号224的系统调用实现的(2.6版本)。第一种: gettid(), man get原创 2008-09-06 14:30:00 · 10777 阅读 · 1 评论 -
[Pthread] 应用程序在linux上的执行过程
上次讲了如何从源文件得到可执行文件。这次聊聊可执行文件是如何在shell中被"执行"的。本文中尽可能少用一些源码,免得太过于无聊,主要讲清这个过程,感兴趣的可以去查看相应的源码了解更多的信息。1.父进程的行为: 复制,等待执行应用程序的方式有很多,从shell中执行是一种常见的情况。交互式shell是一个进程(所有的进程都由pid号为1的init进程fork得到,关于这个话题涉及到Linux启动和原创 2008-09-06 14:13:00 · 2239 阅读 · 0 评论 -
[Pthread] Linux上的Idle进程
当使用top等工具查看系统运行情况的时候,会知道当前(准确地说是过去的几秒钟内)处理器的利用率有多少。用户态占了多少,核心态占了多少,idle占了多少。我们通常把idle就视为系统空闲,但是这个"空闲"到底代表什么意思?接下来我们探讨一下。1. idle是什么 简单的说idle是一个进程,其pid号为0。其前身是系统创建的第一个进程,也是唯一一个没有通过fork()产生的进程。在smp系统中原创 2008-09-06 15:04:00 · 1900 阅读 · 0 评论