1:进程与线程
进程是一个具有独立功能的程序的一次运行活动,是系统进行资源分配的一个基本单元。
线程是进程的一个实体,是cpu调度的基本单元,自己并不拥有系统资源,他的资源和该进程内的其他线程共享。、
引入线程的优点:
调度开销小,易于调度;
方便的实现并发;
充分利用多处理器的性能;
线程和进程的不同:
线程必定属于某个进程;但是一个进程可以拥有多个线程并且至少拥有一个线程。
不同进程互相独立,资源分开,但是线程共用资源,没有独立的内存空间。
进程是程序的一次执行,线程可以理解为该程序中一个片段的执行。
程序和进程和线程的关系:
独立功能的一次程序执行可以开启一个进程,同程序可以多次开启形成多个进程,每个进程中又可以开启线程,当然每个程序都至少会有一个线程,比如main
线程同步的方法:
互斥量,信号量,条件变量,临界区。
2:内核线程和用户线程
内核线程的建立和销毁都是操作系统负责,通过系统调用完成。
用户线程不需要操作系统负责,利用线程函数库调用完成创建销毁同步管理,并且允许自己定制自己的调度算法,调度的代价比内核线程的代价低很多。
3:内存管理
方式:按照控件利用率排序的话为:块式管理<页式管理<段式管理<段页式管理(其中段页式管理每次操作要访问三次内存)
分页和分段的区别:
页是信息的物理单位,分页是出于系统管理的需要
段式信息的逻辑段位,分段是为了满足用户的需要,每次分页的大小也取决于用户
虚拟内存:虚拟内存是内存管理的一种技术,相对于物理内存而言,可以理解为假内存,使得应用程序把内存当做连续可用,允许程序员编写比实际系统拥有的内存大得多的程序,实际上他的有一部分内存暂时存储于外部存储上面,在需要时在进行数据交换
虚拟内存的好处:
扩大地址空间
内存保护。每个进程独自运行在自己的虚拟内存空间,互相不干扰,而且虚拟内存还对特定的内存地址进行写保护。
当进程需要通信时,可以采用虚存共享的方式实现。
虚拟内存的坏处:
建立很多的数据结构,占用额外的内存。
虚拟地址到物理地址的转换,增加了执行时间。
页面的换入换出需要磁盘io。
内存碎片:多次进行内存分配时就会出现内存碎片。
内存格式:(用户使用段)(空白段)(用户使用段)
内碎片:分配给用户的存储空间(用户使用段)没有使用完,其他程序也无法使用的部分内存,直到进程释放。
外碎片:比如上面的空白段,他不属于任何进程,但是又由于他太小不足以给与下一个进程分配空间,造成了外碎片。
4:cache替换算法
数据可以存放在cpu和内存中,但是cpu处理速度快,容量小,内存容量大,但是转给cpu的速度慢。所以就需要cache来做一个折中,先从内存调入cache再从cache调入cpu,又由于主存的快比cache多所以从主存调块到chche中的时候,会出现该块映射的映射的cache已经被使用的情况,需要cache被迫腾出其中的某一块来接受新块,就需要替换。
随机算法(RAND)
先进先出算法(FIFO)
近期最少使用算法(LRU)
最优替换算法(OPT)
5:静态链接和动态链接
静态链接就是把要调用的函数或者是过程直接拷贝到可执行文件中,当多个程序都需要调用该函数的时候,比较浪费内存资源。
动态链接就是并没有在被调用时复制到可执行文件中,而是加入了一些重定位信息,当需要调用的时候到这里来执行就ok了。
静态链接库:.lib文件,里面不允许再包含其他的动态或者静态库
动态链接库:.dll文件
6:库函数调用与系统调用
库函数调用属于上层,运行在用户空间,属于程序和用户的一部分,不同的系统但是使用相同的库那么效果就是一样的。
系统调用是调用内核提供给应用程序的接口,属于系统的一部分,而且不同的系统的系统调用是不一样的。
7:用户栈和内核栈
内核在创建线程的时候,会为进程创建相应的堆栈,每个进程会有两个栈,一个用户栈,一个内核栈,当进程在用户空间时使用用户栈,在内核空间时使用内核栈。并且通过设置堆栈指针寄存器的内容可以在用户栈和内核栈之间相互转换。