理论详解
本身二进制程序是存在硬盘上的,表现是一个个的可执行文件。
“这个文件是什么?”
“是磁盘上的存储空间,是存储在指定存储空间中的数据。”
“文件名是什么?”
“是引用,引用存储空间中的数据”
对linux可执行程序来讲,它的二进制格式叫ELF
ELF通常指的是可以在CPU上自我直接启动起来,程序有可执行入口#!,包含CPU原生态指令和数据,这就是ELF格式。
程序=指令+数据
”shell脚本本身不是二进制,而是纯文本文件,那为什么也能够执行?“
“shell脚本前#!/bin/bash
指定了特定路经下的环境解释器”
进程的调度都是内核完成的,内核必须把(cpu)有限的资源分配给无限贪婪的进程上去,cpu切割成时间片,提供的计算能力是靠时间流逝完成的
内存是空间,区别于cpu时间片
/图1。|内核|用户|进程|
内存像硬盘一样,事先划分固定大小的内存块儿,内存页–页框(page frame)
/图二 | | | | |页框 | |
“每个进程最多能识别多大内存?”
“32位操作系统:4G”
“64位操作系统:4个4G”
注意,进程识别内存一般是虚拟内存比如4G,实际上物理内存只有512M,但对于每个进程都表现为4G的内存,1G用于内核,3G用于进程
/图三
”这一切管理工作由内核在背后进行,内核怎么知道哪一个进程使用哪一段地址空间?而且映射了哪一段地址空间,并且如何让内核快速追踪每一个进程,如何知道每个进程和内存之间的关系?“
“对于linux来说,所有用户空间中启动的进程除了init,都是由其父进程通过fork系统调用创建的。当子进程结束,父进程就会给它销毁。如果父进程比子进程先挂了,就用init销毁,init
是所有进程的父进程”
在内核中有一种机制,可以追踪所有进程,为每一个进程创建一个进程对象(内核是用c语言写的,在c中是struct数据结构),每个进程对象包含了自己的进程id、进程名字等等信息。因而内核相当于为进程创建了一个进程信息库,用于追踪计算机上所有的进程,知道每个进程在干什么。linux文件系统中/proc
目录是linux内核的伪文件系统,位于其目录下的都不是真正意义上的文件,它是内核信息的映射,包括进程等信息都在里面。
线程:一个进程内部有多个执行流。
cpu在某个时间点上只执行唯一的指令
如果只有一颗cpu,多线程并没有意义,只会使内核的管理更加麻烦
如果有多颗cpu,多颗cpu就能同时处理不同的指令,当系统指令非常多时,多线程能够充分利用多颗cpu工作,效率将大大提升
进程调度:内核的核心功能