linux系统编程笔记
进程:起始于执行中的目标码,源于ELF中的可运行代码。由数据,资源,状态以及虚拟的计算机组成。
1.ELF中有多个数据段,比较常用的有text,data以及bbs段。这些段是会被加载进内存的线性块。
2.进程会设计由内核仲裁和管理的各种系统资源,通常进程只会通过系统调用来请求和操纵资源。(定时器,硬件等)
3.进程是计算机虚拟出来的对象。每个进程会被分配单一的线性地址空间。通过虚拟内存和页面调度机制可以支持多进程在系统中。
线程:每个进程由一个或多个线程所构成。线程是进程中的最小执行单位,负责执行代码以及维护进程的状态。
1.线程由stack,处理器的状态以及目标码中的当前位置组成。
2.多个线程共享一个进程的资源。
进程的层次结构->僵尸进程
进程->用户与组
每个进程的标识符PID都会对应一个UID(用户标识符),用来识别与当前进程关联的用户,称为进程的真实用户标识符。
信号:
信号是一种单向异步通信机制。支持进程间通信。
典型应用:分段错误->segmentaition fault 终端按下Ctrl+C
进程间通信:
linux内核采用的IPC机制:管道,命名管道,信号量,消息,共享内存以及快速用户空间互斥体。
空闲进程:没有其他可执行的进程内核会运行此进程,具有pid0。
取得进程以及父进程ID:getpid()和getppid();
运行一个新进程:
exec系列调用:
execl(): 将当前进程的映像替换成新的映像。
fork系统调用:创建一个新的进程来运行当前相同的映像。
fork +exec:
COW :copy on write (写入时才复制)
延迟优化策略:访问时获得资源的指针,写入时或者资源的副本。
终止一个进程:
exit(),SIGTERM,SIGKILL,内核杀掉,atexit()
等待已终止的子进程->僵尸进程
子进程的死亡时间先于父进程,会进入一个特殊的状态,保留一部分小的骨架,包含部分有用的数据,等待父进程来打听消息后才正式结束,若父进程一直没有打听,则变为僵尸进程。
启动并等待一个新进程:(同步进程的创建)->system
僵尸进程:见上
linux的调度策略与优先级:FIFO,轮转,普通,批处理调度,设定linux的调度策略
未完待续:
参考《linux系统编程》